读书笔记-容器深入理解
2014-01-20 19:40
176 查看
本文来自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来处理注解处理工具。它提供一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读。
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来处理注解处理工具。它提供一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读。
相关文章推荐
- 读书笔记-容器深入理解
- 读书笔记-容器深入理解
- 【读书笔记】【深入理解ES6】#9-JavaScript中的类
- 深入理解Java虚拟机 -- 读书笔记(3):几种垃圾收集器
- 【容器】深入理解HashMap原理
- 深入理解容器系列片之三--------LinkedList、Stack、Queue、PriorityQueue的总结
- 深入理解Yii2.0 » Yii 模式 » 依赖注入和依赖注入容器
- 深入理解容器系列片之五--------hashcode和equal
- spring Ioc 容器深入理解<一>
- [李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--SAPI概述-1
- [李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--PHP脚本的执行
- [李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--opcode处理函数查找
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--静态变量
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的赋值和销毁
- Spring4深入理解IOC&DI03----Bean配置--SpEL,IOC 容器中 Bean 的生命周期
- 深入理解Java之《突破程序员基本功》之面向对象 ---------读书笔记------持续更新
- 深入理解Spring的IOC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解Java 虚拟机读书笔记--第三章 垃圾收集器与内存分配策略
- 深入理解Tomcat系列之四:Engine和Host容器