Java中的集合
2019-09-15 本文已影响0人
iDevOps
- 所有集合都在java.util包下
- Collection和Map是Java集合框架的根接口
- Collections,集合工具类,用来对集合进行操作
Collection
-
继承Iterable
继承Iterable
Iterable是一个顶级接口,共有三个方法
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
-
接口和实现类
子接口和实现类
List
元素有序可重复
list接口和实现类
- ArrayList
- 底层基于数组
- 元素增删慢, 查找块
实现原理
- 默认初始化大小为10的数组
- 增加元素大于当前数组长度, 则进行扩容, 将数组长度增加原来数组的一半
ArrayList源码
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
//定义
List list1 = new ArrayList();
//添加元素
list1.add("张三");
list1.add(12);
System.out.println(list1.get(0)); //张三 取下标为0的元素
System.out.println(list1.size()); //2 集合长度
System.out.println(list1.contains(12));//true 是否包含
//删除下标为1的元素
System.out.println(list1); //[张三, 12]
list1.remove(1);
System.out.println(list1); //[张三]
//两个集合合并
List list2 = new ArrayList();
list2.add("lisi");
list2.add(13);
list1.addAll(list2);
System.out.println(list1); //[张三, lisi, 13]
list1.addAll(0, list2);
System.out.println(list1); //[lisi, 13, 张三, lisi, 13]
方法还有很多, 自己去试吧.....
- Vector
- 线程安全
- 性能比ArrayList低
实现原理
添加元素大于当前数组长度, 则进行扩容, 将数组的长度增加原来数组的1倍
- LinkedList
- 基于链
- 方便元素添加、删除, 提供了大量首尾操作的方法
Set
元素无序不可重复
子接口及实现类
- HashSet
- 不可重复
- 无序
- 根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能
数据结构
在JDK1.8之前
- 哈希表底层采用数组+链表实现
- 同一hash值的链表都存储在一个链表里, 当hash值相等的元素较多时,通过key值依次查找的效率较低
在JDK1.8
- 数组+链表+红黑树实现
- 当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找 时间
- LinkedSet
HashSet保证了数据唯一, 但元素存放进去是没有顺序的, 那么我们怎么保证顺序?使用LinkedSet
链表 + 哈希表实现
Map
- 基于数组 + 链表
- 紫色, Hash数组, 数组元素是每个链表的头节点
- 绿色, 链表, 解决hash冲突, 不同的key映射到了数组的同一索引处, 则形成链表
- HashMap
- 哈希表结构
- 元素的存取顺序不能保证一致
- 由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法
- LinkedHashMap
- 哈希表结构+链表结构
- 通过链表结构可以保证元素的存取顺序一致
- 通过哈希结构保证键的唯一不重复, 需要重写键的 hashCode()方法、equals()方法