集合
Java集合类可以用于存储数量不等的多个对象,还可以用于保存具有映射关系的关联数组。
Java 集合可以分为Collection 和 Map 两种体系:
- Collection接口:单列数据,定义了存取一组对象的方法的集合
- List:元素有序,可重复的集合。
- set:元素无序,不可重复的集合。
- Map接口:双列数组,保存具有映射关系的key-value对的集合。
Collection接口
概述
Collection 接口是List、Set 和 Queue接口的父接口,该接口里的定义方法可以操作上面三个接口的集合。
优点:
- JDK 不提供此接口的任何直接实现,而是提供更具体的子接口(像Set 和 List )实现
- 在Java1.5之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型处理;安全性差,如果要保证安全性,就需要多次的对数据的类型进行检查。
- Java 5.0 开始增加泛型后,Java 集合可以在创建容器时就限定容器内对象的数据类型。
Collection具体方法
-
构造器
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); Collection list2 = new ArrayList(); list2.add(123); Collection list3 = new ArrayList(list2); System.out.println(list3); } }
-
添加 add (Object obj)
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); list.add(123); list.add("abc"); System.out.println(list); } }
-
添加 addAll(Collection collection)
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); list.add(123); list.add("abc"); Collection coll2 = new ArrayList(); coll2.add("abc"); list.addAll(coll2); System.out.println(list); } }
-
获取有效元素的个数int size()
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); list.add(123); list.add("abc"); System.out.println(list.size()); } }
-
清空集合 void clear()
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); list.add(123); list.add("abc"); list.clear(); System.out.println(list.size()); } }
-
是否清空集合 boolean isEmpty()
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); list.add(123); list.add("abc"); System.out.println(list.isEmpty()); } } // 输出结果:false
-
查看当前集合是否包含某个元素 boolean contains(Object obj): 是否通过元素的equals方法来判断是否是同一个对象
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); list.add(123); list.add("abc"); System.out.println(list.contains("abc")); } } // 输出结果:true
-
看当前集合是否包含某个元素boolean containsAll(Collection c):也是调用元素的equals方法来比较的。拿两个集合的元素挨个比较。
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); list.add(123); list.add("abc"); Collection list2 = new ArrayList(); list2.add(123); System.out.println(list.containsAll(list2)); } } // 输出结果:true
-
删除boolean remove(Object):通过元素的equals方法判断是否要删除的那个元素。只会删除找到的第一个元素。
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); list.add("Hello"); list.add("World"); list.remove("Hello"); list.remove("World"); System.out.println(list); } }
-
boolean removeAll(Collection coll): 取当前集合的差集
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection list = new ArrayList(); Collection list2 = new ArrayList(); list.add("a"); list.add("b"); list2.add("c"); boolean b = list.containsAll(list2); System.out.println(b); System.out.println(list); } } // 输出:false // [a,b]
-
取两个集合的交集boolean retainAll(Collection collection): 把交集的结果存在当前集合中,不影响传入集合。 ????????
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection coll1 = new ArrayList(); Collection coll2 = new ArrayList(); coll1.add(123); coll1.add(234); coll2.add(555); boolean b = coll1.retainAll(coll2); System.out.println(b); System.out.println(coll1); coll2.add(456); boolean c = coll1.retainAll(coll2); System.out.println(c); System.out.println(coll1); } } // true // [] // false // []
-
集合是否相等 boolean equals(Object obj)
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection coll1 = new ArrayList(); Collection coll2 = new ArrayList(); coll1.add("abc"); coll2.add("abc"); System.out.println(coll1.equals(coll2)); } } // 输出结果:true
-
转成对象数组 Object[] toArray()
import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; public class Main { public static void main(String[] args) { Collection collection= new ArrayList(); collection.add("1"); collection.add("2"); Object[] objects = collection.toArray(); System.out.println(Arrays.toString(objects)); } }
-
获取集合对象的哈希值 String hashCode()
import java.util.ArrayList; import java.util.Collection; public class Main { public static void main(String[] args) { Collection collection= new ArrayList(); Collection collection2= new ArrayList(); System.out.println(collection2.hashCode()); } } // 输出结果:1
-
遍历iterator() : 返回迭代器对象,用于集合遍历
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Main { public static void main(String[] args) { Collection collection = new ArrayList(); collection.add("a"); collection.add("b"); collection.add("c"); Iterator it = collection.iterator(); for (int i = 0; i < collection.size(); i++) { System.out.println(it.next()); } } } // a // b // c
Iterator迭代器
-
概述
- Iterator对象成为迭代器(设计模式的一种),主要用于遍历Collectiom 集合中的元素。
- 设计模式给迭代器模式定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需要暴露该对象的内部细节
- 迭代器模式:就是为容器而生。类似于"公交车上的售票员"
-
迭代器
- Collection 接口继承了java.lang.Iterable 接口,该接口有一个iterator()方法,那么所有实现了Collection 接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator 接口的对象。
- Iterator 仅用于遍历集合,Iterator本身并不提供承装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。
- 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认角标在集合的第一个元素值之前
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Main { public static void main(String[] args) { Collection collection = new ArrayList(); collection.add("a"); collection.add("b"); collection.add("c"); Iterator it = collection.iterator(); while (it.hasNext()){ Object next = it.next(); System.out.println(next); } System.out.println(collection); } } // a // b // c // [a, b, c]
-
注意:
-
Iterator 可以删除集合的元素,但是是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法。
-
如果调用remove之前没有调用next是不合法的,会抛出IllegalStateException在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。
-
使用foreach循环遍历集合元素
-
Java 5.0 提供了 foreach 循环迭代访问 Collection和数组。
-
遍历操作不需获取Collection或数组的长度,无需使用索引访问元素。
-
遍历集合的底层调用Iterator完成操作。
-
foreach还可以用来遍历数组。
-
-
List 集合
-
概述
- Java List 接口是 Java Collections Framework 的成员。
- List 允许添加重复元素
- List 允许拥有“NUll” 元素
- List 接口在Java 8 中有许多默认方法,列如replaceAll,sort和spliterator
- 列表索引从0开始,就像数组一样
- List 支持泛型,我们尽可能使用它。将Generics 与 List 一起使用将运行时避免ClassCastException
-
列表类图
- Java List 接口扩展了 Collection 接口
- 集合界面 extends Iterable 接口
- 一些最常用的List实现类时ArrayList,LinkedList,Vector,Stack,CopyOnWriteArrayList。
- AbstractList提供了List接口的骨干实现,以减少实现List的工作量。
-
list的各种方法
-
int size() : 获取列表中元素的数量。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List list = new ArrayList(); list.add("sdaa"); System.out.println(list.size()); } } // 输出结果为1
-
boolean isEmpty() : 检查列表是否为空
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List list = new ArrayList(); list.add("sdaa"); System.out.println(list.isEmpty()); } } // 输出结果为false
-
boolean contains(Object o ) :如果此列表包含指定的元素,则返回true
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List list = new ArrayList(); list.add("sdaa"); list.add("123"); System.out.println(list.contains("123")); } }
-
Iterator iterator() : 以适当的顺序返回此列表中元素的迭代器。
-