java集合总结-List、Set、Map
目录
一、集合大纲
这里只总结常被提及的相关集合:
ArrayList、LinkedList、Vector、HashSet、TreeSet、LinkedHashSet、HashMap、Hashtable、TreeMap
│——-List
│—————-├ LinkedList
│—————-├ ArrayList
│—————-└ Vector
│——-Set
│—————-├ HashSet
│—————-├ TreeSet
│————————└ LinkedHashSet
│——-Map
│—————-├ HashMap
│—————-├ Hashtable
│—————-└ TreeMap
二、List
List接口实现类:有序(按元素进入的先后顺序存储)、可重复存储元素
1.ArrayList
// ArrayList:底层数据结构是数组结构(动态数组)、线程不安全、可存储null数据
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("qwer");
arrayList.add("asdf");
arrayList.add("zxcv");
arrayList.add("zxcv");
arrayList.add(null);
System.out.println("arrayList:" + arrayList);
2.LinkedList
// LinkedList:底层数据结构是链表结构、线程不安全、可存储null数据
LinkedList<String> linkedList = new LinkedList<String>();
linkedList.add("qwer");
linkedList.add("asdf");
linkedList.add("zxcv");
linkedList.add("zxcv");
linkedList.add(null);
System.out.println("linkedList:" + linkedList);
3.Vector
// Vector: 底层数据结构是数组结构、线程安全、可存储null数据
Vector<String> vector = new Vector<String>();
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
Set接口实现类:无序或有序(比如treeSet按自然顺序/定制排序、LinkedHashSet按元素进入先后顺序)、不可重复存储元素
1.HashSet
// HashSet:底层数据结构是哈希表、线程不安全、可存储null数据
HashSet<String> hashSet = new HashSet<String>();
hashSet.add("qwer");
hashSet.add("asdf");
hashSet.add("zxcv");
hashSet.add("zxcv");
hashSet.add(null);
System.out.println("hashSet:" + hashSet);
2.TreeSet
// TreeSet:底层数据结构是二叉树、线程不安全、不可存储null数据
TreeSet<String> treeSet = new TreeSet<String>();
treeSet.add("qwer");
treeSet.add("asdf");
treeSet.add("zxcv");
treeSet.add("zxcv");
// treeSet.add(null);
System.out.println("treeSet:" + treeSet);
3.LinkedHashSet
// LinkedHashSet:底层数据结构是链表+哈希表、线程不安全、可存储null数据
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();
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
Map用于保存具有映射关系(键值对)的数据,key不能重复
1.HashMap
// HashMap:底层数据结构是哈希表、线程不安全、key-value可为null
HashMap<String, String> hashMap = new HashMap<String, String>();
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);
2.Hashtable
// Hashtable:底层数据结构是哈希表、线程安全、key-value不可以为null
Hashtable<String, String> hashtable = new Hashtable<String, String>();
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);
3.TreeMap
// TreeMap:底层数据结构是红黑树、线程不安全、key不可以为null、value可以为null
TreeMap<String, String> treeMap = new TreeMap<String, String>();
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:底层数据结构是二叉树,两种方式排序:自然排序和比较器排序
学无止境,如有问题,望多多指教(部分内容摘自百度~)
上一篇: 多线程----sleep
下一篇: 多线程——join()、sleep()