zoukankan      html  css  js  c++  java
  • 45. Collection

    因为Collection是接口我们不能直接实例化,所以我们下面的例子都是采用多态实例化实现类ArrayList类

    1. Collection中常用方法

    添加:
        add()     添加一个元素到集合中
        addAll()   把一个集合中的所有元素添加到指定的集合中(指定集合为调用此方法,参数为要被添加的集合)
     
     
    删除:
        clear()     删除集合中的所有元素
        remove()     删除集合中指定元素
        removeAll()   删除2个集合中的交集
        retainAll()   保留2个集合中的交集,其它删除
        
    判断:
        contains()    查看集合中是否存在此元素,如果有返回true否者返回false
        containsAll()  查看一个集合中是否存在指定集合的所有元素,有返回true否false(指定集合为调用此方法,参数为要被添加的集合)
        isEmpty()    查看元素是否为空,是true否false

    查看:
        size()     查看集合中元素的长度(注意:并不是集合容器的长度)
             

    迭代器:
        toArray()    返回一个object数组,数组里面包含集合的所有元素

        iterator()    下一章迭代器会讲

     

    2.下面是一些不好理解的方法实例代码

    allAll   添加一个元素到集合中

    public static void main(String[] args) {
            //创建两个个Collection实体类的对象
            Collection list1 = new ArrayList();
            Collection list2 = new ArrayList();
            //往集合中添加元素
            list1.add("张三");
            list1.add("李四");
            list1.add("王五");
            list2.add("张三");
            list2.add("狗娃");
            list2.add("狗蛋");
            System.out.println(list1);
            System.out.println(list2);
            //addAll()把list2中的所有元素添加到list1中
            list1.addAll(list2);
            System.out.println(list1);
            
        }

    removeAll()   删除2个集合中的交集

    public static void main(String[] args) {
            //创建两个个Collection实体类的对象
            Collection list1 = new ArrayList();
            Collection list2 = new ArrayList();
            //往集合中添加元素
            list1.add("张三");
            list1.add("李四");
            list1.add("王五");
            list2.add("张三");
            list2.add("狗娃");
            list2.add("狗蛋");
            System.out.println(list1);
            System.out.println(list2);
            //removeAll()删除2个集合中的交集
            list1.removeAll(list2);
            System.out.println(list1);
        }

    retainAll()   保留2个集合中的交集,其它删除

    public static void main(String[] args) {
            //创建两个个Collection实体类的对象
            Collection list1 = new ArrayList();
            Collection list2 = new ArrayList();
            //往集合中添加元素
            list1.add("张三");
            list1.add("李四");
            list1.add("王五");
            list2.add("张三");
            list2.add("狗娃");
            list2.add("狗蛋");
            System.out.println(list1);
            System.out.println(list2);
            //removeAll()删除2个集合中的交集
            list1.retainAll(list2);
            System.out.println(list1);
        }

    containsAll()  查看一个集合中是否存在指定集合的所有元素,有返回true否false(指定集合为调用此方法,参数为要被添加的集合)

    public static void main(String[] args) {
            //创建两个个Collection实体类的对象
            Collection list1 = new ArrayList();
            Collection list2 = new ArrayList();
            //往集合中添加元素
            list1.add("张三");
            list1.add("李四");
            list1.add("王五");
            list2.add("张三");
            list2.add("狗娃");
            list2.add("狗蛋");
            System.out.println(list1);
            System.out.println(list2);
            //removeAll()删除2个集合中的交集
            System.out.println(list1.containsAll(list2));
        }

    contains()    查看集合中是否存在此元素,如果有返回true否者返回false

    上面我们都是添加的是字符串,现在我们来添加一个对象

    需求:身份证例子(在现实生活中,只要我们的身份证id一样,那么不管名字是否一样,那都是一个人)

    class People{
        int id;
        String name;
        
        
        public People(int id , String name) {
            this.id = id;
            this.name = name;
        }
        @Override
        public String toString() {
            return "{身份证:"+id+" 姓名:"+name+"}";
        }
    }
    
    public class Demo1 {
    
        public static void main(String[] args) {
            //创建两个个Collection实体类的对象
            Collection list1 = new ArrayList();
            list1.add(new People(1001,"张三"));
            list1.add(new People(1002,"李四"));
            list1.add(new People(1003,"王五"));
            System.out.println(list1);//打印集合中的元素
            //查询是否存在存在身份证为1001的人
            System.out.println(list1.contains(new People(1001,"张三")));
        }
    }

    这时我们是不是感到很奇怪,明明存在我要查找的人啊!为什么返回false呢?

    我们来看看contains方法的源代码:

    这个是ArrayList类中的contains方法源代码

    可以看出这个是调用了ArrayList类的indexOf方法,接受的参数是我们Object类型的数据(多态)

    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

    这个是indexOf方法的源代码

    我们发现这个是调用了equals方法进行比较的,而我们根本没有重写Object的equals方法,所以调用的是Object的equals方法比较的是内存地址,我们的参数相当于又重新创建了一个对象,所以返回false

    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

    解决方法:改写Object的equals方法

    最终代码如下:

    class People{
        int id;
        String name;
        
        
        public People(int id , String name) {
            this.id = id;
            this.name = name;
        }
        @Override
        public String toString() {
            return "{身份证:"+id+" 姓名:"+name+"}";
        }
        @Override
        public boolean equals(Object obj) {
            //因为是多态,所以这里我们要强转
            People p = (People)obj;
            if(p.id == this.id) {
                return true;
            }else {
                return false;
            }
            
        }
    }
    
    public class Demo1 {
    
        public static void main(String[] args) {
            //创建两个个Collection实体类的对象
            Collection list1 = new ArrayList();
            list1.add(new People(1001,"张三"));
            list1.add(new People(1002,"李四"));
            list1.add(new People(1003,"王五"));
            System.out.println(list1);//打印集合中的元素
            //查询是否存在存在身份证为1001的人
            System.out.println(list1.contains(new People(1001,"老刘")));
        }
    }

    toArray()   返回一个object数组,数组里面包含集合的所有元素

    public static void main(String[] args) {
            Collection list = new  ArrayList();
            list.add("张三");
            list.add("李四");
            list.add("王五");
            System.out.println(list);
            Object[] arr = list.toArray();
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }

     

  • 相关阅读:
    【老孙随笔】关羽和吕蒙——天才的失败
    【老孙随笔】项目经理要向唐骏学习
    WebService里奇怪的参数值偏移现象?
    [原创]让您的服务器不再有被挂马的烦恼文件安全卫士
    C#里也可以用上Eval函数了:)
    使用HTTP_X_FORWARDED_FOR获取客户端IP的严重后果
    支持算术运算、逻辑运算、位运算的表达式求值
    在Lambda表达式中进行递归调用
    认识Lambda表达式
    将你的QQ唠叨或QQ签名数据加入到博客上:)
  • 原文地址:https://www.cnblogs.com/zjdbk/p/8974948.html
Copyright © 2011-2022 走看看