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


            





  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/fengju/p/6174433.html
Copyright © 2011-2022 走看看