• 技术文章 >Java >java教程

    Java中的set集合如何理解

    长期闲置长期闲置2022-06-20 11:31:05转载278
    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于set集合的相关问题,set集合的特点是无序、不重复并且没有索引,下面一起来看一下,希望对大家有帮助。

    推荐学习:《java视频教程

    Set系类集合特点:

    Set集合实现类特点:

    HashSet:无序、不重复、无索引

    LinkedHashSet:有序、不重复、无索引

    TreeSet:排序、不重复、无索引

    Set集合的功能上基本上与Collection的API一致。

    HashSet集合

    HashSet集合:

    Set<String> set = new HashSet<>();
            set.add("石原里美");
            set.add("石原里美");
            set.add("工藤静香");
            set.add("朱茵");
            System.out.println(set);
            set.remove("朱茵");
            System.out.println(set);

    输出结果:

    通过上述代码与运行结果,我们可以清晰地看出,HashSet集合无序、不重复的特性;

    结合上述图片所示,可以看出HashSet集合是无法通过get()方法的索引获取数据的,并且在删除集合中的数据的时候,也只能通过定向的对数据进行删除。

    LinkedHashSet集合:

    LinkedHashSet集合:

    Set<String> set = new LinkedHashSet<>();
            set.add("石原里美");
            set.add("石原里美");
            set.add("工藤静香");
            set.add("朱茵");
            System.out.println(set);
            set.remove("朱茵");
            System.out.println(set);

    输出结果:

    通过上述代码与输出结果做对比,即可看出无序与有序之间的区别,前者是会将传入的数据顺序打乱,而后者则是仍然按照输入数据的顺序存储数据,因此输出的时候是有序状态。

    TreeSet集合:

    TreeSet集合:

    Set<Integer> set = new TreeSet<>();
            set.add(13);
            set.add(23);
            set.add(23);
            set.add(11);
            System.out.println(set);
            set.remove(23);
            System.out.println(set);

    输出结果:

    通过上述代码和输出结果我们便可以通过字面意思去理解为什么TreeSet的特点是排序了,即将存储的数据按照Java默认的排序方式进行排序。

    然而此时若存储自定义如People对象,TreeSet无法直接排序,会出现报错的情况!

    //People类:
    public class People{
        private String name;
        private int age;
        private String classroom;
    
        public People(){
    
        }
        public People(String name, int age, String classroom) {
            this.name = name;
            this.age = age;
            this.classroom = classroom;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getClassroom() {
            return classroom;
        }
    
        public void setClassroom(String classroom) {
            this.classroom = classroom;
        }
    
        @Override
        public String toString() {
            return "People{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", classroom='" + classroom + '\'' +
                    '}';
        }
    }
    //main方法:
    public static void main(String[] args) {
            Set<People> p = new TreeSet<>();
            p.add(new People("张三",19,"智能"));
            p.add(new People("李四",18,"数据库"));
            p.add(new People("王五",20,"渗透"));
            System.out.println(p);
        }

    若想解决该问题,我们就需要为TreeSet集合自定义存储类型,现有两种方式可以解决该问题:一种是自定义类实现Comparable接口并重写里面的compareTo方法指定规则;另一种则是集合自带比较器对象进行规则定义。

    方式一:自定义类实现Comparable接口重写里面的compareTo方法指定比较规则(多余无关紧要的代码在此不再赘述了,只展示重要的那部分代码)

    //改变的第一个地方:实现Comparable类
    public class People implements Comparable<People> {
    //改变的第二个地方:重写Comparable类中的compareTo方法    
        @Override
        public int compareTo(People o) {
            return this.age-o.age;
        }
    }

    输出结果(根据年龄进行比较):

    在重写的方法中,return后面的代码决定了该对象将要根据什么准则进行比较,比较规则如下:

    方式二:集合自带比较器对象进行规则定义

    Set<People> p = new TreeSet<>(new Comparator<People>() {
                @Override
                public int compare(People o1, People o2) {
                    return o1.getAge()-o2.getAge();
                }
            });

    在原来的基础之上对集合的创建作出改变,并且其比较准则与前面的定义方法类似,相对前面的方式,这种方式会更加方便快捷一些。在此,我们也可以回顾一些前面所学到的知识“Lambda表达式”,对给代码块进行化简。

    Set<People> p = new TreeSet<>((o1, o2) -> o1.getAge()-o2.getAge());

    如果没有学习过Lambda表达式,或者说是对Lambda表达式的知识不清晰,那么可以可以看Java中的lambda表达式如何理解——精简这篇文章的讲解,或许会对你有所帮助的。

    推荐学习:《java视频教程

    以上就是Java中的set集合如何理解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:java
    上一篇:详细了解java多线程机制 下一篇:完全掌握Java中的抽象类和接口
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 深入聊聊JavaScript• javascript有常量池吗• javascript有定义类的方法吗• javascript是事件驱动的吗• javascript可以对事件作出响应吗
    1/1

    PHP中文网