集合:
1.ArrayList的实现原理: ArrayList实现List接口、底层使用数组保存所有元素,每次数组容量的增长大约是其原容量的1.5倍,数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,这种做法代价是很高的. Vector和ArrayList差不多,就是线程是安全的
原文:http://www.cnblogs.com/batys/archive/2011/11/02/2233597.html
2.LinkList原理:
LinkedList属于一个双向循环的链表,其内部是用一个Entry来维护的,Entry中就包含链表的三个属性,previous、next、element,相对于ArrayList来说,普遍认为对数据的修改频繁时最好使用 LinkedList,但是我们发现针对LinkedList要移除某个元素时,发现其效率也并不见得非常的高,因为其中还涉及到一个查询的操作
原文:http://blog.csdn.net/csh624366188/article/details/6896656
2.HashMap的实现原理:
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
当HashMap数组达到数组长度的0.75时,长度就会倍增
根据 put 方法的源代码可以看出,当程序试图将一个 key-value 对放入 HashMap 中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但 key 不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且
新添加的 Entry 位于 Entry 链的头部
——具体说明继续看 addEntry() 方法的说明。 (
两个图,后图是补充的,更清晰直观
)
3.HashSet的实现:
LinkedHashSet(); //保持元素的添加顺序
HashSet();//自动排序,与添加顺序无关
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,但不可重复
HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
- // 将指定元素放入 HashSet 中,也就是将该元素作为 key 放入 HashMap
- //当然key不能重复,所以hashset不能添加重复值
- public boolean add(E e)
- {
- return map.put(e, PRESENT) == null;
- }
转载自:http://blog.sina.com.cn/s/blog_9eaf28f90101hl9f.html