17.容器的深入研究
1.填充容器
? List<String> list = new ArrayList<String>(Collections.nCopies(4,new String("Hello")));
? 填充了四个的指向同一对象的引用。
? Collections.fill(list,new String("Hello"));
? fill的功能更为有限,只能替换List中存在的元素,不能添加新的元素。
2.HashSet 以某种神秘的顺序保存元素,TreeSet则保持有序降序,LinkedHashSet既保持速度,维护了插入的次序。
? SortedSet保证处于排序状态,且具有返回第一个,最后一个,及其子集的功能。
3.Map
? 目前TreeMap是sortedMap的唯一实现,基于红黑树。
? LinkedHashMap遍历时取得的是插入顺序,或者是最近最少使用次序。比HashMap慢一点,因为要维护链表内部次序。
4.为了速度而散列
? 线性查询是最慢的查询。
? 散列的价值在于速度,瓶颈在于键的查询速度,唯一的解决方案是保持键的排序状态,然后用二分查找键。
? 将键存在哪才能很快的找到,数组最快,但是数组不能调整容量,所以数组不保存键本身,保存键对象生成的数字-散列码
? 作为数组的下标。由于数组固定,任何键总能在数组找到自己的位置,所以有可能产生冲突。冲突由外部链接处理,数组并
? 不直接保存值,而是保存值的list,对list中值使用equal()线性查询,这部分较慢,如果散列函数好的话,数组每个位置
? 只有少量的值,可以迅速的找出来。这是HashMap快的原因。
5.hashCode()
? String [] hellos = "Hello Hello".split(" ");
? hellos[0].hashCode()和hellos[1].hashCode()相等;
? 散列码不必是独一无二,好的散列码应该分布均匀。
6. 持有引用
? 如果一个大的对象放在内存中,普通引用的话,只要引用在,这块内存一直不被释放,而这种引用,当内存紧张时可以释放内存
? ,需要时如果大对象被清除,返回null,这个时候加入其它逻辑,在读入大对象。
? 软应用(SoftReference)
? 如果一个对象被软引用,那么它占得内存可有可无。如果内存不足时才回收。可用来实现内存敏感的高速缓存。
? 弱引用(WeakReference)
? 和软引用区别是:一旦被发现,无论内存是否足够,够将被回收。不过,垃圾回收器是一个优先级很低的线程,不一定会很快发现
? 弱引用。
? 软应用和弱引用都可以和一个引用队列(ReferenceQueue)联合使用,如果被gc,jvm就会把这两引用加到与之关联的引用队列中。
? 虚引用(PhantomReference)
? 形同虚设,任何时候都可以被gc,必须和引用队列(ReferenceQueue)联合使用,区别是在gc前加入引用队列。
??