Java SE - jwyx/ForFun GitHub Wiki

Container

Collection:各自独立的对象
    ArrayList
        ArrayList实现接口List,List继承接口Collection
        使用Array实现,快速随机进入
    LinkedList
        实现接口List,适合做Queue和Stack
        适合插入和删除
        java.util.Queue
    HashSet
        实现Set接口,Set继承接口Collection
        Set容器中对象都是唯一的,加入Set容器中的对象都必须重新定义equals()方法,作为唯一性标识
        HashSet排序规则利用Hash Table,必须重新定义hashCode(),比较相同,先比较hashCode(),如果相同再比较equals()
        历遍的顺序是HashSet排序过后的顺序
        LinkedHashSet是HashSet的子类,在内部使用Hash Code进行排序,然而允许在历遍时行为像LinkedList,即历遍的顺序是加入时的顺序
    TreeSet
        实现Set和SortedSet接口
        TreeSet是J2SE中唯一实现SortedSet接口的类,使用红黑树
        默认按字典顺序排序
    EnumSet

Map:成对的key-value对象
    HashMap
        实现Map接口,内部实现是使用Hash Table
        values()返回一个Collection对象
        如果希望按照插入顺序输出,使用LinkedHashMap,是HashMap的子类
    TreeMap
        实现Map和SortedMap接口
        是J2SE中唯一实现SortedMap接口的类,用红黑树
        对于String,结果按照字典顺序排序
    EnumMap
        根据枚举的顺序来维护对象的排列顺序

IO

文件处理
    File(File parent, String child)
    File(String pathname)
    File(String parent, String child)
    File(URI uri)

    顺序存取 File
    随机存取 RandomAccessFile; seek(), 单位是byte

Byte Stream
    InputStream
        换行字符: Windows "\r\n", Linux '\n', Mac '\r'
    OutputStream

    FileInputStream
        是InputStream的子类,读入文件内容
    FileOutputStream
        是OutputStream的子类,写入数据到文件
    标准输入输出流对象在程序一开始是就开启,但是文件输入输出流按需开启


    BufferedInputStream
        提供数据读入缓冲区,缓冲区为byte数组,默认为2048,尽量将buf填满,buf不足时才会从文件中提取数据
    BufferedOutputStream
        提供数据写出缓冲区,缓冲区为byte数组,默认为512,先将数据写入buf,当buf已满时才写入目的流
    为了确保buf中的数据一定被写出,建议最后执行flush()将缓冲区中的资料全部写出到目的流
    BufferedInputStream和BufferedOutputStream并没有改变InputStream和OutputStream的行为,只是添加了缓冲功能

    DataInputStream
        提供对Java基本类型的写入
    DataOutputStream
        提供对Java基本类型的写出

    ObjectInputStream
    ObjectOutputStream
        要被存储的对象必须实现Serializable接口,其实Serializable中并没有规定任何必须实现的方法,其实是添加
        一个标签,代表对象是可以序列化的

        private static final long serialVersionUID = 1L; // 代表可序列化对象的版本

        如果没有提供这个信息,会自动依类名,实现的接口,成员等产生,下次更改类时,serialVersionUID也会变化;
        当反序列化时两个serialVersionUID不相同的话,就会丢出InvalidClassException,如果想要维持版本信息必须
        显式声明serialVersionUID。

        在将对象追加到一个先前已经写入对象的文件中,如果一个文件中被多次追加对象,那么文件中会有多个标识符,
        而读取文件时会检查这个标识符,如果一个文件被多次追加对象,那么这个文件中会有多个标识符,如此读取检查时
        就会发现不一致,这会丢出StreamCorrupedException,为此必须重新定义ObjectOutputStream的writeStreamHeader()
        方法。
        E.g.
            ObjectOutputStream objOutputStream =
                new ObjectOutputStream(new FileOutputStream(file, true)) {
                  protected void writeStreamHeader() throws IOException { }
                };

    SequenceInputStream
        将一个文件分割和组合成原来的文件
        数个InputStream的组合,当一个InputStream对象的内容读取完毕后,会读取下一个InputStream对象

    PrintStream
        自动进行字符转换,会使用操作系统的默认编码来处理对应的字符转换动作,存储为纯文本文件,而不是二进制文件
        纯文本文件是指存储结果经过字符转换

    ByteArrayInputStream
    ByteArrayOutputStream

    PushbackInputStream
        拥有一个Pushback缓冲区,只要Pushback缓冲区没有满,就可以使用unread()将资料回推到串流的前端


Character Stream
    Reader, Writer等是处理字符串相关的类别,简单的说,就是对串流数据以一个字符(16 bit)的长度为单位来处理
    (0~65535, 0x0000~0xffff),进行适当的字符转换处理

    Reader, Writer支持Unicode标准字符集(byte串流只支持ISO-Latin-1 8-bit),处理串流时,会根据系统预设的字符编码
    来进行字符转换,它们是抽象类

    InputStreamReader
    OutputStreamReader
        自动判断字符编码
        存取时以系统的默认字符编码进行字符转换,也可以自行制定字符编码

    FileReader
    FileWriter
        继承于InputStreamReader和OutputStreamWriter
        可以直接指定文件名称或File对象来开启指定的文本文件,并读入串流转换后的字符,字符的转换会根据系统默认的编码,
        若要指定编码,则还是使用InputStreamReader和OutputStreamWriter

    BufferedReader
    BufferedWriter
        缓冲区的大小为8192个字符

    PrintWriter

    CharArrayReader
    CharArrayWriter
        将字符串作为输入输出的来源

        通常很少会对文本文件进行随机存取,因为为了和ASCII相同,一个文本文件可能会有ASCII与2 bytes的字符,也就是说
        每个字符的长度不一定相同,所有对文本文件进行随机存储容易发生错误

        但是Java的Char是Unicode字符,所有将文本文件的内容读入字符数组,对字符数组做随机存取,然后将它写回文件,
        这样可以达到文本文件随机存储的功能

Thread

在Java中实现Thread,可以实现Runnable接口,其中只定义一个run()方法,,然后实例化一个Thread对象,
传入一个实现Runnable接口的对象作为参数

也可以继承Thread类并重新定义它的run,好处就是可以使用Thread上的一些继承下来的方法,坏处就是不能再继承其他的类型

Daemon Thread: 一个在后台运行的线程,如果所有的非Daemon线程都结束了,那么Daemon也自动终止
E.g. thread.setDaemon(true);
Java默认所有从Daemon线程产生的线程也是Daemon线程。

Thread lifecycle (4 Phases)
    New
    Dead
    Runnable
    Not Runnable