集合类库的学习

概述

  • 当需要在Java程序中记录单个数据内容时,则声明一个变量。
  • 当需要在Java程序中记录多个类型相同的数据内容时,声明一个一维数组。
  • 当需要在Java程序中记录多个类型不同的数据内容时,则创建一个对象。
  • 当需要在Java程序中记录多个类型相同的对象数据时,创建一个对象数组。
  • 当需要在Java程序中记录多个类型不同的对象数据时,则准备一个集合

框架结构

  • Java中集合框架顶层框架是:java.util.Collection集合 和 java.util.Map集合
  • Collection集合中存取元素的基本单位是:单个元素。
  • Map集合中存取元素的基本单位是:单对元素

插入ArrayList()的知识

ArrayList 是一个数组队列,相当于是一个动态数组,它的容量能动态增长,但ArrayList中的操作不是线程安全的,在单线程中才使用ArrayList

Collection集合

java.util.Collection接口是List接口、Queue 接口以及Set接口的父接口,因此该接口里定义的方法既可用于操作List集合,也可用于操作Queue集合和Set集合
同时:接口是不能用来new对象的。即Collection c1 = new Collection()是不行的
在这里插入图片描述

public class CollectionTest {
    
    

    public static void main(String[] args) {
    
    
        //1.准备一个Collection集合并打印
        //接口类型的引用指向了实现类的对象,形成多态
        Collection c1 = new ArrayList();
        //自动调用ArrayList()类中的toString方法 默认打印格式为:[元素值1, 元素值2,...]
        System.out.println("集合中的元素有:"+c1);//啥也没有[]
        System.out.println("-----------------------");

        //2.向集合中添加单个元素并打印
        boolean b1 = c1.add(new String("one"));
        System.out.println("b1="+b1);//true
        System.out.println("集合中的元素有:"+c1);

        b1 = c1.add(Integer.valueOf(2));
        System.out.println("b1="+b1);//true
        System.out.println("集合中的元素有:"+c1);//[one,2]

        b1 = c1.add(new Person("张飞",30));
        System.out.println("b1="+b1);//true
        System.out.println("集合中的元素有"+c1);//[one,2,]

        //3.向集合中添加多个元素并打印
    }
}
    }
}

Person类内容如下
在这里插入图片描述

结果如下:
在这里插入图片描述
c1集合中最后一个元素就是Person类中的toString()方法
打印集合中的所有元素时,本质上就是打印集合中的每个对象,也就是让每个对象调用对应类的toString()方法
String()类和Integer()类中也有toString()方法的(Java官方重写过)

添加多个元素

//3.向集合中添加多个元素并打印
        Collection c2 = new ArrayList();
        c2.add("three");
        c2.add(4);//自动装箱机制
        System.out.println("c2="+c2);//[three,4]
        //将c2中的所有元素全部添加到c1中
        b1=c1.addAll(c2);
        System.out.println("b1="+b1);
        System.out.println("c1="+c1);//[one, 2, Person{name='张飞', age=30},three,4]

在这里插入图片描述
addAll就是将集合c2中的元素一个个一次添加到集合c1中

笔试考点

//笔试考点
        b1=c1.add(c2);
        System.out.println("b1="+b1);
        System.out.println("c1="+c1);

结果
在这里插入图片描述
把c2当作一个整体放进去,有中括号

Collection集合判断单个元素是否存在

在这里插入图片描述
注意这里contain的参数是Object类型的,意味着形参可以传任意形式的对象

//判断集合中是否包含参数指定的单个元素
        b1=c1.contains(new String("one"));
        System.out.println("b1="+b1);//true

        b1=c1.contains(new String("two"));
        System.out.println("b1="+b1);//false

        b1=c1.contains(Integer.valueOf(2));
        System.out.println("b1="+b1);//true

        b1=c1.contains(new Person("张飞",30));
        System.out.println("b1="+b1);//false

在这里插入图片描述
对于最后一段代码,明明c1集合中内容为[one, 2, Person{name=‘张飞’, age=30}, three, 4, [three, 4]],有对应元素,但b1=c1.contains(new Person("张飞",30));为false,是因为:

此处先插入 == 和 equals 的区别

  • 使用==进行比较的时候,比较的是他们在内存中的存放地址,所以只有同一个new出来的对象,他们的比较后的结果才会为true
  • Java中所有的类都是继承于Object,在Object中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址
  • 但在一些类库如String,Integer,Date在这些类当中这个方法被覆盖掉了,equals被重写了,不再是比较类在堆内存中的存放地址了。(如仅会比较内容,而不是地址)
  • 在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值

插入结果,承接上文

  • contains方法的工作原理是:Objects.equals(o,e),其中o代表contains方法的形式参数,e代表集合中的每个元素
  • 也就是说contains 拿着参数对象与集合中已有的元素依次进行比较,比较的方式调用Objects.equals
  • 而Person类中没有重写equals方法,则调用从Object类中继承下来的equals方法,比较两个对象的地址,所以为false
  • 在Person()中重写equals方法可解决这个问题

Collection判断所有元素是否存在

在这里插入图片描述

System.out.println("-----------------------");
        System.out.println("c1="+c1);
        //判断当前集合中是否包含参数指定集合的所有元素
        Collection c3 = new ArrayList();
        c3.add(4);
        System.out.println("c3="+c3);//[4]
        //判断c1中是否包含c3中所有元素
        b1=c1.containsAll(c3);
        System.out.println("b1="+b1);//true

        c3.add("five");
        System.out.println("c3="+c3);//[4,five]
        b1=c1.containsAll(c3);
        System.out.println("b1="+b1);//false

结果如下
在这里插入图片描述

Collection中containsAll的笔试考点

//笔试考点
        System.out.println("c1="+c1);
        System.out.println("c2="+c2);
        b1 = c1.containsAll(c2);//true
        System.out.println("b1="+b1);
        //判断集合c1中是否有集合c2这个整体为单位的元素
        b1 = c1.contains(c2);
        System.out.println("b1="+b1);

在这里插入图片描述

注意!

addAll是把元素一个个加进去,如果addAll了一个a集合,就不会再有以a集合整体为元素的值的,会返回false,上面是因为c1里有个
在这里插入图片描述

Collection集合实现交集的计算

在这里插入图片描述
这个方法的返回值取决于当前集合是否发生改变,如果此集合因此发生改变就返回true

System.out.println("-----------------------");
        //计算两个集合的交集并保留到当前集合中
        System.out.println("c2="+c2);//[three, 4]
        System.out.println("c3="+c3);//[4, five]
        b1 = c2.retainAll(c2);//当前集合中元素没有发生改变
        System.out.println("b1="+b1);
        System.out.println("c2="+c2);

        //计算集合c2和c3的交集并保留到c2中,取代集合c2中原有数值
        b1 = c2.retainAll(c3);
        System.out.println("b1="+b1);
        System.out.println("c2="+c2);
        System.out.println("c3="+c3);

在这里插入图片描述
返回值只看当前集合中元素是否有发生改变

Collection集合实现元素的删除

在这里插入图片描述

//实现集合中单个元素和所有元素得删除操作
        System.out.println("c1="+c1);
        //删除参数指定的单个元素
        b1 = c1.remove(1);
        System.out.println("b1="+b1);//false

        b1 = c1.remove("one");
        System.out.println("b1="+b1);//true
        System.out.println("c1="+c1);

在这里插入图片描述
remove方法工作原理也是 Object.equals(o,e)

实现集合中所有元素的删除操作

//实现集合中所有元素的删除操作
        System.out.println("c3="+c3);//[4, five]
        System.out.println("c1="+c1);//[4, five]
        //从集合c1中删除c3中的所有元素
        b1 = c1.removeAll(c3);
        System.out.println("b1="+b1);//c1改变了就true true
        System.out.println("c1="+c1);
        System.out.println("c3="+c3);

在这里插入图片描述
本质上是一个一个元素进行删除,有元素则删除,没有则不删除

Collection集合中其他方法的测试

在这里插入图片描述

//实现集合中其他方法的测试
        System.out.println("c1="+c1);
        System.out.println("集合中元素的个数为:"+c1.size());
        System.out.println(0 ==c1.size() ? "集合已经空了" : "集合还没有空");//没有空
        System.out.println(c1.isEmpty() ? "集合已经空了": "集合还没有空");//没有空
        //清空集合中的所有元素
        c1.clear();
        System.out.println("c1="+c1);
        System.out.println("集合中元素的个数为:"+c1.size());
        System.out.println(0 ==c1.size() ? "集合已经空了" : "集合还没有空");//已经空了
        System.out.println(c1.isEmpty() ? "集合已经空了": "集合还没有空");//已经空了

在这里插入图片描述

Collection集合和数组的转换

在这里插入图片描述

//实现集合和数组类型之间的转换
        Collection c5 = new ArrayList();
        c5.add(1);
        c5.add(2);
        c5.add(3);
        //集合向数组的转换
        Object[] objects = c5.toArray();
        //打印数组中所有元素
        System.out.println("数组中的元素有:"+ Arrays.toString(objects));

        //数组类型向集合类型的转换
        Collection object1 = Arrays.asList(objects);
        System.out.println("集合中的元素有:"+object1);

在这里插入图片描述
通常认为:集合是用于取代数组的结构

猜你喜欢

转载自blog.csdn.net/Maybe_do_it/article/details/121116261