码迷,mamicode.com
首页 > 其他好文 > 详细

45. Collection

时间:2018-04-30 22:44:31      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:his   指定   str   查询   OLE   family   width   查看   例子   

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

 

1. Collection中常用方法

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

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

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

 

 

 

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]);
        }
    }

 技术分享图片

45. Collection

标签:his   指定   str   查询   OLE   family   width   查看   例子   

原文地址:https://www.cnblogs.com/zjdbk/p/8974948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!