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