分类
(1) List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
(2) Set下有HashSet,LinkedHashSet,TreeSet
(3) List下有ArrayList,Vector,LinkedList
(4) Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
(5) Collection接口下还有个Queue接口,有PriorityQueue类
java库中的具体集合
集合类型 | 描述 |
---|---|
ArrayList | 可以动态增长和缩减的一个索引序列 |
LinkedList | 可以在任何位置高效插入和删除的一个有序序列,底层是一个双向链表 |
ArrayDeque | 实现为循环数组的一个双端队列 |
HashSet | 没有重复元素的一个无序集合,HashSet底层是HashMap |
TreeSet | 一个有序集,TreeSet 底层是通过 TreeMap 来实现的,因此二者的实现方式完全一样。而 TreeMap 的实现就是红黑树算法 |
EnumSet | 一个包含枚举类型值的集 |
LinkedHashSet | 一个包含枚举类型的值 |
PriorityQueue | 允许高效删除最小元素的一个集合,PriorityQueue是非线程安全的,所以Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于Java多线程环境 |
HashMap | 存储键/值关联的一个数据结构 |
TreeMap | 键有序的一个映射,底层实现是红黑树数据结构 |
EnumMap | 键属于枚举类型的一个映射 |
LinkedHashMap | 可以记住键/值项添加次序的一个映射 |
WeakHashMap | 值不会在别处使用时就可以被垃圾回收的一个映射 |
IdentitiyHashMap | 用==而不是用equals比较键的一个映射 |
ArrayList和LinkList区别
他们都是继承List 接口,都可以用来存储一些线性的数据. 他们的主要区别如下:
1.底层数据结构不一样:ArrayList他底层使用的是一个Object的数组,而LinkedList则是使用的一个双向链表。
2.ArrayList他支持随机访问,而LinkedList则不支持,ArrayList实现了RandomAcess这个接口,而这个接口为空接口,实现空接口的意义何在呢?这个接口的意义就是为了标记这个类是具有一个随机访问的特性,仅仅起到一个标志的作用,而LinkedList则是不支持的,根本原因就是ArrayList底层数据结构采用的是数组,天然支持根据数组下标进行访问数据。
3.插入和删除的效率不同:ArrayList采用的是数组来实现的,所以插入和删除元素受到元素的位置影响。时间复杂度O(N),LinkedList插入删除时间复杂度为O(1).
4.ArrayList会预留一定的空间,数组实际的大小,是会大于存储数据的内存大小,而LinkedList则是每添加一个元素的时候,他才会去申请这个元素所对应的内存空间。
5. ArrayList和LinkList都是线程不安全的,Vector是线程安全的。
6. ArrayList的扩容参考参考
注意:
(1)Queue接口与List、Set同一级别,都是继承了Collection接口。
LinkedList既可以实现Queue接口,也可以实现List接口.只不过呢, LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法了,而不能直接访问 LinkedList的非Queue的方法,以使得只有恰当的方法才可以使用。
(2)SortedSet是个接口,它里面的(只有TreeSet这一个实现可用)中的元素一定是有序的。
Connection接口:
1.List有序,可重复
1.1 ArrayList
优点:底层数据结构是数组,查询快,增删慢
缺点:线程不安全,效率高
这个类是大致相当于Vector,不同之处在于它是不同步的
1.2.Vector
优点:底层数据结构是数组,查询快,增删慢
缺点:线程安全,效率低
1.3LinkedList
优点:底层数据结构是链表,查询慢,增删快
缺点:线程不安全,效率高
代码演示:
public class collection {
public static void main(String[] args) {
//ArrayList(类似python列表)
Scanner in=new Scanner(System.in);
int i= in.nextInt();
ArrayList array=new ArrayList<Integer>();
array.add(i);
array.add(2);
array.add(3);
array.add(4);
System.out.println(array);
//Vector(类似python列表)
Vector vect= new Vector<Double>();
vect.add(1.1);
vect.add(2.1);
vect.add(3.1);
System.out.println(vect);
vect.remove(2.1);
System.out.println(vect);
//LinkedList
LinkedList list=new LinkedList();
list.add(1);
list.add(1.1);
list.add("a");
System.out.println(list);
System.out.println(list.indexOf("a"));
}
2. Set无序,唯一
2.1HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
2.2.LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
注意:
FIFO(First Input First Output):先进先出队列
2.3TreeSet
底层数据结构是红黑树。(唯一,有序)
- 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
public class set {
public static void main(String[] args) {
//2.1 HashSet
HashSet hs=new HashSet();
hs.add(1);
hs.add(2);
hs.add(3);
hs.add(3);
System.out.println(hs);
//结果:[1, 2, 3]
System.out.println(hs.contains(3));
//结果:true
//2.2 LinkedHashSet
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add("1");
linkedHashSet.add("2");
linkedHashSet.add("3");
linkedHashSet.add("4");
linkedHashSet.add("2");
System.out.println(linkedHashSet);
//2.3 TreeSet
TreeSet treeSet = new TreeSet();
treeSet.add(1);
treeSet.add(2);
treeSet.add(3);
treeSet.add(4);
System.out.println(treeSet.hashCode());
}
}
Map接口:
Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和Hashtable。
(1)TreeMap是有序的,HashMap和HashTable是无序的。
(2)Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
(3) Hashtable不允许null值,HashMap允许null值(key和value都允许)。
public class map {
public static void main(String[] args) {
//TreeMap(类似python中字典)
TreeMap treeMap = new TreeMap();
treeMap.put("1","e");//添加数据
treeMap.put("1","e");
System.out.println(treeMap.get("1"));//按照关键字索引
//HashMap
HashMap hashMap = new HashMap();
hashMap.put("1","q");
hashMap.put("2","qq");
hashMap.put("3","qqq");
System.out.println(hashMap);
System.out.println(hashMap.get("3"));
//Hashtable
Hashtable hashtable = new Hashtable();
hashtable.put("1","q");
hashtable.put("2","qq");
hashtable.put("3","qqq");
System.out.println(hashtable);
System.out.println(hashtable.get("3"));
}
}