学习Collection接口中常用的方法(java.util.Collection)
1:Collection中能存放什么元素? 没有使用“泛型”之前,Collection中可以存储Object的所有子类型。
使用了“泛型”之后,Collection中只能存储某个具体的类型。
集合中不能直接存储基本类型,也不能存储java对象,只是存储java对象的内存地址。
2:Collection中的常用方法 boolean add(Object a);
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest {
public static void main(String[] args) {
Collection c = new ArrayList();
//创建一个集合对象(多态)
c.add(1200);
//自动装箱,实际是放进去了一个对象的内存地址 Integer x = new Integer(1200);
c.add(new Object());
}
}
获取集合中元素个数:c.size();
清空集合:c.clear();
boolean contains(Object o); //判断当前集合元素是否包含元素o
删除集合中某个元素:c.remove();
判断集合中元素是否为空: c.isEmpty() 源码是通过size()判断
把集合转换为数组:c.toArray() //Object[] obj = c.toArray();
3: 集合迭代 iterator() Collection的超级父接口叫:Iterable,而Iterable里面有个方法叫iterator*,这个方法返回一个Iterator对象,这个Iterator就是一个迭代器,可以遍历集合。这个方法被子接口Collection继承了。*
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/*
集合迭代专题
*/
public class CollectionTest01 {
public static void main(String[] args) {
//注意:以下迭代方式是所有Collection通用的一种方式
// 在Map集合中不能用。
//在所有的Collection以及子类中使用//Step 1创建集合对象
Collection c = new HashSet();
//后面的集合无所谓,主要看前面的Collection集合接口怎么迭代
c.add("abc");
c.add(100);
c.add("def");
c.add(new Object());
//对集合Collection进行迭代
//第一步:获取集合迭代器对象 Iterator
Iterator it =c.iterator();
//迭代器对象it最初并没有指向第一个元素
// 第二步:通过以上迭代器对象开始迭代集合
/*
迭代器的方法:boolean hasNext() 如果仍有元素,返回 true;
Object next() 返回迭代的下一个元素;
让迭代器前进一位,并且将当前指向的元素返回
*/
while (it.hasNext()){
Object obj = it.next();
//这里取出来的都是Object
System.out.println(obj);
// 在输出的时候转换为字符串,println调用了toString方法
}
}
}
!!! 集合结构只要一发生改变,迭代器必须重新获取!!!
文章图片
改进方案:直接使用迭代器对象的remove方法:
文章图片
原理是:迭代器底层有一个快照,会对集合的当前状态记录一个快照,在迭代的过程中会与原先的集合比对,如果发生了变化,就会报错。
文章图片
用迭代器删除是因为在删除快照的同时,也会删除原先集合的元素,这样迭代器与原先集合里面的数据保持一致。
4:集合Collection的contains方法 boolean contains(Object o)判断集合是否包含某个元素 o
CASE1:重写equals方法
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest03 {
public static void main(String[] args) {
Collection c = new ArrayList();
String s1 = new String("abc");
c.add(s1);
String s2 = new String("abc");
c.add(s2);
String x = new String("abc");
System.out.println(c.contains(x));
//返回true
}
}
文章图片
String的equals方法重写了,比较的是内容。
而contains方法底层用equals方法实现。
CASE 2 :没有重写equals方法`
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest04 {
public static void main(String[] args) {
Collection c = new ArrayList();
User u1 = new User("jack");
c.add(u1);
User u2 = new User("jack");
boolean b =c.contains(u2);
//比较内存地址,会调用Object的equals方法
//而object的equals方法比较的是内存地址
System.out.println(b);
//false
}}class User{
private String name;
public User(){}
public User(String name){
this.name = name;
}
//没有重写equals方法
}
CASE 3:自定义对象重写equals方法:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Objects;
public class CollectionTest04 {
public static void main(String[] args) {
Collection c = new ArrayList();
User u1 = new User("jack");
c.add(u1);
User u2 = new User("jack");
boolean b =c.contains(u2);
//此时的equals方式被重写了,比较的是内容,不再比较内存地址了
System.out.println(b);
//true
}}class User{
private String name;
public User(){}
public User(String name){
this.name = name;
}
//没有重写equals方法//重写equals方法后:只要姓名一样就表示同一个用户
public boolean equals(Object o){
if(this == o){
return true;
//表示这就是同一个对象
}
if(o == null || getClass() != o.getClass()) {return false;
}
User user = (User)o;
//转型
return user.name.equals(this.name);
//如果名字一样,表示同一个人(不再表示对象的内存地址了,比较的是内容
}
}
总结:放在集合中的元素要重写equals方法,如果不重写,contains方法默认比较的是对象的内存地址!!!
5:集合中的remove()方法 【JAVA基础之集合(二)】关键点在于是否重写了:equals方法
文章图片
推荐阅读
- 笔记|java集合
- java基础|String、StirngBuffer、StringBuilder的区别《区别|CSDN创作打卡》
- java基础|Java方法重写与重载的区别
- Java程序设计|Java——集合
- 1|java基础--5HashMap专题
- #|蓝桥杯31天冲刺打卡题解(Day6)
- 蓝桥杯|蓝桥杯AcWing学习笔记 6-1双指针的学习(附相关蓝桥真题(日志统计、完全二叉树的权值))
- #|蓝桥杯31天冲刺打卡题解(Day2)
- #|蓝桥杯31天冲刺打卡题解(Day1)