1、为什么要使用集合?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的方式。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的变量。
2、关注各种方法的使用
①其中add()方法中的参数类型为Object类型,方便接受各种不同数据类型的数据。
②值的注意的是contains()方法,当其中参数为自定义对象时,需要在自定义类中重写equals()方法,因为contains()方法中是通过equals()方法比较的对象内容,在其他参数传入是,例如int等基本数据类型会自动装箱为包装类,而包装类中已经重写了equals()方法,同样传入的String类型数据对象也在String类中重写了equals()方法,所以,在自定义类中需要将equals()对象重写,否则会默认比较地址,从而产生不符合预期的操作结果。
Person类:
package com.maweirdos.java0517;
import java.util.Objects;
/**
* @author MaWeirdos
* @create 2022-05-17 10:44
*/
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
}
测试类:
@Test
public void test(){
Collection coll = new ArrayList();
coll.add(123);
coll.add("李明");
coll.add(new String("Tom"));
coll.add(new Person("jim",12));
boolean s1 = coll.contains(new Person("jim",12));
System.out.println(s1);
}
若Person类中没有重写equals()方法,则打印s1则会显示false,重写equals()方法后,s1打印结果为true。
③asList()方法也是值得注意的点:
为什么使用asList()将需要转换的数组作为 asList 方法的参数,再判断其size大小得到的不是我们想要的答案?
asList() 方法的参数必须是对象或者对象数组,而原生的基本数据类型不是对象——这也正是包装类出现的一个主要原因。当传入一个原生数据类型数组时,asList 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组。
为什么asList不支持动态扩容?
asList 方法后面,有这样一个内部类也叫 ArrayList,更重要的是在这个内部类中有一个被声明为 final 的数组 a,所有传入的元素都会被保存在这个数组a中。到此,谜底揭晓了: asList 方法返回的确实是一个 ArrayList ,但这个 ArrayList 并不是java.util.ArrayList,而是 java.util.Arrays的一个内部类。这个内部类用一个 final 数组来保存元素,因此用 asList 方法产生的 ArrayList是不可修改大小的。
④iterator接口,一个专门用来遍历集合元素的接口
首先问题:为什么创建Collection对象后可以直接调用iterator()方法?答:集合中已经实现了iterator接口,例如在ArrayList集合中继承了AbstractList,其中AbstractList中实现了iterator接口。
iterator中的hasNext() 和 next()可以通过指针理解,默认游标都在集合元素之前,类似于在头指针位置。两个联合使用来遍历集合元素:
while(iterator.hasNext()){
//next():①指针下移 ②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}