集合框架说明文档(还未完善)
集合框架一共分为两个大类:Collection和Map接口
Map
:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。这里和我们数学中学习的函数相类似。
Map 存储的是键值对形式的元素,键唯一,值可以重复。一个自变量只能由一个函数值,但是同一个函数值可以对应多个自变量;Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复
1 Collection
Collection主要有三个大的子类:
三个主要接口:List、Queue、Set
1.1List
List中有两个主要实现类ArrayList和LinkedList,还有一个实现类叫做CopyOnArrayList
1.1.1ArrayList
数组:
狭义上的数组指的就是一堆存储数的连续内存空间
广义上来说,只要是一片连续空间存储的“数据“都可以称作数组,这也是ArrayList存在的原因吧,可以存放任何数据类型。
1.1.2LinkedList
链表:
一个链状结构,链表是一种物理储存单元上非连续、非顺序的数据结构。
主要由节点(Node)构成,每一个节点都包含上一个节点的地址和下一个节点的地址,还有它存放的值
1.2Queue
Queue有一个实现类我们之前了解过了:LinkedList还有一个主要的实现类叫做:PriorityQueue
有一个子接口:Deque,我们不难想象设计这个的过程,队列可以单向前进,当然也可以双向前进嘛。于是就有了Deque
Deque有一个实现类ArrayDeque
1.2.1PriorityQueue
1.2.2ArrayDeque
1.3Set
Set有一个主要的实现类:HashSet
还有一个子接口:SortedSet;SortedSet有一个子接口叫做NavigableSet,它有一个实现类:TreeSet
特点:
- 不允许存储重复的元素
- 没有索引,没有带索引方法,也不能使用普通的for循环遍历
关于索引:
索引简单点说就是,我们可以按照一种方法去寻找,提高我们的查询速度
就像我们在查字典的时候,我们可以按照拼音来查找,提高查找速率,这样比起一个一个,一页一页地找要方便迅速的多。
1.3.1HashSet
是一种散列表的结构。
通过哈希算法,将集合中每一个值算出一个对应的哈希值,作为每一个小组区分开来,出现相同的哈希码就将其放在后面,形成链表的结构。
特点:
- 不允许存储重复的元素
- 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
- 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
- 底层是一个哈希表结构(查询的速度非常快)
1.3.2TreeSet
和HashSet不同在于,TreeSet是排序的,不允许放入null值
2Map
Map有一个子接口:SortedMap;SortedMap有一个子接口:NavigableMap;NavigableMap有一个实现类:TreeMap
有三个主要的实现类:HashTable、EnumMap、HashMap
HashMap有一个子类:LinkedHashMap
3各类说明(重点)
3.1List和Set
集合(List)和Set的区别是什么?
两种数据结构有本质的区别,虽然都继承自Collection
List:是一个集合,我们可以把他看成一个集体,在这个集体中,可以出现同名的人
Set:翻译过来也是一个集合,那么它和List为什么要区分开呢?原因在于他们有本质的区别,诞生于需要,Set中不含有重复的“名字”,保证了键值唯一
3.2Set和Map
Set和Map的区别?
从客观角度看来,两个类继承自不同的直接父类,那么必然有不同点,但是从主观看上去,两种数据结构又有着惊人的相似性
先来说说Map
Map我们都清楚,它是一种Key-Value键值对的数据结构,不允许存在重复的Key,且如果为HashMap的时候,只能存在一个null键;如果为HashTable时,不允许存在null键
HashMap为实现类的时候
public class Main {
public static void main(String[] args) {
Map<String,Integer> stringIntegerMap = new HashMap<>();
stringIntegerMap.put(null,1);
System.out.println(stringIntegerMap.get(null));
}
}
/*
1
*/
可以看到输出结果为1
如果为HashTable
public class Main {
public static void main(String[] args) {
Map<String,Integer> stringIntegerMap = new Hashtable<>();
stringIntegerMap.put(null,1);
System.out.println(stringIntegerMap.get(null));
}
}
/*
Exception in thread "main" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:465)
at com.fq.book.project8.program2.Main.main(Main.java:10)
*/
直接抛异常
而Set这种数据结构只能存在一个“键”,它本来时只能存放一个类型的数据,我们不妨将他看作是一种特殊的Map,没有“值”的Map