Java集合经常在Java面试被问到,而且Java集合也是Java高级必备掌握内容,下面我来全面详解Java集合@mikechen
Java集合体系框架
Java集合框架主要包含以下几个部分,如下图所示:
- Collection接口:是所有集合接口的根接口,定义了所有集合共同具备的方法,如添加元素、删除元素、判断元素是否存在等操作。
- List接口:继承自Collection接口,表示一个有序集合,可以存储重复元素。
- Set接口:继承自Collection接口,表示一个不允许重复元素的集合。
- Map接口:表示键值对映射关系的集合。
- Queue接口:表示一个队列集合。
下面我分别详解Java集合的内容,包含:Collection、Java List、Java Set、Java Map、Java Queue。
Java集合Collection
Collection接口是所有集合接口的根接口,定义了所有集合共同具备的方法,如添加元素、删除元素、判断元素是否存在等操作。
如下图所示:
Collection派生出了三个子接口,分别是List、Set、Queue三个接口。
Java集合List
在 Java 集合框架中,Java List接口是一个有序集合,可以包含重复元素,Java List接口继承了 Collection 接口。
Java List常用的实现类有:ArrayList、LinkedList等,如下图所示:
List集合特点
- 集合中的元素允许重复;
- 集合中的元素是有顺序的,各元素插入的顺序就是各元素的顺序;
- 集合中的元素可以通过索引来访问或者设置;
List常用方法
下面是 List 接口的一些常用方法:
- add(E e):向 List 集合末尾添加一个元素 e。
- add(int index, E element):在 List 集合的指定位置 index 插入一个元素 element。
- remove(Object o):从 List 集合中删除指定元素 o。
- remove(int index):从 List 集合中删除指定位置 index 的元素。
- get(int index):获取 List 集合中指定位置 index 的元素。
- set(int index, E element):用指定的元素替换 List 集合中指定位置 index 的元素。
- indexOf(Object o):返回 List 集合中第一次出现指定元素 o 的位置。
- lastIndexOf(Object o):返回 List 集合中最后一次出现指定元素 o 的位置。
- size():返回 List 集合的大小。
List使用示例
import java.util.ArrayList; import java.util.List; public class ListExample { public static void main(String[] args) { // 创建一个 ArrayList 对象 List<String> list = new ArrayList<>(); // 向 list 中添加元素 list.add("Java"); list.add("Python"); list.add("C++"); // 获取 list 的元素个数 int size = list.size(); System.out.println("list 的元素个数:" + size); // 获取指定位置的元素 String first = list.get(0); System.out.println("list 第一个元素:" + first); // 在指定位置插入元素 list.add(1, "JavaScript"); System.out.println("list 插入元素后:" + list); // 删除指定位置的元素 list.remove(2); System.out.println("list 删除元素后:" + list); // 替换指定位置的元素 list.set(1, "Go"); System.out.println("list 替换元素后:" + list); // 获取指定元素的位置 int index = list.indexOf("Java"); System.out.println("Java 在 list 中的位置:" + index); } }
Java List总结
1)ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
2)Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
3)LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
Java集合Set
在 Java集合框架中,Set接口:继承自Collection接口,表示一个不允许重复元素的集合。
Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet。
如下图所示:
HashSet
HashSet是Set集合最常用实现类,底层其实是包装了一个HashMap实现的,数据结构是数组+链表 + 红黑树。
LinkedHashSet
LinkedHashSet是Java集合框架中的一种Set实现类,它继承了HashSet类并实现了Set接口,底层数据结构采用链表和哈希表共同实现。
如下图所示:
TreeSet是一种排序的Set集合,底层是用TreeMap实现的,本质上是一个红黑树。
Set常用方法:
下面是 Set 接口的一些常用方法:
- add(E e):向 Set 集合添加一个元素 e。
- remove(Object o):从 Set 集合中删除指定元素 o。
- contains(Object o):判断 Set 集合中是否包含指定元素 o。
- size():返回 Set 集合的大小。
Set使用示例:
import java.util.HashSet; import java.util.Set; public class SetExample { public static void main(String[] args) { // 创建一个 HashSet 对象 Set<String> set = new HashSet<>(); // 向 set 中添加元素 set.add("Java"); set.add("Python"); set.add("C++"); set.add("Java"); // 获取 set 的元素个数 int size = set.size(); System.out.println("set 的元素个数:" + size); // 判断 set 是否包含指定元素 boolean containsJava = set.contains("Java"); System.out.println("set 是否包含 Java:" + containsJava); // 删除指定元素 set.remove("C++"); System.out.println("set 删除元素后:" + set); } }
Java集合Queue
Queue 接口继承了 Collection 接口,Queue 接口表示一种队列数据结构,即先进先出(FIFO)的数据结构。
如下图所示:
Queue常用类:
PriorityQueue
PriorityQueue是Java集合框架中的一个实现了Queue接口的类,是 Java 中基于优先级的队列的通用实现。
Deque
Deque接口是Queue接口的子接口,它代表一个双端队列,当程序中需要使用“栈”这种数据结构时,推荐使用ArrayDeque。
Queue常用方法:
下面是 Queue 接口的一些常用方法:
- add(E e) / offer(E e):将指定元素添加到队列尾部,并返回 true。
- remove() / poll():移除并返回队列头部的元素。
- element() / peek():返回队列头部的元素,但不移除。
Queue使用示例:
import java.util.LinkedList; import java.util.Queue; public class QueueExample { public static void main(String[] args) { // 创建一个 LinkedList 对象,即一个队列 Queue<String> queue = new LinkedList<>(); // 添加元素到队列尾部 queue.add("Java"); queue.offer("Python"); queue.add("C++"); // 获取队列头部的元素并移除 String head1 = queue.remove(); String head2 = queue.poll(); System.out.println("remove() 方法移除的元素:" + head1); System.out.println("poll() 方法移除的元素:" + head2); // 获取队列头部的元素但不移除 String head3 = queue.element(); String head4 = queue.peek(); System.out.println("element() 方法获取的元素:" + head3); System.out.println("peek() 方法获取的元素:" + head4); // 输出队列中所有元素 System.out.println("队列中所有元素:" + queue); } }
Java集合Map
在 Java 集合框架中,Map 接口是一个键值对的集合,即每个元素都是由一个键和一个值组成的。
常用的Map:
1.HashMap
HashMap类实现了Map接口,内部使用哈希表存储键值对,查找键值对的效率很高,但不保证键值对的顺序。
HashMap底层数据结构,如下所示:
HashMap线程不安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap类。
2.Hashtable
Hashtable和HashMap从存储结构和实现来讲有很多相似之处,不同的是它承自Dictionary类,而且是线程安全的,并发性不如ConcurrentHashMap。
3.LinkedHashMap
LinkedHashMap继承了HashMap,是Map接口的哈希表和链接列表实现,它维护着一个双重链接列表。
4.TreeMap
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序)。
Map常用方法:
下面是 Map 接口的一些常用方法:
- put(K key, V value):将指定的键值对添加到 Map 集合中。
- get(Object key):获取指定键对应的值。
- remove(Object key):从 Map 集合中删除指定键的键值对。
- containsKey(Object key):判断 Map 集合中是否包含指定的键。
- containsValue(Object value):判断 Map 集合中是否包含指定的值。
- keySet():返回 Map 集合中所有键的 Set 视图。
- values():返回 Map 集合中所有值的 Collection 视图。
- entrySet():返回 Map 集合中所有键值对的 Set 视图。
Java Map总结
以上就是Java集合的详解,希望对你掌握好Java集合有所帮助!
作者简介
陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》