集合框架概述
集合框架的概述
- 集合、数组都是对多个数据进行存储操作的结构,简称Java容器
- 数组在存储多个数据方面的特点
- 一旦初始化后,其长度就确定了
- 一旦定义好,其类型也确定了,我们只能操作指定类型的数据
数组在存储多个数据方面的缺点
- 一旦初始化后,就不能修改长度
- 提供的方法有限,增删不便,且效率不高
- 没有现成的获取数据中实际元素个数的方法
- 数组存储数据的特定:有序,可重复。
集合框架
Collection接口:单列集合,用来存储一个一个的数据
- List接口:存储有序的、可重复的数据。—“动态”数组
- ArrayList、linkedList、vector
- Set接口:无序的,不可重复的数据 — 高中讲的集合
- HashSet、LinkedHashSet、TreeSet
- List接口:存储有序的、可重复的数据。—“动态”数组
Map接口:双列集合,用来存储一对一对的数据
- HashMap、LinkedHashMap、TreeMap、Hashtable、properties
Collection接口中定义的方法
- HashMap、LinkedHashMap、TreeMap、Hashtable、properties
add() 添加元素
- size() 获取长度
- addAll() 添加集合
- isEmpty() 判断是否为空
- clear() 清空集合元素
- contains 是否包含
- containsAll(集合)判断是否包含集合中的全部元素
- remove() 删除元素
- removeAll(集合)删除集合
- retainAll(集合)求交集
- equals()
- hashcode() 输出hash值
- toArray()集合转数组
- iterator() 返回iterator接口的实例
使用iterator遍历集合
while(iterator.hasNext()){
iterator.next();
iterator.remove();//移除
}
List接口
- ArrayList
- 作为List接口的主要实现类,线程不安全,效率高,
- 底层使用Object[]存储数据
- ArrayList的源码分析
- jdk7中,空参构造器数组长度为10,扩容的话是1.5倍
- jdk8,空参构造器数组长度为0,先扩容为10,再1.5倍.
- List新增的方法
- add(index,object)在某个索引处添加数据
- addAll(index,Collection) 在某个索引处添加集合
- indexOf(Object) 返回某个元素出现的位置
- lastIndexOf(Object)返回最后出现的位置
- set(index,Object)设置某个角标的元素
- subList(start,end)返回start到end的元素
- get() 获取元素
- remove(index) 删除某个角标的元素
- LinkedList
- 底层使用的双向链表
- 频繁的插入删除效率比ArrayList效率高
- LinkedList的源码分析
- 内部声明了Node类型的first和last对象.默认值为null
- add()时,将对象封装到Node中
- Node属性E item\Node
next\Node prev
Vector
- 线程安全的,效率低,
- 底层使用Object[]数组存储
- Vectord的源码分析
- 和ArrayList相同,只是扩容是二倍
经典面试题
- 和ArrayList相同,只是扩容是二倍
ArrayList linkedList vector的异同
- 同:都实现了List接口,都是有序的可重复的.
- 不同点
- 见上
Set接口
- 见上
都是Collection中的方法
像Set添加的方法需要重写equals()和hashCode()方法
- HashSet
- 底层数组加链表的方法存储数据,可以存null
- 存储无序的,不可重复的
- 无序性:不等于随机性,存储的顺序是根据Hash值决定的
- 不可重复的: 先根据Hash值找数组的位置,先判断Hash是否相同,在用equals在链表中比较是否相同,不相同尾插
- LinkedHashSet
- 作为HashSet的子类, 在添加数据的时候,每个数据还维护了两个引用,记录前一个数据和后一个数据,优点是频繁的遍历效率高
TreeSet
- 采用红黑树的存储结构
- 添加的属性是相同类的对象
- 添加的属性实现comparable接口,实现comparaTo方法,就可以输出排序好的数据了.
- 比较两个元素是否相等的标准为:comparaTo是否返回0
- 上面是自然排序,还有定制排序,需要在构造TreeSet时候传入一个comparator接口的实现类.
Collections是操作list,set,map的工具类
reverse(list)翻转list
- shuffle(list)随机排序
- sort(list)对list自然排序
- sort(list,comparator)自定义排序
- swap(list,int,int)元素交换
- max(collection)自然排序最大
- max(collection,comparator)自定义排序最大
- min()同上
- min()同上
- frequency(collection,Object)出现次数
- copy(list1,list2)复制2到1
- replaceAll(list,o1,o2) 用2替换所有1
synchronizedXxx()将指定集合包装成线程同步的集合,
Map
HashMap : 作为map的主要实现类
- 底层数据结构
- 1.7:数组加链表
- 1.8:数组加链表加红黑树
- Hash的默认容量是16
- 默认加载因子是0.75
- 扩容的临界值 16* 0.75
- 链表转换红黑树:链表当前长度>8且数组的长度>64
- 线程不安全的,效率高
- LinkedHashMap
- 在Hash的基础上添加了一对引用,指向前一个和后一个元素,可以按插入顺序遍历,频繁遍历效率高.
- 源码中Entry继承了Hash的node,且加了前后位置的Entry
- 底层数据结构
- TreeMap
- 数据结构:红黑树
- 按照key进行排序,key必须是同一个类的对象,,考虑key的自然排序或者定制排序
Hashtable
- 不能存储null的key和value
- 线程安全的,效率低
- properties
- 常用来处理配置文件.key和value都是String
Map中定义的方法
- 常用来处理配置文件.key和value都是String
put() 插入
- putAll(Map m)m全部插入
- remove(key) 指定移除key
- clear() 清空
- get() 获取
- containKey
- containValue
- size()
- isEmpty
- equals()
- keySet() 返回key的Set
- values() 返回value的Collection集合
- entrySet() 返回键值对set