Collection接口中常用的方法

一:Collection中能存储什么元素

  1. 没有使用 “泛型” 之前,Collection中可以存储Object的所有子类型
  2. 在使用 “泛型” 之后,Collection中只能存储某个具体的类型
  3. 重申集合中不能直接存储基本数据类型,也不能存储Java对象,只能存储Java的内存地址

二:Collection的常用方法

在这里插入图片描述

public class CollectionTest01 {
    public static void main(String[] args) {
        //创建一个集合对象
        //接口值抽象的,无法实例化
        //Collection collection = new Collection();
        //这时就要用到多态
        Collection collection = new ArrayList();
        //----------------------测试常用方法---------------------------
        //1. 往集合里添加元素
        collection.add(100);//这边是自动装箱了(Java5新特性),不是存基本数据类型
        collection.add(3.14);
        collection.add(new Object());
        collection.add(true);
        collection.add("Hello");

        //2. 获取集合中元素的个数
        System.out.println(collection.size());

        //3. 清空集合
        collection.clear();
        System.out.println(collection.size());
        collection.add("友");
        collection.add("人");
        collection.add("@");
        collection.add("A");
        collection.add("a");

        //4. 判断当前集合中是否包含元素o
        System.out.println(collection.contains("a"));

        //5. 删除集合中的某个元素
        collection.remove("a");
        System.out.println(collection.contains("a"));

        //6. 判断集合是否为空
        System.out.println(collection.isEmpty());

        //7. 把集合转为数组
        Object[] object = collection.toArray();
        for (int i = 0; i <object.length ; i++) {
            System.out.println(object[i]);
        }

    }
}

三:重要方法详解

① iterator中的方法 实现 集合的迭代

  1. 以下讲解的遍历方式/迭代方式,是所有Collection通用的一种方式
  2. 但在Map集合中不能用
  3. 【重点】当集合的结构发生改变时,迭代器必须重新获取,如果用老的迭代器会出现异常:java.util.ConcurrentModificationException
  4. 【重点】在集合的迭代过程中,不能调用集合对象的remove方法,删除元素(删除了集合的元素,但迭代器没更新)。要用迭代器的remove方法,删除元素(会自动更新迭代器,同步集合也会删)。
  5. 常用方法:
方法名解释
boolean hasNext()如果仍有元素可迭代,则返回true
E next()返回迭代的下一个元素
default void remove()删除迭代器指向的当前元素
  1. 理解图
    在这里插入图片描述
  2. 代码实现
public class CollectionTest02 {
    public static void main(String[] args) {
        //创建集合对象
        Collection collection = new ArrayList();//有序可重复
        //添加元素
        collection.add(100);
        collection.add("200");
        collection.add(new Object());
        collection.add("abc");
        //获取集合对象的迭代器对象Iterator
        Iterator it = collection.iterator();
        //通过Iterator迭代器对象中的方法hasNext()遍历集合
        //一直取数据,不判断会出现异常
        while (it.hasNext()){
            //存进去什么类型,取出来就是什么类型
            Object object = it.next();
            //只是输出的时候会转为字符串,调用对象的toString()方法
            System.out.println(object);
        }
    }
}

② contains()方法的底层实现

contains(Object o) 底层是调用equals()方法进行判断的,所以当判断集合中是否含有 对象o 时,要看对象o有没有重写Object的equals方法。Objects类中的equals()方法,默认比较的是地址。

public class CollectionTest03 {
    public static void main(String[] args) {
        //创建集合对象
        Collection cc = new ArrayList();
        //向集合放元素
        String s1 = new String("abc");//s1 = 0x1234
        String s2 = new String("def");//s2 = 0x2345
        String x = new String("abc");//s3 = 0x3456
        cc.add(s1);
        cc.add(s2);
        System.out.println("集合元素个数:"+cc.size());
        /*虽然s3和s2对象的引用(内存地址)不一样,但是由于String类重写了equals()方法
            ,比较的是内容,而不是地址
            正好contains()方法底层是用equals()方法判断结合中是否包含该元素,
            所以即使两对象的内存地址是不一样的,但只要集合中包含该元素,contains()
            方法返回的就是true
        */
        System.out.println(cc.contains(x));//true
    }
}

③ remove()方法的底层实现

和contains()方法一样,remove()方法底层也是用equals()方法实现,判断是否是要删除的对象。同样要看,要删除的对象 o,有没有重写Object的equals方法,没重写比较的是地址,重写了比较的是内容。

public class CollectionTest04 {
    public static void main(String[] args) {
        Collection collection = new ArrayList();
        String s1 = new String("abc");
        String s2 = new String("100");
        String s3 = new String("200");
        String s4 = new String("200");
        people p = new people("友人A");
        collection.add(s1);
        collection.add(s2);
        collection.add(s4);
        collection.add(p);
        people people = new people("友人A");//true
        //people people = new people("友人");//false
        //虽然people没在集合中,但是remove()底层用的是equals()方法,判断相同,所以能删
        //因为people类已经重写了equals()方法
        System.out.println(collection.remove(people));
        Iterator it2 = collection.iterator();
        while (it2.hasNext()){
            Object oo = it2.next();
            System.out.println(oo);
        }

    }
}
class people{
    String name = "友人A";
    public people(String name) {
        this.name = name;
    }
    @Override
    public boolean equals(Object o) {
     if(null == o || !(o instanceof people)) return false;
     people p = (people)o;
     if (this.name.equals(p.name)) return true;
     return false;
    }
}
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页