集合:
Collection(接口)大爹:
单列集合,他有两个重要的接口,List接口和Set接口
- List :有索引、存取有序、可重复。
- Set :无索引、存取无序(LinkedHashSet除外)、不重复。
Collection方法: 当遇到共性的方法时(因为其实现类俩接口Set
和List
,他会尊重最低的要求,比如 删除
它不能根据索引删除,因为Set
无索引
其中比较特殊的方法:
1、contains(Object o)
contains(Object o) :
如果此列表包含指定的元素,则返回 true 。
注意:当需要判断自定义对象是否包含于集合中时,需要在自定义方法中重写equals()方法,contains()方法本质是调用equals()方法进行判断
举例说明:
自定义一个类,并且重写equals方法,在里面添加一句
equals方法已被调用。。。
import java.util.Objects;
public class T {
private int age;
private String name;
public T(int age,String name){
this.age=age;
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
System.out.println("equals方法已被调用。。。");
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
T t = (T) o;
return age == t.age && Objects.equals(name, t.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
}
定义一个测试类:
import java.util.ArrayList;
import java.util.Collection;
public class Test1 {
public static void main(String[] args) {
Collection c1=new ArrayList();
c1.add(123);
c1.add(321);
c1.add(new String ("引用类型"));
T tt=new T(19,"净澄");
c1.add(tt);
System.out.println(c1.contains(new T(19, "净澄")));
}
}
结果:
equals方法已被调用。。。
equals方法已被调用。。。
equals方法已被调用。。。
equals方法已被调用。。。
true
Process finished with exit code 0
分析结果:
为什么判断new T(19, "净澄")
是否包含于c1集合时,equals方法已被调用。。。
会被执行四次?
因为ArraryList是有序的,所以会先从第一个位置的数据进行判断,上面需要判断的对象是第四个,所以需要判断四次
因此添加自定义类在对象中时,必须要再在自定义类中重写equals方法
重点黑马新学(接上面):如果存入的是自定义对象,那么就需要重写
equals()
,在上面的代码中发现先存进去了一个对象tt
,然后再将集合与一个一摸一样的tt
进行比较,如果没有重写equals()
那么将返回false,因为contains
方法中的equals()
是比较地址值,(用快捷键alt+insert
自动出来的equals()
方法是对比属性值,就不是地址值了)
迭代器(Iterator):
- Collection接口实现了Iterator接口
- 迭代器中有类模板,类似于指针,遍历完数据后,就指向了最后一个位置
- 集合将集合中的元素值给迭代器,而不是将元素直接给迭代器,因此,在迭代器中不可以进行集合的操作,但是可以用迭代器特有的remove()方法对集合进行操作,就是能够对迭代器外的集合(传入元素值的那个集合) 进行操作
- 黑新: 1、迭代器不会复位,指针指向了最后一个那么就不会再回到最开始的位置,想要再遍历一次就需要重新获取迭代器
2、在指针已经到了最后一位时,再强行调用.next()
方法,就会报错
3、迭代器不依赖索引,是创建指针再移动指针
使用迭代器遍历集合::黑新: hasNext():有元素返回true
,否则…,
next():获得当前元素并且指针指向下一个;这俩打配合,就可以遍历出所有元素
//先创建一个ArrayList集合,在执行下面的方法
Collection<String> c2=new ArrayList<>();
c2.add("xixi");
c2.add("haha");
Iterator iterator=c2.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next()+"\t");
}
结果:
123 321 引用类型 collection.T@a5bd2
集合对象 . toArray()和数组对象 . asList():
toArray():将集合转换为数组
as.List():将数组转换为集合
toArray():
将集合c2转换为数组arr,然后遍历
Object[] arr =c2.toArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
as.List():
将数组转换为集合,但是要注意:集合不能存储基本数据类型,所以不能存储int,long等等基本数据类型
List<Integer> ob=Arrays.asList(new Integer[]{12,65});
Iterator iterator1 =ob.iterator();
while(iterator1.hasNext()){
System.out.println(iterator1.next());
}
List:
有一些特有的方法:
- add():会将指定位置上的元素往后挤一挤
- remove():参数为
index s
:输入指定索引返回删除的内容;参数为Object o
:输入指定对象,返回是否删除成功