【博学谷学习记录】超强总结,用心分享 | 学习笔记之单列集合Collection

集合分类

常用集合一般分为分为两个大类即单列集合Collection和和双列结合Map;Map是以键值对的方式存储数据。而对于单列集合Collection则有有序集合LIst,和无序集合Set集合两种。下面将对两种集合进行简单总结。

单列集合Collection

list集合

list是有序集合其常用为Arraylist和LinkedList两种,Arraylist的底层是数组形式的集合,初始长度为零会在首次使用add()方法时将数组长度设置为10,以后当存储的数据长度大于数组的长度Arraylist会自动扩容为当前容量的1.5倍。而LinkedList底层是链表结构,没有长度限制。

Arraylist和LinkedList区别;

数组(ArrayList)的随机访问时因为数组可以通过索引查找元素因而速度非常快,但是指定位置添加、删除操作时需要将后续元素全部顺移。可概括为查询快,增删慢

LinkedList则恰恰相反,我们在使用链表做指定位置的添加删除操作时,所需的操作非常少,但随机访问时因为链表没有索引需要从头开始逐个遍历因而查询速度慢。可概括为查询慢,增删快

set集合

Set接口有两个实现类:HashSet: 依靠hash值进行存储的,如果两个元素hash值一样的话,就不再存储了,但实际的哈希值计算是以内存地址为根据,因此会导致即使成员属性一样但因为地址值不同而重复存储的情况,因此要使用Set去除重复元素的特性就必须在javaBean中重写hashcode方法。如下:

public class student {
    private int age;
    private String name;

    public student() {
    }

    public student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        student student = (student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

TreeSet:底层是二叉树,对存储数据进行自然排序,

public static void demoOne() {
        TreeSet<Person> ts = new TreeSet<>();
        ts.add(new Person("张三", 11));
        ts.add(new Person("李四", 12));
        ts.add(new Person("王五", 15));
        ts.add(new Person("赵六", 21));
        
        System.out.println(ts);
    }

要是直接使用就会因为无法确定排序方式而报ClassCastException异常,需要指定比较的规则,即需要在自定义类(Person)中实现Comparable接口,并重写接口中的compareTo方法。

public class student implements Comparable<student>{

    private int age;
    private String name;

    public student() {

    }

    public student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(student o) {
        return this.age-o.age==0?this.name.compareTo(o.name):this.age-o.age;
    }
}

PS:注意返回值的区别只是正负与值的大小无关,当返回值为0时表示重复不会进行存储,而且在比较时会把要存储的对象依次与已经存好的对象进行比较。从而进行排位

或使用比较器排序

 String s1="a";
        String s2="cd";
        String s3="bd";
        String s4="qwrw";
        String s5="chicken";
reeSet<String>s=new TreeSet<>(new Comparator<String>() {
           @Override
           public int compare(String o1, String o2) {
               int result=o1.length()-o2.length()==0?o1.compareTo(o2):o1.length()-o2.length();
               return result;
           }
        });

当然也可以使用 lambda表达式简化

TreeSet<String>s=new TreeSet<>(
                (o1,o2)
                        ->
                        o1.length()-o2.length()==0?o1.compareTo(o2):o1.length()-o2.length()
        );

以上是对单列集合Collection的知识整理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值