本文共 2339 字,大约阅读时间需要 7 分钟。
平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我。 跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信公众号【 IT特靠谱 】,你将会发现新大陆!(1)可以允许重复的对象;
(2)可以插入多个null元素; (3)是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序; (4)常用的实现类有ArrayList,LinkedList和Vector。ArrayList提供了使用索引的随意访问,底层结构是数组,优查询劣增删;而LinkedList经常用于添加或删除元素的场合,底层结构是链表。(1)不允许重复的对象;
(2) 无序容器,你无法保证每个元素的存储顺序。TreeSet通过Conparator或者Comparable维护了一个排序顺序; (3)只允许一个null元素; (4)Set常用的实现类是HashSet,LinkedHashSet以及TreeSet。最流行的是基于HashMap实现的;HashSet,TreeSet还实现了SortedSet接口,因此TreeSet是一个根据其compare()和compareTo()的进行排序的有序容器。(1)Map不是collection的子接口或者实现类,Map是一个接口;
(2)HashMap底层是数据+链表的组成,是无序的,通过hashCode()方法计算索引值后再存储或查找元素;链表长度大于8时转换成数组+红黑树结构; (3)Map的每个Entry都持有俩个对象,一个键一个值,可能会持有相同的值对象但键对象必须是唯一的; (4)TreeMap也通过Comparator或者Comparable维护了一个排序顺序; (5)Map里你可以拥有任意个null的value值,但只能有一个null的key键; (6)常用的实现类HashMap,LinkedHashMap,Hashtable,TreeMap。说明1:HashSet底层是HashMap实现的!
hashSet.add(添加的对象)和hashMap.add(添加的对象)方法添加的对象必须保证如下3点规则,否则可能导致保存的对象重复: (1)相同对象的hashCode()计算值相等; (2)相同对象的equals()计算值相等; (3)不同对象的hashCode()计算值可能相等,但是equals()计算值一定不相等! 说明2: HashMap底层是数组+链表或数组+红黑树数据结构 HashMap底层是数组+链表或数组+红黑树数据结构,key键的hash值可以算出node的存储数组位置!如果多个node存放到相同数组位置,那么就通过链表的方式存储,如果链表长度大于8,自动转换成红黑树的存储结构。因此我们要尽量避免链表长度过长或红黑树,因为put和get的效率相对较低!3.1 HashMap的put(“key”,“value”)方法底层分析
(1)首先根据key生成key键的hash值,根据一些列运算获取存放该键值对的数组的索引index; (2)根据index从数组中定位到指定位置,如果指定位置已经存在值了,那么equals(key)计算key键是否相等,如果相等,那么用新的值覆盖旧的值;如果指定位置没有值,那么直接插入新值! (3)如果不同的对象的key的hash值相同(称为hash碰撞或hash冲突),那么计算的索引也是一样的,那么在数组相同位置会存放2个或多个值,这时候链表结构解决了这个问题!3.2 HashMap的get(“key”)方法底层分析
(1)首先根据key生成key键的hash值,根据一些列运算获取存放该键值对的数组的索引index; (2)根据index从数组中定位到指定位置,如果指定位置没有值,那么返回的值为null;如果指定位置有值(无链表,有且只有一个值)那么直接返回该值;如果指定位置是链表,那么再根据key的equals(key)方法来获取链表中我们想要的那个值!上面的put和get都是先比较key的hash值是否相同,再通过equals()方法比较key是否相同!所以当我们重写某个类的equals()方法的时候,切记一定要重写其hashCode()方法!
也就是说HashMap必须要保证:转载地址:http://nupgf.baihongyu.com/