Java 各种map tree 。。

比如什么HashMap,HashTable,TreeMap,LinkHashMap,ConcurrentHashMap,hashCode,HashSet,TreeSet。。LinkHashSet这tm的秀的我头晕。。。

一个一个讲,,首先是Hashmap,,我跑了下代码,确定了它是无序访问的。。。然后找了以前的博客,发现实现是基于数组+链表的。。然而jdk1.8已经加入了红黑树。它大概是什么思想呢,,其实就是搞一个唯一的编号(也就是哈希的思想,,用hashCode来搞一个唯一编号),来实现快速访问。就是把key拿去映射value。。。不过当加的东西多了,会有重复的hashCode,这时候每一个相同的hashCode用一个单链表维护。。然而单链表很长的时候,,复杂度就变得不可接受了(O(n))。。这时候红黑树就来了,,当链表长度大于8时,用红黑树维护。。这样复杂度只有log(n)。红黑树这玩意的原理我会慢慢搞懂的。。性能和初始容量和负载因子有关。。负载因子=0.75  初始 16。

然后是HashTalbe这玩意,,,貌似功能和HashMap差不多,,然而它是线程安全的,,而HashMap是线程不安全的。。原因就是这玩意的方法加了Synchronize关键字。。这就保证了它会拿到对象锁。。

LinkHashMap是HashMap的儿子。。它是保存了插入顺序的,,所以可以按顺序遍历。

TreeMap貌似就是c++里面的map。。按key值自动升序。。。。

ConcurrentHashMap貌似就是升级版本的HashTalbe 原理待补,,反正使用它而不用HashTable就对了。。

HashSet,,不能放重复元素,,也是无序访问。去重底层是通过map里面的key比较大小(也就是等于0的时候放在同一个位置)实现的。

LinkHashSet 不能放重复元素,顺序访问。

TreeSet   去重并且排序 ,也就是c++里面的set容器。


版权声明:本文为sky_miange原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。