Java集合(1)——Collection

it2026-03-31  5

集合的引入

回顾数组:存储同一种数据类型的集合容器

数组的特点: 1.只能存储同一种数据类型的数据 2.一旦初始化,长度固定 数组中的元素与元素之间的内存地址是连续的

注意:Object类型的数组可以存储任意类型的数据。

需求:定义一个数组存储班级同学的兴趣爱好

如果数组存储兴趣爱好: String[ ] arr = new String[100];

public class Demo1 { public static void main(String[] args){ Object[] arr = new Object[4]; arr[0] = "abc"; arr[1] = 'a'; arr[2] = 1; arr[3] = 2.0; } }

集合

集合:集合是存储对象数据的集合容器。

集合比数组的优势: 1.集合可以存储任意类型的对象数据,数组只能存储同一种数据类型的数据。 2.集合的长度是会发生变化的,数组的长度是固定的。

1.集合的体系:

-----------|Collection:单例集合的根接口(从上往下学)

----------------|List:如果是实现了List接口的集合类,具备的特点:有序,可重复

----------------|Set:如果是实现了Set接口的集合类,具备的特点:无序,不可重复

2.Collection中的方法

(1)增加

(1)add(E e):添加成功返回true,添加失败返回false。 (2)addAll(Collection c):把一个集合的元素添加到另一个集合中。把c中的元素添加到调用这个方法的集合中去。

package Collection; import java.util.ArrayList; import java.util.Collection; /** * Collection中的添加方法 */ public class Demo2 { public static void main(String[] args){ Collection c = new ArrayList(); //多态 c.add("abc"); c.add(3.14); System.out.println("添加成功吗?"+c.add(1)); //add方法返回值是布尔类型 c.add("小令"); c.add("小徐"); c.add("小周"); c.add("小郭"); Collection c2 = new ArrayList(); c2.add("小王"); c2.add("小房子"); c.addAll(c2); //把c2的元素添加到c集合中 //不管存储多少元素,都会自动增长 System.out.println("集合的元素:"+c); } }

(2)删除

(1)clear():清空集合中的元素。 (2)remove(Object o):指定集合中的元素删除,删除成功返回true,删除失败返回false。 (3)removeAll(Collection c):c.removeAll(c2)//删除c集合中与c2的交集元素。 (4)c.retainAll(Collection c):保留c集合与c2集合的交集元素,其他的元素一并删除。

(3)查看

(1)size():查看元素个数。

package Collection; import java.util.ArrayList; import java.util.Collection; /** * Collection中的删除方法和查看方法 */ public class Demo3 { public static void main(String[] args){ Collection c = new ArrayList(); c.add("小令"); c.add("小徐"); c.add("小郭"); c.add("小周"); //c.remove("小徐"); //指定集合中的元素删除,删除成功返回true,删除失败返回false //c.clear(); // 清空集合的所有元素 System.out.println("集合的元素:"+c); Collection c2 = new ArrayList(); c2.add("小徐"); c2.add("小郭"); c2.add("小狗"); //c.removeAll(c2); System.out.println("集合的元素:"+c); c.retainAll(c2); //保留c集合中与c2的交集元素,其他的元素一并删除。 System.out.println("集合的元素:"+c); System.out.println("查看元素的个数:"+c.size()); } }

(4)判断

(1)contains(Object o):判断集合中是否存在指定的元素。其实contains方法内部是依赖于equals方法来比较的,所以重写equals方法。返回boolean类型。 (2)containsAll(Collection c):c.containsAll(c2):c集合是不是包含c2集合中的所有元素。 (3)isEmpty():判断集合是否为空。返回boolean类型。

package Collection; import java.util.ArrayList; import java.util.Collection; /** * Collection的判断方法 */ public class Demo4 { public static void main(String[] args){ /*Collection c = new ArrayList(); c.add("小令"); c.add("小徐"); c.add("小周"); System.out.println("判断集合是否为空:"+c.isEmpty()); System.out.println("判断集合中是否存在指定的元素:"+c.contains("小徐")); */ //集合添加自定义的元素 Collection c = new ArrayList(); c.add(new Person(110,"小娃")); c.add(new Person(112,"小胜")); c.add(new Person(113,"小铁")); //用到的是实参的equals的方法,所以如果要比较需要重写Dog类的equals方法 //c.contains(new Dog()); //如果现实生活中,只要身份证编号一致,就为同一人 //其实contains方法内部是依赖于equals方法来比较的,所以重写equals的方法 System.out.println("存在该元素吗?"+c.contains(new Person(112,"小单"))); //输出:集合的元素:[cn.itcast.collection.Person@139a55, cn.itcast.collection.Person@1db9742, cn.itcast.collection.Person@106d69c] //以上为toString方法输出的,如果想要看到创建对象的具体信息,可以重写toString方法 System.out.println("集合的元素:"+c); //containsAll方法: Collection c2 = new ArrayList(); //Collection是接口,不能创建对象,可以用多态,使用它的实现类去创建对象 c2.add(new Person(110, "小娃")); c2.add(new Person(112,"小胜")); c2.add(new Person(113,"陈丹")); //判断包含的条件是id,因为重写了equals方法 System.out.println("c集合有包含c2集合中的所有元素吗?"+c.containsAll(c2)); } } class Person{ int id; String name; public Person(int id, String name){ this.id = id; this.name = name; } public String toString(){ return "{编号:" + this.id + " 姓名:" + this.name + "}"; } public boolean equals(Object obj){ Person p = (Person) obj; return p.id == this.id; } public int hashCode(){ return this.id; } } class Dog{ }

(5)迭代

1.toArray():返回的是一个Object的数组,作用是把集合中的元素全部存储到一个Object的数组中返回。 (为什么返回的是Object的数组:因为集合中可以存储多种数据类型的数据以及对象数据) 2.iterator():返回一个迭代器对象。 迭代器的作用:就是用于抓取集合中的元素。 迭代器的方法: (1)hasNext():问是否有元素可以遍历,如果指针有指向元素,则返回true,否则返回false。 (2)next():获取元素,每次获取一个元素(获取当前指针指向的元素并返回当前的元素,然后指针向下移动一个单位)。 (3)remove():删除迭代器最后一次返回的元素。如果迭代器最后一次没有返回元素,则会报错。如直接it.remove 清空集合的元素 while(it.hasNext()){ it.next(); it.remove(); }

迭代器iterator的工作原理:

(1)toArray()

package Collection; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; /** * collection中的迭代方法:toArray() */ public class Demo5 { public static void main(String[] args){ /*Collection c = new ArrayList(); c.add("小令"); c.add("小徐"); c.add("小周"); System.out.println("集合的元素:"+c); Object[] arr = c.toArray(); System.out.println("数组的元素:"+Arrays.toString(arr)); */ Collection c = new ArrayList(); c.add(new Person(111,"小娃")); c.add(new Person(112,"小胜")); c.add(new Person(113,"小铁")); //需求:把编号是110的人信息输出 Object[] arr = c.toArray(); int len = arr.length; for(int i=0; i<len; i++){ //从Object数组中取出的元素只能使用Object类型声明变量接收,如果需要其他的类型则需要进行强制类型转换。 Person p = (Person)arr[i]; //arr[i]为Object对象,需要强制类型转换 if(p.id == 110){ System.out.println(p); } } } }

(2)iterator()

collection中的迭代方法:iterator() 迭代器的作用:就是用于抓取集合中的元素 迭代器的方法: 1、hasNext():问是否有元素可以遍历,如果指针有指向元素,则返回true,否则返回false 2、next():获取元素,每次获取一个(获取当前指针指向的元素并返回当前的元素,然后指针向下移动一个单位) 3、remove():在集合中删除迭代器最后一次返回的元素。 NoSuchElementException:没有元素的异常,在迭代器异常中非常常见

package Collection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * collection中的迭代方法:iterator() * 迭代器的作用:就是用于抓取集合中的元素 * 迭代器的方法: * 1、hasNext():问是否有元素可以遍历,如果指针有指向元素,则返回true,否则返回false * 2、next():获取元素,每次获取一个(获取当前指针指向的元素并返回当前的元素,然后指针向下移动一个单位) * 3、remove():在集合中删除迭代器最后一次返回的元素。 * NoSuchElementException:没有元素的异常,在迭代器异常中非常常见 */ public class Demo6 { public static void main(String[] args){ Collection c = new ArrayList(); c.add("小娃"); c.add("小胜"); c.add("小单"); c.add("小郭"); //遍历集合的元素方法: //方式1:使用toArray()方法,把集合的元素存储到一个Object的数组中返回。 Object[] arr = c.toArray(); for (int i=0; i<arr.length; i++){ System.out.println(arr[i] + ","); } //要求使用iterator()迭代器遍历 Iterator it = c.iterator(); //返回一个迭代器对象,相当于盲盒中的那个爪子 //为什么iterator方法返回的是一个接口类型(接口不能创建对象),为什么接口又可以调用方法可以使用呢? //iterator实际上返回的是iterator接口的实现类对象,查看ArrayList类中的iterator的源代码(见下面的Demo) System.out.println("有元素可以遍历吗?"+it.hasNext()); // while (it.hasNext()){ // System.out.println("获取元素:"+it.next()); // } // for(int i=0; i<c.size(); i++){ // System.out.println("获取元素:"+it.next()); // } // System.out.println("获取元素:"+it.next()); //再次获取会出现异常,NoSuchElementException it.next();//小娃 it.next();//小胜 it.remove(); //删除迭代器最后一次返回的元素 System.out.println("集合的元素:"+c); //清空集合的元素 while(it.hasNext()){ it.next(); it.remove(); } System.out.println("集合的元素:"+c); } }

为什么iterator方法返回的是一个接口类型(接口不能创建对象),为什么接口又可以调用方法可以使用呢? iterator实际上返回的是iterator接口的实现类对象,查看ArrayList类中的iterator的源代码(见下面的Demo)

package Collection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; interface Money{ public void makeMoney(); } class Student implements Money{ public void makeMoney(){ System.out.println("学生在学习..."); } } class Worker implements Money{ public void makeMoney(){ System.out.println("工人在赚钱..."); } } public class Demo7 { public static void main(String[] args){ Money m = test(); //返回的是接口的实现类对象,使代码的拓展性更高 } public static Money test(){ //为什么这里不用Worker呢? //如果用worker的话,下面就只能new Worker(),不能new Student(),从而方便使用多态,所以用Money得到代码拓展性更高。 return new Worker(); } }
最新回复(0)