Java集合
集合类型有三种,set,list还有map
集合接口有两种,Collection和Map,list和set继承了Collection接口
List:
可以重复,可以含有null元素,通过索引取出加入数据,读取顺序和插入顺序一致
- ArrayList:底层数据结构是数据结构array,查询速度快,增删改慢,因为是一种类似数组的形式进行存储,所以随机访问速度快。
- Vector:底层是数组结构array,与ArrayList相同,查询速度快,增删改慢。
- LinkedList:底层使用链表结构,增删速度快,查询稍慢。
ArrayList和Vector区别:
Vector的扩容是按照当前数组的百分之百扩容,ArrayList则是百分之五十。
ArrayList是线程不同步,Vector线程安全,但因为Vector每个方法都加上了synchronized,所以效率上小于ArrayList。
Set:
数据无序且唯一,实现类都不是线程安全的类。
解决线程安全的办法Set set = Collecitions.sysnchronizedSet(Set对象)
HashSet:是Set接口最常用的实现类,顾名思义,底层用了哈希表算法,底层其实是一个数组,存在的意义是提供查询速度,插入速度也快,但是仅适合少量数据的插入,判断两个对象是否相同的规则:equals比较为true,hashCode值相同。
LinkedHashSet:继承了HashSet类,所以它的底层用的也是哈希表的数据结构,因为保持数据的先后添加顺序,所以又加了链表结构,但因为多加了一种数据结构,所以效率比较低,如果要求一个集合要保证元素不重复,需要记录元素的先后添加顺序,才选择LinkedHashSet。
TreeSet:Set接口的实现类,也拥有set接口的一般特性,但是不同的是它也实现了SortSet接口,底层采用了红黑树算法,它只能存储相同类型对象的引用。
Tree最重要的是它的两种排序方式:自然排序和客户化排序
自然排序:实现了Comparable接口,所以TreeSet可以调用对象的ComparableTo()方法比较集合大小,然后进行升序排序。
客户化排序:其实是实现Comparator接口提供的具体排序方式,是具体比较对象的类型,如果comparator(x,y)返回值大于0表示x大于y。
Map:
Java中Map是一种把键对象和值对象进行映射的集合,其中每一个元素都包含了键对象和值对象,其中值对象可以是Map类型的数据,因此Map支持多级映射,Map中的键是唯一的,但是值可以不唯一。
HashMap:1.8版本后,哈希表的实现是数组+链表+红黑树,在使用哈希表的集合中,我们都认为他们的时间复杂度都是O(1)的。
TreeMap:它是一个有序的key-value集合,它是通过红黑树实现的,TreeMap继承于AbstractMap,所哟一它是一个Map,它支持导航方法,能被克隆,也支持序列化。
HashTable:继承了Map接口,实现了一个key-value映射的哈希表,任何非空对象都可以作为key和value,线程安全。