浅谈java集合框架

浅谈java集合框架

集合中存放的永远是对象的引用而不是对象本身。


1 ArrayList其实底层就是采用数组来实现的,当使用不带参数的构造方法创建ArrayList对象时,实际上会在底层生成一个长度为10的Object类型的数组。如果增加的元素的个数超过了10个,那么ArrayList底层会生成一个新的数组,长度为原数组的1.5倍+1,然后将原数组复制到新的数组当中去。
2 对于ArrayList的元素操作来说,可想而知效率不高,对于每个元素的删除它后续的元素都得向前移动,因为底层是数组来维护的嘛。
3 对于LinkedList而言,底层采用双向链表实现。当我们往LinkedList中添加对象时,实际上在LinkedList内部会生成一个Entry对象,该对象结构为:
Entry{
Entry previous;       //前一个节点的引用
Object element; //放入的对象
Entry next  ; //后一个节点的引用
}
其中的Object元素就是我们向LinkedList中添加的元素,然后Entry又构造好了向前和向后的引用previous、next,然后将生成的这个Entry对象加入到链表当中。换句话说,LinkedList中所维护的是一个个Entry对象。
4 LinkedList是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。对于增加和删除操作来说效率很高
5 ArrayList与LinkedList的比较
1)ArrayList底层采用数组来实现的 ,LinkedList底层采用双向链表来实现的。
2)当执行插入和删除操作来说,LinkedList的效率要不ArrayList要高
3)当执行查找操作来说ArrayList的效率要高
4)两者都不是线程安全的,如果多个线程同时访问一个List,则必须自己实现访问同步 。
如:List list = Collections.synchronizedList(new LinkedList(…)); synchronizedList底层就是使用了synchronized关键字。其实没什么特别的,加上同步锁即可
synchronized(list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }

6   HashSet与HashMap
1)HashSet底层其实就是HashMap来实现的。当使用add方法将对象添加到Set当中 时,实际上是将该对象作为底层所维护的Map对象的key,而value则是同一个Object
private static final Object PRESENT = new Object();
这就是为什么HashSet中存放的元素不能重复

2)HashMap底层维护的是一个数组,当向HashMap中put一个对象时,首先会根据 key的hashCode值来计算出一个位置,该位置就是此对象准备往数组中存放的位置。如果该位置没有对象存在时,就将此对象放进数组当中去。如果该位置已经存在对象,则顺着此存在对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向该对象的下一个对象),如果此链上有对象的话,再去使用equals方法进行比较,如果此链上的某个对象的equals方法为false,则将该对象放到数组当中去,然后将数组当中该位置以前存在的那个对象连接到此对象的后面。否则不进行处理。

3)Map的keySet()方法返回key的集合,因为Map的键是不能重复的,因此keySet ()方法返回的类型Set;而Map的值是可以重复的,因此values()方法返回的类 型是Collection,可以容纳重复的元素

7 HashMap与HashTable比较
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

 

你可能感兴趣的:(Collections,ArrayList,LinkedList)