Collection接口

package 前七天整体复习.集合体系;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Predicate;
public class CollectionDemo01 {
    public static void main(String[] args) {
        //Collection是所有单列集合的超类(根类),也就是说所有单列集合都继承自Collection,也都继承了它的一些方法
        //它下面还有两个集合体系,1.List集合体系 2.Set集合体系 ,两个集合体系都有独特的特点,这里我们主要说明Collection类中的特有方法
        Collection<String> coll=new ArrayList<>(); //这里我们使用多态的形式创建coll集合,这样coll只能使用继承自Collection集合中的特有方法了

        //1.public void add(E e): 集合调用add方法,将参数元素e保存到集合中,e的类型表示泛型,必须与调用集合的泛型统一
        Collections.addAll(coll,"小白","小陈","小宝","大宝");
        System.out.println(coll);
        //拓展知识:我们知道打印对象其实是打印对象的地址值,可为什么直接打印Coll集合对象,却可以直接打印集合中的元素呢? 以下我们举例说明.
        int[] arr=new int[5];
        System.out.println(arr);
        //研究这一问题,我们需要先看一下println方法,它底层源码是用String的valueOf方法将对象转换成其字符串表示形式

而valueOf方法先判断对象是否为空,为空直接打印"null"字符串,不为空则让对象调用toString方法 

所以说直接打印对象和打印对象调用toString方法的结果是相同的内容,我们再看一下toString的底层源码   

可以发现toString方法其实就是打印了对象的"类名信息+@+十六进制数字",所以我们打印对象会直接返回地址值
ArrayList类重写了toString方法,使用toString方法使用的是重写后的逻辑,所以说它可以直接打印集合中的元素!
//2.public boolean remove(E e): 删除指定元素,返回是否删除成功,默认删除第一个元素
        boolean removeResult = coll.remove("小白");
        System.out.println(removeResult);
        //拓展知识:思考一下为何默认删除第一个元素呢?
        //通过源码分析:1.首先判断参数对象是否为空,如果传入参数为null,则遍历集合,查看是否也有元素为null值,如果有的话返回true,没有元素为null值则直接返回false;
        //2.遍历集合,让参数对象调用equals方法和每个元素去比较,如果为有相同的元素,直接删除这个元素并且返回true,如果遍历完集合没有找到相同元素则返回false

        //拓展问题:为什么要用参数对象调用equals方法去和每个元素对比,而不是让每个元素调用equals方法去和参数对象对比呢?
        //原因:上面我们已经判断过了,参数对象o到达这里肯定不为空,所以可以调用equals方法,而如果集合元素中有null值就无法调用equals方法,会报异常,所以只能让参数对象o去调用equals方法

        //我们通过源码分析可以看到,remove方法是通过遍历集合,也就是从第一个元素开始对比,当有相同元素并且删除后就直接return了,所以默认删除的是第一个元素!

//3.public boolean contains(Object o): 判断集合中是否有o元素,有则返回true,没有则返回false
        boolean containsResult1 = coll.contains("小陈");
        System.out.println(containsResult1); //true
        boolean containsResult2 = coll.contains("小黑");
        System.out.println(containsResult2); //false
 //4.public boolean addAll(Collection<? extends E>): 传入一个和调用对象数据类型相同的集合,将参数集合中的元素添加到调用者集合中
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"1","2");
        coll.addAll(list);
        System.out.println(coll); //[小陈, 小宝, 大宝, 1, 2]
//5.public T[] toArray();      这是个方法重载,调用无参方法可返回一个Object类型的数组,
        //  public T[] toArray(T[] a); 有参方法需传入一个指定类型的数组,长度无所谓,返回一个指定类型的数组
        Object[] objects = coll.toArray();
        String[] strArray = coll.toArray(new String[0]);
        System.out.println(Arrays.toString(objects));  //[小陈, 小宝, 大宝, 1, 2]
        System.out.println(Arrays.toString(strArray)); //[小陈, 小宝, 大宝, 1, 2]
        //为什么说指定的数组长度无所谓呢?
        //源码分析:1.首先会让参数数组的长度和集合长度进行对比,如果数组长度小于集合长度,就通过Arrays类的copyOf方法,传入集合的底层数组、集合数组的长度、形参指定数据类型),它会返回一个和集合底层数组长度相同的数组
        //而当参数数组长度大于集合长度,它会调用System类的arrayCopy方法,直接将集合数组中的元素复制到参数数组中。所以我们根本就不需要指定长度,指定数据类型类型即可

//6.public int size(): 返回当前集合有效元素的个数
        int collSize = coll.size();
        System.out.println(collSize);//5
//7.public boolean isEmpty(): 判断当前集合是否为空,为空返回true,不为空返回false
        boolean collEmpty = coll.isEmpty();
        System.out.println(collEmpty); //false
//8.public boolean removeIf(Predicate<? super String>filter): 自定义规则删除方法
        //Predicate是一个接口,接口中存在一个规则方法,我们可以简单理解为实现这个接口中的方法来自定义要删除的元素,这里使用匿名内部类的形式实现接口
        coll.removeIf(new Predicate<String>() {
            @Override
            public boolean test(String s) { //s表示集合中的每一个元素
                return s.equals("大宝");     //删除名称为大宝的元素
            }
        });
        System.out.println(coll); //[小陈, 小宝, 1, 2]

        coll.removeIf(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length()==2; //删除长度为2的元素
            }
        });
        System.out.println(coll); //[1, 2]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值