一、Java集合的两种体系
Collection接口
- 特点: 用来存储单列数据,存储的是一个一个对象。
- 子类接口
- List接口(动态数组)
- 特点:存储有序的、可重复的数据。大小是可以变化的。
- 常见实现类
- ArrayList
- List接口的主要实现类
- 特点:线程不安全,但是效率很高
- 底层:使用Object[ ]存储
- ArrayList
- List接口(动态数组)
2. **LinkedList**
1. 底层:使用的是双向链表来存储
2. 用处:对于需要频繁的插入、删除操作,使用此类的效率更高
3. Vector
1. list接口的古老实现类
2. 底层:也是使用Object[ ] 存储
3. 常用方法:
1. 增:add(Object obj)
2. 删:remove(int index) / remove(Object obj)
3. 改:set(int index,Object val)
4. 查:get(int index)
5. 插:add(int index, Object obj)
6. 长度:size( )
7. 遍历
1. Iterator迭代器遍历
2. 增强for循环
3. 普通循环
Set接口(高中的“集合”)=> 可以用来过滤重复数据
- 特点:存储无序的,不可重复的数据。
- 常见实现类
- HashSet
- Set接口的主要实现类;线程不安全;可以存储null值
- LinkedHashSet
- 是HashSet的子类
- 可以按照添加时候的顺序进行遍历(对于频繁的遍历操作,效率更高)
- TreeSet
- 底层存储:红黑树
- 特点:只能存储相同类型的对象
- 可以按照存储对象的属性进行特定的排序
- 判断元素是否重复,根据的是compareTo方法
- 添加元素的时候,会自动进行排序
- 可以指定自定义排序的方式
- 自然排序(实现comparable接口):比较两个对象相同的标准是:compareTo方法返回0,不再是equals( )
- 定制排序(创建实现了Comparator接口的匿名类的对象,并作为参数传给TreeSet的构造函数)
- 自然排序(实现comparable接口):比较两个对象相同的标准是:compareTo方法返回0,不再是equals( )
- HashSet
- 对于无序和不可重复的理解
- 无序性(通过Hash散射存储)
- 不等于随机性()
- 存储的位置是无序的(并非按照索引的顺序添加的,而是根据对象的hashCode决定的)
- 不可重复性
- 保证添加的元素按照equals( ) 方法判断时,不可以返回 true
- 无序性(通过Hash散射存储)
添加元素的过程(以HashSet为例)
- 首先调用元素a对应类的hashCode( )方法,计算哈希值
- 通过哈希值,使用某种特定的算法计算出元素在HashSet底层数组中存储的位置
判断此位置上是否有元素
- 如果没有其他元素,那么就直接添加成功。(情况1)
- 如果有其他元素
- 首先比较两个元素的哈希值
- 如果哈希值不同,那么就添加成功 (情况2)
- 如果哈希值相同,那么就需要调用equals( )方法来判断
- equals一旦返回 true ,那么添加失败
- 如果没有返回 true ,那么就添加成功(情况3)
- 首先比较两个元素的哈希值
对于情况2和情况3:在指定的索引位置上以链表的方式存储
- JDK7中,新添加的元素a放到数组中,指向原来的元素
- JDK8中,原来的元素不变,指向新添加的元素a
- 提供的API
- add(E e):将元素e添加到集合coll中
- size( ):获取添加的元素的个数
- addAll( Collection coll1 ):将coll1中的元素全部添加进来。
- isEmpty( ):判断当前集合是否为空(通过size来判断)
- clear( ):情况集合里面的所有元素
- contains(Object obj):判断当前集合是否包含obj,包含则返回 true。(根据调用对象的equals方法来进行判断)
- containsAll(Collection coll):判断coll集合中的所有元素是不是都在当前集合中(都存在,返回true)
- remove(Object obj):删除obj对象
- removeAll(Collection col):删除当前集合中col中存在的所有元素
- retainAll(Collection col):保留当前集合中在col中也存在的所有元素
- hashCode( ):返回当前集合的哈希值
- toArray( ):返回一个对象数组
- iterator():返回迭代器,用来遍历集合中的所有元素。
Map接口
- 特点:双列集合,用来存储一对数据(KEY-VALUE),类似于高中讲的映射。
- 常见实现类:
- HashMap
- 特点
- Map的主要实现类
- 线程不安全,但是效率高
- 可以存储为 null 的 key 和 value
- 子类
- LinkedHashMap
- 作用:保证遍历过程中可以按照添加的时候的顺序遍历
- LinkedHashMap
- 底层
- JDK7和以前:数组+链表
- JDK8:数组+链表+红黑树
- 特点
- TreeMap
- 特点
- 是有序的(考虑对 key 的排序)
- 保证可以按照添加的 key - value 来进行排序
- 底层:红黑树
- 特点
- HashTable
- 特点
- Map的古老实现类
- 线程安全,但是效率比较低
- Properties
- 用处:常用来处理配置文件
- 特点:Key 和 Value 都是 String类型
- 特点
- HashMap
- Map接口中定义的常见方法
- 添加 / 修改:
Object put(Object key,Object value)
- 添加一系列:
void putAll(Map map)
- 删除:
Object value = map.remove(key);
函数的返回值是 key 所对应的 value
如果对应的 key 不存在,那么就返回null
- 清空:
map.clear()
clear 做的只是清空数据,但是 map 仍然还在 - 查询
key
对应的value
:Object get(Object key);
- 查询是否存在某个
key
:boolean containsKey(Object key);
调用的是 key 所在类的 equals 方法 - 查询是否存在某个
value
:boolean containsValue(Object key);
- 判断是否为空:
boolean isEmpty();
根据的是 map 的 size 来判断是否为空。
- 添加 / 修改:
- Map的遍历
- 转换为 set
- 遍历 key
- 遍历 value
- 遍历 key-value
- 遍历 key
- 使用 forEach 直接遍历 map
- 转换为 set