Map
以键值对的形式
将键映射到值得对象。一个映射不能包含重复的键,每个键最多只能映射一个值。
常用的有三个子类实现了map接口:map的存在是为了快速查找,拖过键找到值,所以键值是不可能重复的。
hashMap 和hashtable:两者都是hash结构的,hashmap线程是不安全的允许键值对为null,hashtable线程是安全的不允许键值对为null,两者的其他属性是一样的,所以两者的使用要看具体的情况而定。
treemap:底层是二叉树的接口。线程不同步,可用于给Map集合中的键进行排序,虽然说有些集合是无序的,但是子类个别的也是按照另一种方式进行了排序,只不过不符合我们日常的排序方式。是按照某种规则进行的。
三者的关系:
Map中元素,可以将key序列、value序列单独抽取出来。
使用keySet()抽取key序列,将map中的所有keys生成一个Set。
使用values()抽取value序列,将map中的所有values生成一个Collection。
为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复
Set
首先是一个无序不可重复的集合,无序指的是不是按照放入顺序排序,但不是真的无序。Set还有两个子类,一个是hashSet,还有一个是继承了SortedSet接口的TreeSet。
hashSet的底层是hashmap,他有着hashmap中键的特性,那就是,无序,不可重复性,
treeset实现了sortset接口,sortedset有排序能力,也就意味着treeset也有着排序的能力,他是使用二叉树进行排序的。
List
这是一个有序可重复的集合。
list接口也有两个子类,一个是arraylist,一个是linkedList,
首先arralist的底层是object[]是一个数组,也就意味着他有着数组的特性,但是和数组相比他比数组灵活,无需设置长度,他是有序的,所以查找块,增删比较慢。
linkedlist:他底层是以链表的形式进行排序的,两个元素之间就如同链子一样前关联,如果进行增删操作的时候,只需要将某个元素替换然后将后边的关联简单修改就可以完成,所以说建议查询用arralist,增删用linkedlist。