zoukankan      html  css  js  c++  java
  • 读书笔记-容器深入理解



                                     本文来自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来处理注解处理工具。它提供一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读。


            





  • 相关阅读:
    大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础
    大数据技术之_16_Scala学习_03_运算符+程序流程控制
    大数据技术之_16_Scala学习_01_Scala 语言概述
    通过创建一个简单的骰子游戏来探究 Python
    在Linux系统中创建SSH服务器别名
    DNS原理及劫持问题
    详细介绍:Kubernetes1.4版本的新功能
    Linux系统中五款好用的日志分析工具
    wc命令——Linux系统高效数据统计工具
    Linux系统内核正式进入5.0版本时代
  • 原文地址:https://www.cnblogs.com/fengju/p/6174433.html
Copyright © 2011-2022 走看看