`

17.容器的深入研究

JVM 
阅读更多

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前加入引用队列。
  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics