集合集合框架
Java集合框架提供了一套性能优良,使用方便的接口和类,它们都位于java.util包,其主要内容和彼此之间的关系如下图所示:
集合框架的三大类接口:Map接口,List接口和Set接口。
Collection接口
collection方法
Iterable接口以及Iterator接口
Iterable接口
用for-each来遍历元素。
for (String str : list){ if ("d".equals(str)){ list.remove(str); } } System.out.println(list); }
Iterator接口
此接口的两个方法:
.hasNext() 判断是否存在下一个可以访问的元素,如果仍有元素可以迭代,则返回true
.next() 返回要访问的下一个元素。
Iterator<String> iterator = list.iterator(); //通过迭代器遍历所有元素 while (iterator.hasNext()){ //判断是否存在下一个可以访问的元素 String str = iterator.next(); //用str来记录要访问的下一个元素 if ("c".equals(str)){ //list.remove(str); 这种删除会报错 iterator.remove(); continue; } System.out.println(str); }
Queue接口
Deque接口 Deque 接口(双端队列)是 Java 标准库中的一种集合接口,代表了一种具有队列和栈特性的数据结构,支持在 队列的两端进行插入和删除操作。Deque 接口继承自 Queue 接口,提供了更丰富的操作,包括在队列的两端进 行插入、删除、检索等操作。
Deque 接口的主要特点包括: (1)双向操作:Deque 接口允许在队列的两端进行插入、删除、检索操作。可以在队列的头部(前面)或尾部 (后面)插入、删除、检索元素,提供了更灵活的操作方式。 (2)队列特性:Deque 接口支持队列的特性,包括在队列的尾部进行插入操作,从队列的头部进行删除操作, 支持 FIFO(先进先出)的队列行为。 (3)栈特性:Deque 接口也支持栈的特性,包括在队列的头部进行插入(push)操作,从队列的头部进行删除 (pop)操作,支持 LIFO(后进先出)的栈行为。。 (4)实现类:Java 标准库中提供了多个实现了 Deque 接口的类,包括 ArrayDeque 和 LinkedList,它们分别提 供了不同的底层实现方式和性能特点,可以根据具体的使用场景选择合适的实现类。 另外,Deque 接口还提供了一些特定于队列和栈的方法,如 offerFirst、offerLast、peekFirst、peekLast、 pollFirst、pollLast 等,用于在队列的两端进行特定的操作
。
一:List接口的实现类
List接口继承自Collection接口,是有序集合。用户可以使用索引访问List接口中的元素,类似于数组。List接口中允许存放重复元素,也就是说,List可以存储一组不唯一,有序的对象。
1:Vector
Vector类的特点:
(1)动态数组:它的底层实现是一个数组,可以动态的调整数组的大小,根据需要自动扩容或缩小数组的容量。
(2)线程安全:所有方法都是同步的,可以在多线程环境中使用,保证了线程安全。
(3)支持随机访问
(4)可以包含重复元素
(5)可以插入null元素。
2:Vector类的常用方法
2:ArrayList
3:LinkList
4:Stack
1:特点:
(1)后进后出
(2)继承自Vector。
2:常用方法
类型 | 方法 | 描述 |
---|---|---|
boolean | empty() | 测试此堆栈是否为空 |
E | peek() | 查看此堆栈顶部的对象而不将其从堆栈中移出 |
E | pop() | 移除此堆栈顶部的对象并将该对象作为此函数的值返回 |
E | push(E item) | 将一个项目推到这个堆栈的顶部 |
int | search(Object o) | 返回对象在此堆栈中的从1开始的位置 |
二:Set接口的实现类
Set
java.util.Set 不包含重复元素的集合、不能保证存储的顺序、只允许有一个 null
public interface Set<E> extends Collection<E>
抽象方法,都是继承自 java.util.Collection 接口,在此不做重复描述。
Set 集合的实现类有很多,在此我们重点了解 HashSet 、 TreeSet 、 LinkedHashSet
TreeSet
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
-
非线程安全
-
值必须可比较(元素实现 Comparable 接口、传递 比较器 Comparator 对象)
-
不能存 null
-
判断是否是重复元素,是按照自然比较/比较器进行比较
就是说a.compareTo(b) == 0,如果是 true ,那么 add(a) 之后的 add(b) 将会返回 false ,
也就是添加失败
常用的构造方法
方法名 | 描述 |
---|---|
treeSet() | 构造一个新的空TreeSet集合,根据其元素的自然顺序 |
TreeSet(Comparator<?super E> comparator) | 构造一个新的空TreeSet集合,根据指定的比较器进行排序 |
TreeSet(Collection<?extends E> c) | 构造一个新的TreeSet集合,,该TreeSet集合包含指定集合中的元素,并根据其元素的自然顺序进行排序。 |
常用方法:
( Collection 接口的方法不在此赘述)
方法名 | 返回值 | 描述 |
---|---|---|
ceiling(E e) | E | 返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回null。 |
first() | E | 返回当前在此集合中的第一个(最低的)元素。 |
floor(E e) | E | 返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则返回null。 |
higher(e) | E | 返回此集合中严格大于给定元素的最小元素,如果没有这样的元素,则返回null。 |
lower(e) | E | 返回此集合中严格小于给定元素的最大元素,如果没有这样的元素,则返回null. |
pollFirst() | E | 检索并删除第一个(最低的)元素,如果此集合为空,则返回null |
pollLast() | E | 检索并删除最后一个(最高的)元素,如果此集合为空,则返回null |
tailSet(EfromElment) | SortedsSet<[E]> | 返回此集合元素严格大于或等于fromElement的部分的视图 |
TreeSet<String> set = new TreeSet(List.of("null", "a", "a", "b", "c", "e", "f", "g")); System.out.println(set); // [a, b, c, e, f, g, null] // 返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回null。 String ceiling = set.ceiling("d"); System.out.println(ceiling);// e // 返回当前在此集合中的第一个(最低的)元素。 String first = set.first(); System.out.println(first); // a // 返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则返回null。 String floor = set.floor("d"); System.out.println(floor); // c // 返回此集合中元素严格小于toElement的部分的视图。 SortedSet<String> headSet = set.headSet("c"); System.out.println(headSet); // a, b // 返回此集合中严格大于给定元素的最小元素,如果没有这样的元素,则返回null。 String higher = set.higher("c"); System.out.println(higher); // e // 返回此集合中元素严格大于或等于fromElement的部分的视图。 SortedSet<String> tailSet = set.tailSet("c"); System.out.println(tailSet); // c, e, f, g, null // 迭代 for (Object obj : set){ System.out.println(obj); }
HashSet
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable
实现了 Set 接口,底层实现是 HashMap 。不保证迭代顺序,允许 null 元素
-
非线程安全的
-
如果 add 的值已存在( equals 方法返回 true ,基本数据类型自动装箱)返回 false
-
如果 HashSet 中存的是对象,需要重写此对象类中的 equals 和 hashCode() 方法
构造方法:
方法名 | 描述 |
---|---|
HashSet() | 构造一个新的空集合,默认初始量(initialCapacity)和负载因子(0.75) |
HashSet(Collection < ? extends E > c) | 构造一个包含指定集合中的元素的新集合 |
HashSet(int initialCapacity) | 构造一个新的空集合,默认初始容量(initialCapacity)和负载因子(0.75) |
HashSet(int initialCapacity, float loadFactor) | 构造一个新的空集合,底层HashMap实例具有指定的初始容量和指定的负载因子 |
常用方法:
方法名 | 返回值 | 描述 |
---|---|---|
add(Object o) | boolean | 如果Set中尚未包含指定元素o,则添加指定元素o。 |
clear() | void | 从Set中移除所有元素 |
size() | int | 返回Set中的元素数量 |
isEmpty() | boolean | 判断Set是否为空 |
contains(Object o) | boolean | 判断Set是否包含元素o |
remove(Object o) | boolean | 如果Set中的存在指定元素o,则移除元素o |