Java编程思想学习笔记——容器深入、I/O系统

1. 遍历Map用Entry类比较方便。

2. 用Arrays.asList()方法可将一个数组转化为List,但对于该转换得来的List,任何会改变其长度的操作都将抛UnsupportedOperationException。

3. Set接口的三种实现,HashSet(其元素必须实现hashCode);TreeSet(其元素必须实现Comparable接口);LinkedHashSet(其元素实现了hashCode()且元素按插入顺序排列);其中TreeSet实现了SortedSet接口,它按对象的比较函数对元素排序。

4. PriorityQueue要求加入其中的元素实现Comparable接口,并实现其compareTo()方法,根据返回值+1,0,-1来决定优先权大小。

5. 有些容器是专门用于同步的,如ConcurrentHashMap,而对于一般容器,也可以使用Collection中的静态方法synchronizedList等使之可用于同步,非用于同步的窗口在遇到多线程修改同一容器并可能造成冲突时快速报错:ConcurrentModificationException.

6. 有三个继承自抽象类Reference的类,SoftReference,WeakReference,PhantomReference。这些引用由强到弱排列,在GC工作时,空间不够会考虑将这样的引用所指对象释放掉(如果没有其它非Reference类型的引用指向它)。一般较占内存的大图片等可采用这种引用处理。WeakHashMap便支持这种引用。

7. 如果想要高效地存储大量“开/关”信息,BitSet是很好的选择,这里高效主要指针对空间而言,时间上并不及本地数组,它最小长度是64位。

8. 最好不用老的(1.5之前)容器类,除非是某些特殊的需要如维护旧代码。

9. Comparable是个接口,要求某个类实现它,并实现它的的compareTo方法,返回0,-1,+1等值。此时,实现类是比较的对象之一。Comparator接口位于java.util下,相当于一个工具,不属于任何对象,它类似于过程,其两个为:int compare(T o1,T  o2)和boolean equals(Object obj)。Comparator一般不与具体的类绑定,而是用一个专有类实现它,实现类本身不参与比较。

10. 实现FilenameFilter接口,可以用正则表达式来寻找符合条件的文件或目录。用正则表达式表示条件。

11. Java的I/O使用了装饰器模式,基本的输入输出流为InputStream/OutputStream。很多其它与I/O有关的类都是从它们继承而来。不同的继承类增加了一些不同的功能(装饰),比如缓冲,记住输入行号,从文件输入/出等。这给我们写程序提供了很大的灵活,可以稍加组合就写出自己需要的工具类,但也使得使用I/O类库稍显复杂。因为即使只想一个简单的操作也要用到多个类。

12.  Reader与Writer与InputStream/OutputStream对应,但其提供对兼容Unicode和面向字符的I/O功能,主要为提供对国际化的更好支持,并不会取代InputStream/OutputStream。后者在字节形式的I/O操作中仍很有价值。并且在Java1.1中往这两个类中添加了一些新类,可用适配器InputStreamReader将InputStream转换为Reader。

13. RandomAccessFile类独立于InputStream/OutputStream,与之无关,其大多数(不是全部)功能在jdk1.4以后可由nio中的存储映射文件功能取代。

14. 如果需要在Java中执行操作系统的其它应用程序并且控制它们的输入输出,Java类库提供了执行这些操作的类java.lang.ProcessBuilder。

15. 内存映射文件允许我们创建和修改那些因为太大而不能放入内存中的文件。有了内存映射文件,便可以假定整个文件都在内存中,作为一个非常大的数组来访问。由RandomAccessFile的getChanel获得通道,然后再调用map映射到文件的指定位置。这用到了底层操作系统的文件映射工具。

16. java1.4引入了对文件的加锁机制,由Chanel中的方法tryLock或lock实现,它们可以对整个文件或文件的一部分加锁。其中tryLock是非阻塞式的,lock是阻塞式的。

17. java.util.zip包提供了对文件(或其它任何流)进行压缩的类。只需要将对应的输入/出流封装成GZIPInputStream等压缩流即可,其它的读写流操作不需要改变。用Zip保存文件时,会有一些写文件注释及档案文件的操作等。

18. 对象序列化即将那些实现了Serializable接口的类的对象转换成一个字节序列,并能在以后将此字节序列完成恢复成对象。对象序列化主要为支持RMI及javaBean的保存,更复杂的序列化可用数据库。

19. 如果不需要序列化时,一个对象的成员递归地序列化,可实现Externalizable代替Serializable接口。而如果想某个字段不进行序列化,则用transient关键字修饰该字段,如:private transient String passwd;这个关键字只能与Serializable接口一起用。因为Externalizble不序列化任何成员。

20. ASCII一个字节表示一个字符,Unicode两个字节表示一个字符。UTF-8是Unicode的一种变长字符编码。其它格式有UTF-7,UTF-7.5,UTF-16,UTF-32等。

21. HashMap与HashTable的区别与联系:

都是Map的实现类,HashTable是老版本。

HashMap速度更快,允许一个null键及若干null值,HashTable不允许。

HashTable慢,因其是同步的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值