Collection接口详解


前言

Collection接口是Java集合中最常用到的接口之一,这篇文章简单记录一下Collection接口的一些基础的理论知识和详解。


一、Collection接口

1.Colection接口的架构

Collection接口的子接口和特点:

  • List接口:存储有序的、可重复的数据
  • Set接口:存储无序的,不可重复的数据

List接口的实现类和特点:

  • ArrayList:效率高 线程不安全 底层是用Object[]存储(数组存储) 对查询 修改效率较高
  • LinkedList:双向链表存储 对插入删除操作效率较高
  • Vector:线程安全,效率低

Set接口的实现类和特点:

  • HashSet:线程不安全,可以存储null值,底层通过数组加链表来实现
       - LinkedHashSet:HashSet的子类,遍历内部数据的时候,可以按照添加的顺序遍历
  • TreeSet:按照添加对象的指定属性,进行排序

2.Colection接口的主要方法

List接口和Set接口都可通过实现Collection接口来使用Collection的基本方法
1.size():返回集合中元素的个数
2.add(Object obj):向集合中添加一个元素
3.addAll(Colletion coll):将形参coll包含的所有元素添加到当前集合中
4.isEmpty():判断这个集合是否为空
5.clear():清空集合元素
6.contains(Object obj):判断集合中是否包含指定的obj元素
① 判断的依据:根据元素所在类的equals()方法进行判断
②明确:如果存入集合中的元素是自定义的类对象,要去:自定义类要重写equals()方法
7.constainsAll(Collection coll):判断当前集合中是否包含coll的所有元素
8.retainAll(Collection coll):求当前集合与coll的共有集合,返回给当前集合
9.remove(Object obj):删除集合中obj元素,若删除成功,返回ture否则
10.removeAll(Collection coll):从当前集合中删除包含coll的元素
11.equals(Object obj):判断集合中的所有元素 是否相同
12.hashCode():返回集合的哈希值
13.toArray(T[] a):将集合转化为数组
①如有参数,返回数组的运行时类型与指定数组的运行时类型相同。
14.iterator():返回一个Iterator接口实现类的对象,进而实现集合的遍历。(迭代器接口)
15.数组转换为集合:Arrays.asList(数组)

这里我们挑选几个方法进行演示:
代码如下(示例)
在这里插入代码片

    @Test
    public void test(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add("abc");
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(567);
        coll.add("zxc");
        coll.add(new Person("Jerry",20));
        coll.add(new Person("weinan",10));

        Collection coll1 = new ArrayList();
        coll1.add(123);
        coll1.add("abc");
        coll1.add(new String("Tom"));
        coll1.add(false);
        coll1.add(789);
        coll1.add("zxc");
        boolean contains = coll.contains(123);
        System.out.println(coll.size());
        System.out.println(contains);
        System.out.println(coll.contains(new String("Tom")));
        System.out.println(coll.containsAll(coll1));
        System.out.println(coll.equals(coll1));
        System.out.println(coll.retainAll(coll1));
        System.out.println(coll);
    }

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

二、List接口

1.常用方法

    void add(int index,Object obj):在index位置开始插入obj
    boolean addAll(int index,Collection coll):在index位置开始插入coll的所有元素
    Object get(int index):获取inedx位置的元素
    int indexOf(Object obj):返回obj在集合中首次出现的位置
    int LastIndexOf(Object obj):返回obj在集合中末次出现的位置
    Object remove(int index):移除指定index位置的元素,并返回此元素
    Object set(int index,Object obj):将指定index位置的元素修改为obj
    List subList(int int1,int int2): 返回从int1开始到int2结束的子集合

代码如下(示例):

@Test
    public void test1(){
        ArrayList coll1 = new ArrayList();
        ArrayList coll2 = new ArrayList();
        coll2.add("zyx");
        coll2.add(new String("Jerry"));
        coll2.add("zyx");
        coll2.add(123);
        coll1.add(123);
        coll1.add("abc");
        coll1.add(new String("Tom"));
        coll1.add(false);
        coll1.add(789);
        coll1.add("zxc");

        coll1.add(3,"asd");
        coll1.addAll(2,coll2);
        System.out.println(coll1.get(3));
        System.out.println(coll2.indexOf("zyx"));
        coll2.set(3,"abc");
        coll1.remove("abc");
        System.out.println(coll1.subList(2,5));
        Iterator iterator1 = coll1.iterator();
        while (iterator1.hasNext()){
            System.out.println(iterator1.next());
        }
        System.out.println("**************************");
        Iterator iterator2 = coll2.iterator();
        while (iterator2.hasNext()){
            System.out.println(iterator2.next());
        }
    }

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

2.存储要求

添加的对象所在的类必须要重写equals()方法

三、Set接口

1.常用方法

Set接口没有定义常用方法,使用的是Collection接口的方法!

2.使用要求

  • 向Set类中添加的数据,其所在类一定要重写equals()和hashCode(),重写的equals()和hashCode()尽可能的保持一致性,即相等的对象算出来的hashCode()的值相等
  • TreeSet需要实现自然排序和定制排序
    代码如下(示例):
private String name;
    private double price;
    //自然排序

        public int compareTo(Object obj){
            if (obj instanceof Goods){
                Goods goods = Goods(obj);
                //方式一
                if (this.price > goods.getPrice){
                    return 1;
                }else if (this.price < goods.getPrice){
                    return -1;
                }else{
                    return this.name.compareTo(goods.getName);
                }
                //方式二
                return Double.compare(this.price,goods.getPrice);
            }
        }
    Comparator com = Comparator(){
        //定制排序
        //按照产品名称从低到高排列,再按照价格从高到低排列
        public int compareTo(Object obj1,Object obj2){
            if (obj1 instanceof Goods && obj2 instanceof Goods){
                Goods g1 = Goods(obj1);
                Goods g2 = Goods(obj2);
                if (g1.getName().equals(g2.getName())){
                    return -Double.compare(g1.getPrice(),g2.getPrice());
                }else{
                    return g1.getName().compareTo(g2.getName());
                }
            }
            throw new RuntimeException("输入的数据类型不一致");
        }
    }

四、迭代器和foreach()的使用

1.迭代器Iterator的使用

Iterator是一个类 使用时需要创建Iterator对象,拥有三个重要方法,分别为hasNext()、next()、和remove()。

  • hasNext():判断是否有下一个元素
    
  • next():获取元素
    
  • remove():删除元素
    

Iterator的对象是通过指针来实现这些方法的,hasNext()判断是否还有下一个元素,有的话返回true,没有的话返回false,next()返回当前位置元素,下移指针。

代码如下(示例):

    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add("abc");
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(567);
        coll.add("zxc");
        coll.add(new Person("Jerry",20));
        coll.add(new Person("weinan",10));
        Iterator iterator = coll.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("********************************");
        Collection coll1 = new ArrayList();
        coll1.add(123);
        coll1.add("abc");
        coll1.add(new String("Tom"));
        coll1.add(false);
        coll1.add(789);
        coll1.add("zxc");

        Iterator iterator1 = coll1.iterator();
        while (iterator1.hasNext()){
            Object obj = iterator1.next();
            if ("Tom".equals(obj)){
                iterator1.remove();
            }
        }
        Iterator iterator2 = coll1.iterator();
        while (iterator2.hasNext()){
            System.out.println(iterator2.next());
        }
    }

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

2.foreach()的使用

其实foreach()的底层也是使用的迭代器,话不多说直接上代码!
代码如下(示例):

 @Test
    public void test1(){
        Collection coll1 = new ArrayList();
        coll1.add(123);
        coll1.add("abc");
        coll1.add(new String("Tom"));
        coll1.add(false);
        coll1.add(789);
        coll1.add("zxc");

        //for(局部变量类型 局部变量 :集合对象)
        for (Object obj :coll1) {
            System.out.println(obj);
        }
    }

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

五、关于Collection接口的常见面试题

ArrayList、LinkedList、Vector三者的异同?

相同点:都实现了List接口,都可以存储无序的、可重复的数据
不同点:

  • ArrayList:效率高 线程不安全 底层是用Object[]存储(数组存储) 对查询 修改效率较高
  • LinkedList:双向链表存储 对插入删除操作效率较高
  • Vector:线程安全,效率低

  本文仅仅简单介绍了Collection接口的架构和实现类的使用,以及迭代器Iterator和foreach()的使用,希望大家通过本篇文章能够对Collection进行简单的了解,如有错误,请大家留言指出,祝大家工作顺利!
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值