集合框架总结
List
1、创建对象:由于List为接口,所以只能new一个该接口的实现类
List<Object> list1=new ArrayList<Object>();
List<Object> list2=new LinkedList<Object>();
List<Object> list3=new Vector<Object>();
ArrayList、LinkedList、Vector的区别?
ArrayList源码:
publicboolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; returntrue; }
|
LinkedList源码:
publicboolean add(E e) { addBefore(e, header); returntrue; }
|
Vector源码:
publicsynchronizedboolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; returntrue; } |
由上可知,ArrayList和Vector是采用数组方式存储数据(elementData[s ize++] = e),此数组元素总数大于实际存储的数据个数以便增加和插入元素。二者都允许直接序号索引元素,但是插入数据要移动数组元素等内存操作,所以它们索引数据快、插入数据慢。Vector由于使用了synchronized同步方法,因此是线程安全,性能上比ArrayList要差。LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
2、特点:有序、允许元素重复出现、允许使用 null 元素
publicclass ListTest { publicstaticvoid main(String[] args){ //创建List对象 List<Object> list=new ArrayList<Object>(); //向队列添加元素 list.add(null); list.add(1); list.add(1); list.add("a"); list.add(2,2); //输出队列元素 for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+" "); } //删除元素 list1.remove(1); //输出队列元素 System.out.println(); for(int i=0;i<list1.size();i++){ System.out.print(list1.get(i)+" "); } } } |
输出:null 1 2 1 a
null 2 1 a
Map
1、创建对象:由于Map为接口,所以只能new一个该接口的实现类
Map<Object,Object> map1=new HashMap<Object,Object>();
Map<Object,Object> map2=new TreeMap<Object,Object>();
Map<Object,Object> map3=new LinkedHashMap<Object,Object>();
HashMap、TreeMap与LinkedHashMap的区别?
源码分析:
HashMap源码分析:
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k=e.key)==key||key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); returnnull; } |
根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMap:
publicclass LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>由此可知,LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序。
TreeMap其中两个构造函数的源码:
public TreeMap() { comparator = null; } public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; }
|
由上可知,comparator一个用于对集合对象或数组对象排序的比较器,TreeMap实际是默认按照升序排列的,也可以指定排序的比较器,遍历的时候按升序遍历。
2、 特点:通过键值对存储数据,键不能重复、值可重复、允许使用 null 元素
publicclass MapTest { publicstaticvoid main(String[] args){ //创建对象 Map<Object,Object> map1=new HashMap<Object,Object>(); //添加元素 map1.put(0, 1); map1.put(1, 1); map1.put(2, null); map1.put(3, "a"); map1.put(3, "b"); //取出元素 for(int i=0;i<map1.size();i++){ System.out.print(map1.get(i)+" "); } //删除元素 map1.remove(3); //输出元素 System.out.println(); for(int i=0;i<map1.size();i++){ System.out.print(map1.get(i)+" "); } } }
|
输出结果:1 1 null b
1 1 null
Set
1、创建对象:由于Set为接口,所以只能new一个该接口的实现类
Set<Object> set1=new HashSet<Object>();
Set<Object> set2=new TreeSet<Object>();
HashSet和TreeSet的区别?
HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的。
public HashSet() { map = new HashMap<E,Object>(); } public TreeSet() { this(new TreeMap<E,Object>()); }
|
HashSet是无序输出的,而TreeSet是按照升序输出的。在TreeSet中不能出现null值并且不同类型的也不能添加在同一个TreeSet中。
例子如下:
publicclass SetTest { publicstaticvoid main(String[] args){ //创建Set对象 HashSet<Object> set1=new HashSet<Object>(); TreeSet<Object> set2=new TreeSet<Object>(); //向队列添加元素 set1.add(1); set1.add(1); set1.add(null); set1.add("a"); set1.add("b"); set2.add("a"); set2.add("a"); //set2.add(null); set2.add("c"); set2.add("d"); Iterator<Object> iterator1=set1.iterator(); Iterator<Object> iterator2=set2.iterator(); //取出元素 while(iterator1.hasNext()){ System.out.print(iterator1.next()+" "); } System.out.println(); while(iterator2.hasNext()){ System.out.print(iterator2.next()+" "); } } }
|
输出结果为:null 1 b a
a c d
2、无序、无重复元素、允许使用 null 元素
publicclass SetTest { publicstaticvoid main(String[] args){ //创建Set对象 Set<Object> set=new HashSet<Object>(); //添加元素 set.add(1); set.add(1); set.add(null); set.add("a"); set.add("b"); Iterator<Object> iterator=set.iterator(); //取出元素 while(iterator1.hasNext()){ System.out.print(iterator1.next()+" "); } //删除元素 set1.remove("b"); Iterator<Object> iterator2=set1.iterator(); //取出元素 System.out.println(); while(iterator2.hasNext()){ System.out.print(iterator2.next()+" "); } } } |
输出结果:null 1 b a
null 1 a
注意:1、因为set是无序的,所以需先创建一个迭代器,从而进行元素的迭代输出元素
2、当Iterator<Object> iterator=set.iterator()语句写在set.add(1)前时,则无输出。
3、一些集合操作会修改原始集合,比如addAll,retainAll,removeAll。尤其是你要重复操作原始集合的时候,一定要新建一个集合,HashSet<Object> set2=new HashSet < Object>,然后用set2.RemoveAll(Set1)。