Java集合之Collection集合详解

目录

Collection集合 

List接口

ArrayList集合

LinkedList集合

List集合遍历

Iterator迭代器

增强for循环

forEach遍历集合

Set接口

HashSet集合

TreeSet集合


Collection集合 

Collection集合最基本的集合接口,用于存储一系列元素。
Collection集合有两个重要的子接口,分别是List和Set。其中List集合的特点是元素有序,可重复;Set集合的特点是元素无序并且不可重复。List接口的主要实现类有ArrayList和ListedList;Set接口的主要实现类有HashSet和TreeSet

        

List接口

List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。List 接口存储一组不唯一,有序(插入顺序)的对象

ArrayList集合

ArrayList内部封装了一个长度可变的数组对象(初始容量为8,按1.5倍扩容),在ArrayList中进行增删改查效率会比较低,但是在遍历和查找元素时显得非常高效。

LinkedList集合

为了克服ArrayList增删效率低的问题,可以用LinkedList,该集合内有一个双向循环链表,增删效率较高。 

List集合遍历

Iterator迭代器

Java迭代器(Iterator)是 Java 集合框架中的一种机制,是一种用于遍历集合(如列表、集合和映射等)的接口。

它提供了一种统一的方式来访问集合中的元素,而不需要了解底层集合的具体实现细节。

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代ArrayList和HashSet等集合 

Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。

    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("数据1");
        arrayList.add("数据2");
        arrayList.add("数据3");
        Iterator iterator=arrayList.iterator();
        // hasNext() 判断还有无元素
        while(iterator.hasNext()){
            //iterator.next()返回当前元素,然后指向下一元素,可以这样理解:
            //和c语言里面的指针一样 一开始是数据1 next把数据1返回然后指向了数据2
            System.out.println(iterator.next());
        }
    }
    //输出结果:
    数据1
    数据2
    数据3

增强for循环

    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("数据1");
        arrayList.add("数据2");
        arrayList.add("数据3");
        for (Object s: arrayList ){
            System.out.println(s);
        }
    }
    //输出结果:
    数据1
    数据2
    数据3

forEach遍历集合

forEach是java8新增的方法,使用Lambda表达式来遍历

    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("数据1");
        arrayList.add("数据2");
        arrayList.add("数据3");
        arrayList.forEach(s-> System.out.println(s));
    }
    //输出结果:
    数据1
    数据2
    数据3

Set接口

Set接口中的元素无序,并且保证存入的元素不会重复。Set接口主要有两个实现类,分别是HashSet和TreeSet,其中HashSet是根据对象的哈希值来确定元素集合中的存储位置,因此具有良好的存取和查找性能。TreeSet则以二叉树的方式来存储元素,它可以实现对集合中的元素排序。

HashSet集合

HashSet是set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当想HashSet集合中添加元素时,首先会调用hashcode方法来确定元素的存储位置,然后再调用元素对象的equals()方法来确保该位置没有重复元素。

Set和List集合遍历方法类似

public class Class3 {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add("数据1");
        hashSet.add("数据2");
        hashSet.add("数据3");
        hashSet.forEach(s-> System.out.println(s));
    }
    //输出结果
    数据1
    数据2
    数据3
}

向集合中存入元素时,为了保证HashSet正常工作,要求在存入对象是,需要重写Object类中的hashCode()和equals()方法。例子中将字符串存入HashSet时,String类已经默认重写了hashCode的方法,但是有时候传入自定义类型的对象存入HashSet,需要重写方法。

可以参考我的另一篇文章:

hashCode(),equals()详解-CSDN博客

TreeSet集合

TreeSet采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,且可以排序。集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable定义的。对于我们自定义的类,就需要去实现Comparable接口,并重写compareTo()方法

public class Class4 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add(new Cat("mimi",8));
        treeSet.add(new Cat("tutu",9));
        treeSet.add(new Cat("caca",3));
        System.out.println(treeSet);

    }
}
//    定义Cat类实现Comparable接口
class Cat implements Comparable{
    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString(){
        return name +":"+age;
    }
    //    重写Comparable接口的compareTo()的方法
    @Override
    public int compareTo(Object obj){
        Cat Cat = (Cat) obj;
    //  先比较年龄,再比较名称name
        if(this.age- Cat.age>0){
            return 1;
        }
        if(this.age- Cat.age==0){
            return this.name.compareTo(Cat.name);
        }
        return -1;
    }
}

输出结果: 

在上面的代码中,我们实现Comparable接口,并重写compareTo()方法,让Cat对象先比较年龄,如果年龄相同,再去比较名字,名字比较又调用了compareTo()方法,但名字是String类型的,String类型的compareTo()方法已经实现了,所以不用再去重写。我们将这种排序方式称为自然排序,除了自然排序,还可以通过定制排序来实现。

关于2种排序,有不清楚的可以参考我的这篇博客:

自然排序与定制排序-CSDN博客

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值