读书笔记-容器深入理解

时间:2023-02-15 10:01:48



                                 本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!


         ArrayList底层是由数组支持,而LinkedList是由双向链表实现,因此插入或删除,LinkedList比较合适,查询则用ArrayList,HashSet是查询速度最快的,LinkedHashSet保持插入次序,TreeSet基于TreeMap,生成一个总是处于排序状态的Set。CopyOnWriteArrayList是List的一个实现,专门用于并发编程。


        专门用于并发编程的对象还有CopyOnWriteArraySet、ConcurrentMap、ConcurrentHashMap,三者都使用了避免ConcurrentModificationException的技术。另外还有常见的HashTable、Vector和StringBuffer,也是实现类似结构,而避免不同步的现象出现。


        对象通过hashCode方法生成的散列码,数组通过散列码找到对象,比较也是以一定规则对散列码进行比较;讲到这里,一个字符串,两者指向的对象一样,则散列码一样,则两者相等,其他对象也是,所以一般如果需要标识对象的不同,需要重写hashCode方法。


        HashTable的底层实现方式与HashMap一样,不过它采用安全同步方式存储;LinkedHashMap在插入时要慢一点,因为它维护散列数据结构的同时还要维护链表。Reference主要用来维护大数据,强弱依次如下,SoftReference、WeakReference、PhantomReference,而最后一个依赖于ReferenceQueue,用来回收前做清理工作。调用System.gc就可以将一部分不需要的内存回收。WeakHashMap用来保存WeakReference,允许垃圾回收器自动清理键和值,允许清理的触发条件:不再需要此键。

Java的I/O系统,I/O端源与接收端:文件、控制台、网络链接等,方式:顺序、随机读取、缓冲、二进制、按字符、按字等。File既能代表一个特定文件,又能代表目录下一组文件。InputStream中有ByteArrayInputStream、StringBufferInputStream、FileInputStream、PipedInputStream、SequenceInputStream、FilterInputStream,几乎都对应一个OutputStream。其中比较特殊的要属倒数第三个,作为多线程中数据源。


        RandomAccessFile适用于由大小已知的记录组成的文件,可用于读也可用于写。文件读写其实就是读取文件到内存,修改,然后再写出。Java1.4引入文件回销机制,允许我们同步访问某个作为共享资源的文件。FileLock对象通过FileOutputStream的channel来获取,其中两个概念,调用trylock与lock的不同:tryLock是非阻塞式的,它设法获取锁,如果不能获得,它将直接从方法调用返回;lock则是阻塞式的,它要阻塞进程直至锁可以获得或者调用lock的线程中断,或者调用lock的通道关闭,可以使用FileLock.relesse()释放锁。


       用Zip进行多文件保存时Adler32比CRC32快一些。序列化可以将一引起实现Serializable接口的对象转换成一个字节序列,并在后期可以进行恢复,实现RMI(Remote Method Invocation),实现:创建OutputStream对象,封装在ObjectOutputStream对象中,调用writeOjbect即可将对象序列化,反向过程只需将一个InputStream封装在OjbectInputStream内,然后调用readObject(),它不仅能保存自己,而且还会追踪对象内所包含的引用,并保存它们。当然如果不希望对象的某一部分被序列化或者一个对象被还原后,某子对象需要重新创建,从而不必将该子对象序列化,这样可以实现Externalizable接口,通过writeExternal和readExternal来将处理私密信息,不被一次性反序列化掉,从而从容的显示序列化。Serializable与transient关键字共用,来关闭不想公开的数据,如密码。

       最后,我们可以通过Preferences来保存小数据,就像Android中的SharedPreference一样,通过Preferences调用userNodeForPackage(className)或systemNodeForPackage,存储基本类型和字符串,长度不超过8k,放在合适的系统资源中,且随操作操作系统的不同而不同。


       枚举类型enum用来保存一组自己定义的值,一直跟switch一起应用,enumSet和enumMap分别用来处理enum的set和map集合。

       注解:把无数据与源代码结合在一起,由编译器来测试和验证格式,存储有关程序的额外信息。注解可以提供默认值、可以限定数据类型、初始化控件,不支持继承,apt来处理注解处理工具。它提供一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读。