单列集合框架结构

  • Collection接口:单列集合,用来存储一个一个对象
    • List接口:存储有序的。可重复的数据 –>”动态”数组
    • ArrayList、LinkedList、vector
  • Set接口:存储无序的、不可重复的数据 –>高中讲的”集合”
    • HashSet、LinkedHashSet、TreeSet

image-20220715163516340

Collection接口中常用的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
* Collection接口中声明的方法的测试
* 向Collection接口的实现类的对象中添加数据obj时,要求obj所在类中重写equals();
* */
public class CollectionTest {
@Test
public void test1(){
ArrayList<Object> list = new ArrayList<>();//ArrayList中定义泛型是为了数据中的数据类型
list.add(123);
list.add(456);
list.add(new String("Tom"));
list.add(false);
list.add(new Person("Jerry",12));
for (Object list1:list){
System.out.println(list1);
}

//1.contains(Object obj):判断当前集合中是否包含obj
//我们在判断时会调用obj对象所在类的equals()方法
boolean contains = list.contains(123);
System.out.println(contains);
System.out.println(list.contains(new String("Tom")));
System.out.println(list.contains(new Person("Jerry",12)));

//2.containsAll(Collection coll1):判断形参coll1中的所有元素是否都存在于当前集合中
System.out.println(list.containsAll(list));//返回true

//3.remove(Object obj):从当前集合中移除obj元素
list.remove("Tom");
list.remove(new Person("Jerry",12));
for (Object list2:list){
System.out.println(list2);//[123,456, Person{name='Jerry', age=20}, false]
}

//4.removeAll(Collection coll1):从当前集合中移除coll1中的所有元素
//list.removeAll(list);
System.out.println(list);//输出为空


//5.retainAll(Collection coll1):交集:获取当前集合和从coll1集合的交集,并返回给当前集合
List<Integer> asList = Arrays.asList(123, 456, 789);//asList(T... a)返回的是一个固定大小的list集合,这里返回[123,456,789]
//list.retainAll(asList);
System.out.println(list);


//6.equals(Object obj):要想返回true,需要当前集合和形参集合元素都相同
ArrayList<Object> list3 = new ArrayList<>();
list.add(123);
list.add(456);
list.add(false);
System.out.println(list.equals(list3));//输出为false
}

@Test
public void test5(){
ArrayList<Object> list = new ArrayList<>();
list.add(123);
list.add(456);
list.add(new String("Tom"));
list.add(false);
list.add(new Person("Jerry",12));

//7.hashCode():返回当前对象的哈希值
System.out.println(list.hashCode());

//8.集合 -->数组:toArray
Object[] arr = list.toArray();
for (Object o:arr){
System.out.println(o);
}

//拓展:数组 -->集合:调用Array类的静态方法aList()
List<String> list1 = Arrays.asList(new String[]{"AA", "BB", "CC"});
System.out.println(list1);


}
}

Iterator接口与foreach循环

遍历Collection的两种方式

  • 使用迭代器Iterator
  • foreach循环(或增强for循环)

java.utils包下定义的迭代器接口:Iterator

说明

1
2
3
4
5
6
7
/**
1.Iterator对象称为迭代器(设计模式的一种),主要用于遍历Collection集合中的元素
2.GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节,迭代器模式,就是为容器而生
3.内部的方法:hasNext()和next()
4.集合对象每次调用iterator()方法得到一个全新的迭代器对象,从头开始遍历
5.内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()
*/

作用

1
2
3
/**
遍历集合Collection元素
*/

如何获取实例

1
2
3
/**
coll.iterator()返回一个迭代器实例
*/

遍历的代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    //'List接口:存储有序的。可重复的数据	-->"动态"数组'
@Test
public void Test1(){
ArrayList<Object> list = new ArrayList<>();//ArrayList中定义泛型是为了数据中的数据类型
list.add(123);
list.add(456);
list.add(new String("Tom"));
list.add(false);
list.add(new Person("Jerry",12));
//返回一个迭代器实例,返回一个数据集
Iterator<Object> iterator = list.iterator();
//hashNet():判断是否有下一个元素
while (iterator.hasNext()){
//next():1.指针下移 2.将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
}
}

图示说明

image-20220715214754123

remove()的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//测试Iterator中的remove()
//如果还未调用next()或在上一次调用next方法之后已经调用remove方法,再调用remove都会报IllegalStateException
//内部定义remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()
@Test
public void test3(){
ArrayList<Object> list = new ArrayList<>();//ArrayList中定义泛型是为了数据中的数据类型
list.add(123);
list.add(456);
list.add(new String("Tom"));
list.add(false);
list.add(new Person("Jerry",12));
System.out.println(list);
//删除集合中"Tom"
Iterator<Object> iterator = list.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
if ("Tom".equals(next)){
iterator.remove();
}
}
Iterator<Object> iterator1 = list.iterator();//上一个迭代器的指针指向最后一个元素,所以新创建一个迭代器指向第一个元素重新遍历
while (iterator1.hasNext()) System.out.println(iterator1.next());
}

增强for循环:(foreach循环)

遍历集合举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void test01(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);

//for(集合元素的类型 局部变量:集合对象)
//说明:内部仍然调用了迭代器
for (Object o : coll){
System.out.println(o);
}
}

遍历数组举例:

1
2
3
4
5
int[] a=new int[]{1,2,3,4,5,6};
//for(数组元素的类型 局部变量 : 数组对象)
for (int a1:a){
System.out.println(a1);
}