合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] >[success] # Collection 1. `java.util.Collection`接口是**List**接口、**Queue**接口以及**Set**接口的父接口,因**此该接口里定义的方法既可用于操作List集合,也可用于操作Queue集合和Set集合** ![](https://img.kancloud.cn/0a/5c/0a5c23bf055f7fc7d08b107732f3e26d_1027x393.png) |方法声明 |功能介绍| |--|--| |boolean add(E e); |向集合中添加对象| |boolean addAll(Collection<? extends E> c)|用于将参数指定集合c中的所有元素添加到当前集合中| |boolean contains(Object o); |判断是否包含指定对象| |boolean containsAll(Collection<?> c) |判断是否包含参数指定的所有对象| |boolean retainAll(Collection<?> c) |保留当前集合中存在且参数集合中存在的所有对象| |boolean remove(Object o); |从集合中删除对象| |boolean removeAll(Collection<?> c) |从集合中删除参数指定的所有对象| |void clear(); |清空集合| |int size();| 返回包含对象的个数| |boolean isEmpty(); |判断是否为空| |boolean equals(Object o)| 判断是否相等| |int hashCode() |获取当前集合的哈希码值| |Object[] toArray()| 将集合转换为数组| |Iterator iterator()| 获取当前集合的迭代器| * 因为Collection 是 最上级接口 因此 `ArrayList `类也具备接口方法实现,所以下面案例用`ArrayList ` 作为案例使用 接口方法 >[danger] ##### add/ addAll ~~~ import java.util.ArrayList; import java.util.Collection; public class CollectionTest { public static void main(String[] args) { // Collection c1 = new Collection(); // 接口不能实例化,也就是不能创建对象 // ArrayList 实现了接口 Collection 因此接口类型的引用指向实现类的对象,形成了多态 Collection arr = new ArrayList(); // 自动调用toString方法,调用ArrayList类中的toString方法,默认打印格式为:[元素值1, 元素值2, ...] // 质上就是打印集合中的每个对象,也就是让每个对象调用对应类的toString方法 System.out.println(arr); // [] // 1. ----- 使用add向集合中添加元素,add 添加需要是 对象类型 ,添加成功后返回布尔类型 --------------- boolean b1 = false; arr.add(new String("w")); arr.add(Integer.valueOf(10)); arr.add(100); // 自动装箱机制 将基本类型变成对象 // arr.add(new Person("name")); // 添加一些自定义类对象 b1 = arr.add("y"); // 保存常量字符串 System.out.println(b1); // true int[] ls = { 1, 2, 3, 4, 5 }; arr.add(ls); // Person 想让自定义对象打印格式自定需要重写toString 方法 // 没有重新数组的toString 方法 因此打印出来是数组的内存地址 System.out.println(arr); // [w, 10, 100, y, [I@123772c4] // 2. -------是用addAll 将一个集合中的值都添加到另一个集合中 -------- Collection arr1 = new ArrayList(); arr1.add("c"); arr1.addAll(arr); System.out.println(arr1); // [c, w, 10, 100, y, [I@123772c4] } } ~~~ >[danger] ##### contains/ containsAll 1. `contains` 原理`Objects.equals(o, e)`,其中**o代表contains方法的形式参数,e代表集合中的每个元素**,对象与集合中已有对象的地址相同 或对象不为空,则对象调用equals方法与集合中已有元素相等(比较的方式调用Objects中的equals方法,自定义对象可以重写equals方法) ~~~ public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } ~~~ ~~~ import java.util.ArrayList; import java.util.Collection; public class CollectionTest { public static void main(String[] args) { Collection arr = new ArrayList(); arr.add("2"); arr.add(2); // contains 判断集合中是否包含参数指定的单个元素 boolean b1 = arr.contains("2"); System.out.println(b1); // true // 判断当前集合中是否包含参数指定集合的所有元素 Collection arr1 = new ArrayList(); arr1.add(2); // arr["2" , 2] 中的元素是否都存在arr1 [2]中 System.out.println(arr1.containsAll(arr)); // false // arr1 [ 2] 中的元素是否都存在arr ["2" , 2] 中 System.out.println(arr.containsAll(arr1)); // true } } ~~~ >[danger] ##### retainAll -- 交集 1. 计算两个集合的交集并保留到当前集合中,如果生成新的集合返回`true `否则`false` ~~~ import java.util.ArrayList; import java.util.Collection; public class CollectionTest { public static void main(String[] args) { Collection arr = new ArrayList(); arr.add(1); Collection arr1 = new ArrayList(); arr1.add(2); arr1.add(3); arr1.add(4); boolean b = arr.retainAll(arr1); System.out.println(b); // true 没有交集导致arr 被更新为空集合 [] System.out.println(arr); // [] // ------------------------------------ Collection arr2 = new ArrayList(); arr2.add(1); arr2.add(3); Collection arr3 = new ArrayList(); arr3.add(2); arr3.add(3); arr3.add(4); b = arr2.retainAll(arr3); System.out.println(b); // true 没有交集导致arr 被更新为空集合 [3] System.out.println(arr2); // [3] b = arr3.retainAll(arr3); System.out.println(b); // false 自己和自己交集没有值改变 } } ~~~ >[danger] ##### remove/removeAll 1. remove方法的工作原理:Objects.equals(o, e) ~~~ import java.util.ArrayList; import java.util.Collection; public class CollectionTest { public static void main(String[] args) { Collection arr = new ArrayList(); arr.add(1); arr.add(12); arr.add(122); // 删除单个元素 remove方法的工作原理:Objects.equals(o, e) boolean b = arr.remove(1); // 删除存在返回true System.out.println("b = " + b); // b = true System.out.println("arr = " + arr); // arr = [12, 122] b = arr.remove("one"); // 删除不存在返回false System.out.println("b = " + b); // false System.out.println("arr = " + arr); // arr = [12, 122] Collection arr1 = new ArrayList(); arr1.add(12); b = arr.removeAll(arr1); System.out.println("b = " + b); // b = true System.out.println("arr = " + arr); // arr = [122] } } ~~~ >[danger] ##### clear / size /isEmpty /equals ~~~ import java.util.ArrayList; import java.util.Collection; public class CollectionTest { public static void main(String[] args) { Collection arr = new ArrayList(); arr.add(1); arr.add(12); arr.add(122); // 是否为空 boolean b = arr.isEmpty(); System.out.println(b); // false // 获取个数 int size = arr.size(); System.out.println(size); // 3 // 清空集合中的所有元素 arr.clear(); b = arr.isEmpty(); System.out.println(b); // true arr.add(4); arr.add(5); Collection arr1 = new ArrayList(); arr1.add(4); arr1.add(5); // 两个集合并判断是否相等 b = arr1.equals(arr); System.out.println(b); // true } } ~~~ >[danger] ##### 集合 数组互相转换 -- toArray 1. 通常认为:集合是用于取代数组的结构,因为Object 是所有对象父类因此是**Object 数组类型** ~~~ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; public class CollectionTest { public static void main(String[] args) { Collection arr = new ArrayList(); arr.add(1); arr.add(12); arr.add(122); // 实现集合和数组类型之间的转换 通常认为:集合是用于取代数组的结构 // 实现集合向数组类型的转换 Object[] objects = arr.toArray(); System.out.println("数组中的元素有:" + Arrays.toString(objects)); // 数组中的元素有:[1, 12, 122] // 实现数组类型到集合类型的转换 Collection objects1 = Arrays.asList(objects); System.out.println("集合中的元素有:" + objects1); // 集合中的元素有:[1, 12, 122] } } ~~~