JavaSE 集合入门
目录
集合是什么?有什么用?
Java 集合是指 JDK 提供的一系列接口、类。(见下文“1、集合的继承图(常用部分)”)
Java 集合的作用是存放数据。可以存放数量不确定的数据(与数组相比)。可以实现常用的数据结构,比如:线性表、链表、栈、队列、树等。
注意1:Java集合里只能保存对象,实际上是保存对象的引用变量。所以将对象添加到集合中后,如果在集合外对该对象进行修改,集合中保存的该对象也会同步修改。
集合怎么用?
1、集合的继承图(常用部分)
(1)Java 集合由 Collection 集合、Map 集合、Collections 工具类组成,都在 java.util 包下。
(2)Collection 接口继承了 Iterable 接口,表示该接口的对象可以通过迭代器进行遍历。
(3)Collection 集合包含以下 3 个集合:List 集合、Set 集合、Queue 集合。
List 集合是有序、元素可重复的集合,实现了线性表、链表等数据结构;
Set 集合是无序、元素不可重复的集合;
Queue 集合实现了队列(双端队列)、栈等数据结构。
(4)Map 集合用于保存具有映射关系的数据。
(5)Collections 工具类,封装了一些可以操作集合的静态方法。
2、Collection 接口
-
2-1 常用方法
public interface Collection<E> extends Iterable<E> {
//向集合中添加元素,如果集合对象被添加操作改变了,返回 true。
boolean add(E e);
boolean addAll(Collection<? extends E> c);
// 返回集合中元素的数量
int size();
// 判断集合是否为空
boolean isEmpty();
// 只删除第一个符合条件的元素,如果删除了元素,返回 true。
boolean remove(Object o);
// 从集合中删除集合 c 中的所有元素,有多个符合条件的相同元素,都删。
boolean removeAll(Collection<?> c);
// 清空集合
void clear();
// 从当前集合中,删除集合c不包含的元素。相当于留下当前集合和集合c的交集。
boolean retainAll(Collection<?> c);
// 判断集合是否包含指定的元素
boolean contains(Object o);
// 判断集合是否包含集合 c 中的所有的元素
boolean containsAll(Collection<?> c);
// 返回一个迭代器对象,用于遍历集合
Iterator<E> iterator();
// 把集合转换成数组。返回 Object[] 数组。不能强制类型转换。
Object[] toArray();
// 把集合转换成数组。返回指定类型数组。
<T> T[] toArray(T[] a);
}
-
2-2 代码示例
-
遍历
Collection<Integer> col = new ArrayList<>();
col.add(1);
col.add(2);
col.add(3);
// 1、迭代器遍历
Iterator<Integer> it = col.iterator();
while (it.hasNext()) {
Integer num = it.next();
System.out.println(num); // 1 2 3
}
// 2、foreach 遍历
for(Integer num : col){
System.out.println(num); // 1 2 3
}
- 集合转数组
Collection<Integer> col = new ArrayList<>();
col.add(1);
col.add(2);
col.add(3);
// 1、无参方法,返回 Object[] 数组
Object[] objs = col.toArray();
System.out.println(Arrays.toString(objs)); // [1, 2, 3]
// 不能进行强制类型转换,会报异常 ClassCastException
// Integer[] nums = (Integer[])col.toArray();
// 2、有参方法,返回指定类型数组
Integer[] nums = col.toArray(new Integer[0]);
System.out.println(Arrays.toString(nums)); // [1, 2, 3]
3、Iterable 接口和 Iterator 接口
Collection 接口实现了 Iterable 接口,Iterable 接口的功能有2个:
(1)实现该接口的类,可以使用迭代器对象进行遍历;
(2)实现该接口的类,可以使用 foreach 循环进行遍历。
-
3-1 常用方法
// Iterable 接口
public interface Iterable<T> {
// 返回一个迭代器对象
Iterator<T> iterator();
}
// Iterator 接口
public interface Iterator<E> {
// 判断是否有下一个元素
boolean hasNext();
// 返回下一个元素
E next();
// 删除刚刚遍历过的元素
default void remove() {...}
}
-
3-2 代码示例
-
迭代器遍历
Collection<String> col = new ArrayList<>();
col.add("a");
col.add("b");
col.add("c");
//迭代器遍历
Iterator<String> it = col.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
- foreach 遍历
Collection<String> col = new ArrayList<>();
col.add("a");
col.add("b");
col.add("c");
// foreach 遍历
for (String s : col) {
System.out.println(s);
}
4、Collections 类
Collections 类是一个工具类,用于操作集合。以下是常用方法(静态方法)。
public class Collections {
// 1、排序操作
// 按照元素的自然顺序,进行升序排序
// 自然顺序:Comparable 接口的 compareTo() 方法。详见《JavaSE 比较器接口》
public static void sort(List list) {...}
// 按照指定顺序,进行排序
public static void sort(List list, Comparator c) {...}
// 反转集合顺序
public static void reverse(List list) {...}
// 随机排序(洗牌)
public static void shuffle(List list) {...}
// 交换元素顺序
public static void swap(List list, int i, int j) {...}
// 2、查找、替换
// 二分查找。使用该方法,必须保证 List 集合有序。
public static int binarySearch(List list, T key) {...}
// 查找最小元素
public static T min(Collection<? extends T> coll) {...}
public static T min(Collection coll, Comparator comp) {...}
// 查找最大元素
public static T max(Collectio coll) {...}
public static T max(Collectio coll, Comparato comp) {...}
// 用新值替换集合中的所有旧值
public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) {...}
// 返回指定元素的出现次数。
public static int frequency(Collection c, Object o) {...}
// 使用指定元素,替换集合中的所有元素。
public static void fill(List list, T obj) {...}
// 3、同步控制
// 返回线程安全的集合对象
public static Collection synchronizedCollection(Collection c) {...}
public static List synchronizedList(List list) {...}
public static Set synchronizedSet(Set s) {...}
public static Map synchronizedMap(Map m) {...}
}