目录
什么是集合?
集合就是“由若干个确定的元素所构成的整体”。
在Java中,集合是一种容器,用于保存和操作其他Java对象。数组也可以被视为一种集合。
String[] str = new String[10];//创建一个数组
str[0] = "Hello";//放入String对象
String first = str[0];//可以获取String
集合接口
Java标准库自带的java.util包提供了集合相关的接口和实现类:Collection接口,它是除Map接口外所有其他集合类的根接口。
Collection接口
在Collection接口中,包含了单列集合,子接口。
List接口
在集合类中,List是最基础的一种集合:它是一种有序列表。其特点是:有序,允许重复。
具体实现类主要包含了三大类:ArrayList类,LinkedList类,Vector类。
//简单创建一个ArrayList的对象
ArrayList<String> list = new ArrayList<String>();
List 是有序的、可重复的集合。它维护元素的插入顺序,可以包含重复元素;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple"); // size=1
list.add("pear"); // size=2
list.add("apple"); // 允许重复添加元素,size=3
System.out.println(list.size());
}
}
主要实现类包括:
ArrayList:基于动态数组实现,提供随机访问和插入性能;
LinkedList :基于双向链表实现,适合频繁插入和删除操作;
Vector:类似ArrayList,基于动态数组实现,使用 synchronized 实现线程安全,性能略低;
stack:Vector类的子类,提供了 FILO 先进后出的结构;
Copy0nWriteArrayList:基于动态数组实现,使用 ReentrantLock实现线程安全;
ArrayList
数据结构:数组:Object[ ] elementData
使用场景:查找、遍历效率高,插入、删除效率低
初始容量: 初始默认容量为0,添加第一个元素时,扩容为 10;
扩容方式:在原有容量基础上,扩容 0.5 倍(新容量是原有容量的 1.5 倍);
线程安全:线程不安全(可使用 Copy0nWriteArrayList 集合解决);
Linkedlist
数据结构:双向链表
使用场景:查找、遍历效率低,插入、删除效率高
扩容方式:链表动态扩容,每添加一个节点,链表动态扩容一个元素空间
线程安全:线程不安全
Vector
数据结构:数组:Object[ ] elementData
初始容量:初始默认容量为10;
扩容方式:在原有容量基础上,扩容1倍(新容量是原有容量的 2倍);
线程安全:线程安全,操作方法使用 synchronized(同步锁)实现线程同步;
Set接口
Map用于存储key-value的映射,对于充当key的对象,是不能重复的,并且,不但需要正确覆写equals()方法,还要正确覆写hashCode()方法。
如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。
特点: Set是不允许重复元素的集合。
public class Main {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
System.out.println(set.add("abc")); // true
System.out.println(set.add("xyz")); // true
System.out.println(set.add("xyz")); // false,添加失败,因为元素已存在
System.out.println(set.contains("xyz")); // true,元素存在
System.out.println(set.contains("XYZ")); // false,元素不存在
System.out.println(set.remove("hello")); // false,删除失败,因为元素不存在
System.out.println(set.size()); // 2,一共两个元素
}
}
主要实现类包括:
HashSet :基于HashMap实现,元素唯一,无序;
LinkedHashSet:Hashset的子类,基于LinkedHashMap实现,元素唯一且有序,同时保持了哈希表的性能;
Treeset :基于 TreeMap 实现,元素唯一,自动排序或按照自定义规则排序;
HashSet
数据结构: HashMap
特点:无序
LinkedHashSet
数据结构:LinkedHashMap
特点:有序
TreeSet
数据结构:TreeMap
特点:自动排序
Hashset如何过滤重复元素
Hashset 内部使用一个 HashMap 作为数据结构,保存元素时,会使用这个 Hashmap 的 key 来进行保存。key是唯一的所以重复元素会自动过滤。
Queue接口
Queue是用于对元素进行先进先出(FIFO)操作的队列集合;一般来说,它只允许在集合的前端进行删除操作,而在集合的后端进行插入操作。
主要实现包括:
LinkedList:基于双向链表实现;
LinkedBlockingQueue:线程安全的阻塞队列,适用于多线程环境;