目录
一、集合大纲
二、List
1.ArrayList
2.LinkedList
3.Vector
三、Set
1.HashSet
2.TreeSet
3.LinkedHashSet
四、Map
1.HashMap
2.Hashtable
3.TreeMap
五、总结
这里只总结常被提及的相关集合:
ArrayList、LinkedList、Vector、HashSet、TreeSet、LinkedHashSet、HashMap、Hashtable、TreeMap
│——-List
│—————-├ LinkedList
│—————-├ ArrayList
│—————-└ Vector
│——-Set
│—————-├ HashSet
│—————-├ TreeSet
│————————└ LinkedHashSet
│——-Map
│—————-├ HashMap
│—————-├ Hashtable
│—————-└ TreeMap
List接口实现类:有序(按元素进入的先后顺序存储)、可重复存储元素
// ArrayList:底层数据结构是数组结构(动态数组)、线程不安全、可存储null数据
ArrayList arrayList = new ArrayList();
arrayList.add("qwer");
arrayList.add("asdf");
arrayList.add("zxcv");
arrayList.add("zxcv");
arrayList.add(null);
System.out.println("arrayList:" + arrayList);
// LinkedList:底层数据结构是链表结构、线程不安全、可存储null数据
LinkedList linkedList = new LinkedList();
linkedList.add("qwer");
linkedList.add("asdf");
linkedList.add("zxcv");
linkedList.add("zxcv");
linkedList.add(null);
System.out.println("linkedList:" + linkedList);
// Vector: 底层数据结构是数组结构、线程安全、可存储null数据
Vector vector = new Vector();
vector.add("qwer");
vector.add("asdf");
vector.add("zxcv");
vector.add("zxcv");
vector.add(null);
System.out.println("vector:" + vector);
其它比较(实际是算法结构的比较):
ArrayList比LinkedList查询效率高:因为数组是有下标的,通过下标直接定位到数据,链表查询只能从第一个数据开始,顺着指针向下查找
LinkedList比ArrayList增删效率高:链表某一个数据改动,只需要改变极少的数据指针指向,数组改动一个数据,从当前数据往后的所有数据都会有所变动
Vector与ArrayList非常相似,但是Vector是同步的(线程安全的动态数组)
Set接口实现类:无序或有序(比如treeSet按自然顺序/定制排序、LinkedHashSet按元素进入先后顺序)、不可重复存储元素
// HashSet:底层数据结构是哈希表、线程不安全、可存储null数据
HashSet hashSet = new HashSet();
hashSet.add("qwer");
hashSet.add("asdf");
hashSet.add("zxcv");
hashSet.add("zxcv");
hashSet.add(null);
System.out.println("hashSet:" + hashSet);
// TreeSet:底层数据结构是二叉树、线程不安全、不可存储null数据
TreeSet treeSet = new TreeSet();
treeSet.add("qwer");
treeSet.add("asdf");
treeSet.add("zxcv");
treeSet.add("zxcv");
// treeSet.add(null);
System.out.println("treeSet:" + treeSet);
// LinkedHashSet:底层数据结构是链表+哈希表、线程不安全、可存储null数据
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add("qwer");
linkedHashSet.add("asdf");
linkedHashSet.add("zxcv");
linkedHashSet.add("zxcv");
linkedHashSet.add(null);
System.out.println("linkedHashSet:" + linkedHashSet);
其它比较:
HashSet可存null元素,TreeSet不可以
TreeSet自然排序/定制排序
如果元素要存储到HashSet中,必须覆盖hashCode方法和equals方法(HashSet通过对象的hashCode和equals方法来完成对象唯一性的判断)
如果元素要存储到TreeSet中,必须实现Comparable接口(TreeSet判断两个对象是否相同的方法是Comparable接口中的compareTo()方法)
一般数据来说,哈希表的性能是较优的,但如果大量数据存储,可能会出现哈希冲突
LinkedHashSet继承了HashSet,又使用了链表来维持元素的顺序,综合来看,LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet
Map用于保存具有映射关系(键值对)的数据,key不能重复
// HashMap:底层数据结构是哈希表、线程不安全、key-value可为null
HashMap hashMap = new HashMap();
hashMap.put("qwer", "1");
hashMap.put("asdf", "1");
hashMap.put("zxvc", "1");
hashMap.put("zxvc", "1");
hashMap.put(null, null);
System.out.println("hashMap:" + hashMap);
// Hashtable:底层数据结构是哈希表、线程安全、key-value不可以为null
Hashtable hashtable = new Hashtable();
hashtable.put("qwer", "1");
hashtable.put("asdf", "1");
hashtable.put("zxcv", "1");
hashtable.put("zxcv", "1");
// hashtable.put(null, null);
// hashtable.put("0", null);
System.out.println("hashtable:" + hashtable);
// TreeMap:底层数据结构是红黑树、线程不安全、key不可以为null、value可以为null
TreeMap treeMap = new TreeMap();
treeMap.put("qewr", "a");
treeMap.put("asdf", "b");
treeMap.put("zxcv", "c");
treeMap.put("zxcv", "c");
// hashtable.put(null, null);
treeMap.put("0", null);
System.out.println("treeMap:" + treeMap);
其它比较:
Hashtable线程安全,效率较低
如果元素(key)要存储到HashMap中,必须覆盖hashCode方法和equals方法(HashMap通过对象的hashCode和equals方法来完成对象唯一性的判断)
如果元素(key)要存储到TreeMap中,必须实现Comparable接口(TreeMap判断两个对象是否相同的方法是Comparable接口中的compareTo()方法)
HashMap性能较好,但如果大量数据存储,可能会出现哈希冲突
集合不能存放基本数据类型,只能存放对象的引用
List、Set都是继承自Collection接口,Map则不是
List特点:元素有放入顺序(这里的顺序指的是元素进入集合的先后顺序),元素可重复
Set特点:元素无放入顺序(这里的顺序指的是元素进入集合的先后顺序),元素不可重复,重复元素会覆盖掉
Map用于保存具有映射关系(键值对)的数据,key不能重复
以上集合Vector、HashTable是线程安全的
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表,依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树,两种方式排序:自然排序和比较器排序
学无止境,如有问题,望多多指教(部分内容摘自百度~)