Set , HashSet , LinkedHashSet , TreeSet集合的概述和特点

Set系列集合特点 【代码】Set系列集合特点 阅读详情

一:Set

         Set集合概述及特点: 无序(存储和取出的顺序)和唯一.

package org.westos.demo;

import java.util.HashSet;

public class SetDemo2 {
    public static void main(String[] args) {

        //Set集合的特点:元素无序,且唯一
        HashSet<Integer> hashSet = new HashSet<>();
        hashSet.add(100);
        hashSet.add(20);
        hashSet.add(30);
        hashSet.add(5);
        hashSet.add(60);
        hashSet.add(20);
        hashSet.add(30);
        hashSet.add(20);
        hashSet.add(30);
        //遍历
        for(Integer num:hashSet){

            System.out.println(num);
        }
    }
}

二:HashSet

         HashSet概述和特点:
                           此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。线程不安全,效率高,允许存储null元                                 素,元素无序(元素的存取顺序不一致)且唯一

         HashSet保证元素唯一性:

                           HashSet 保证元素唯一性是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。

                            set集合中存储元素的时候,他默认比较的时地址值,如果地址值不一样,就会存到集合当种,往往我们认为两个                             对象只要成员变量的值一模一样就认为两个对象一样,那我们就需要重写hahsCode()方法和equals()方法

HashSet的举例:

package org.westos.Demo;
//HashSet 集合种元素无序,唯一

import java.util.HashSet;

//测试类
public class HashSetDemo {
    //主方法
    public static void main(String[] args) {
        HashSet<Student> hs = new HashSet();//创建一个HashSet集合

        Student s1 = new Student("张三", 29);//创建六个学生对象
        Student s2 = new Student("李四", 22);
        Student s3 = new Student("王五", 21);
        Student s4 = new Student("赵六", 24);
        Student s5 = new Student("张三", 29);//s5与s1的中内容相同.因为HashSet的唯一性
        //s5不能存入集合当中.这只是我们自己的想法
        //而实际情况是,没有重写equals()方法和hashCode()方法
        //所以当地址值不同时就可以存入集合,要是想要根据对象内容来
        //确定唯一性那么就要重写equals()方法和hashCode()
        Student s6 = new Student("李四", 27);

        hs.add(s1);//将对象存入集合当中
        hs.add(s2);
        hs.add(s3);
        hs.add(s4);
        hs.add(s5);
        hs.add(s6);

        for (Student stu : hs) {//遍历
            System.out.println(stu.getName() + "---" + stu.getAge());
        }
    }

}


package org.westos.Demo;

import java.util.Objects;
//定义一个学生类
public class Student {
    private String name;
    private int age;
    //无参构造
    public Student() {
    }
    //有参构造
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //getXXX和setXXX
    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;
    }
    //重写toString()方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //重写equals()方法
    @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);
    }
    //重写hashCode()方法
    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
}

三:LinkedHashSet

           LinkedHashSet的概述:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。线程不安全,效率高.

           链表保证了元素有序,哈希表保证了元素唯一.

LinkedHashSet的举例:

package org.westos.Demo;

import java.util.LinkedHashSet;

//测试类
public class LinkedHashDemo {
    public static void main(String[] args) {//主方法
        LinkedHashSet<Teacher> LHS = new LinkedHashSet<>();//创建一个LinkedHashSet集合

        Teacher t1 = new Teacher("张三", 29);//创建五个Teacher对象
        Teacher t2 = new Teacher("李四", 29);
        Teacher t3 = new Teacher("王五", 28);
        Teacher t4 = new Teacher("赵六", 23);
        Teacher t5 = new Teacher("张三", 29);//和HashSet一样,不重写equals()和hasCode()方法的话,根据地址可以存入集合当中
        //如果重写,元素内容相同,LinkedHashSet的唯一性该元素不能存入集合当中

        LHS.add(t1);//将元素放入集合当中
        LHS.add(t2);
        LHS.add(t3);
        LHS.add(t4);
        LHS.add(t5);

        for (Teacher th : LHS) {//遍历集合
            System.out.println(th.getName() + "---" + th.getAge());

        }
    }
}

package org.westos.Demo;

import java.util.Objects;
//创建一个Teacher集合
public class Teacher {
    private String name;
    private  int age;
    //无参构造方法
    public Teacher() {
    }
    //有参构造方法
    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //setXXX()和getXXX()方法
    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;
    }
    //重写toString()方法
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //重写equals()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return age == teacher.age &&
                Objects.equals(name, teacher.name);
    }
    //重写hashCode()方法
    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
}

四:TreeSet
               TreeSet :  TreeSet 底层数据结构是二叉树(红黑树)
               TreeSet集合的特点,元素唯一,且能对元素进行排序 线程不安全,效率高
               
                TreeSet对元素进行排序,有两种方式,具体使用哪种排序方式,根据构造方法来决定
                                     如果使用的是空参构造,那么采用的是自然排序
                                                 元素必须实现Compareble接口并且重写compareTO()方法 ,元素排序就是根据compareTO()方法
                                                  的返回值的正负来决定排列顺序,返回0 元素不往里面存
                                     如果使用的是有参构造,那么采用的是比较器排序

                                                   通过匿名内部类来传Comparator 比较器 是一个接口 接口中有一个比较的方法 compare()根据此                                                    方法的返回值的正负以及0 来决定元素的排列顺序

TreeSet的举例:

     

package org.westos.Demo;

import java.util.TreeSet;

//测试类
public class TreeSetDemo {
    //主方法
    public static void main(String[] args) {
        TreeSet<Teacher> TS = new TreeSet<>();//创建一个TreeSet集合

        Teacher t1 = new Teacher("张龙", 20);//创建五个Teacher对象
        Teacher t2 = new Teacher("赵虎", 22);
        Teacher t3 = new Teacher("王朝", 23);
        Teacher t4 = new Teacher("马汉", 25);
        Teacher t5 = new Teacher("刘能", 21);

        TS.add(t1);//将五个元素存入集合中
        TS.add(t2);
        TS.add(t3);
        TS.add(t4);
        TS.add(t5);

        for (Teacher tea : TS) {//遍历
            System.out.println(tea.getName() + "---" + tea.getAge());
        }


    }
}


package org.westos.Demo;

import java.util.Objects;
//创建一个Teacher集合,并且实现Comparable接口,重写compareTo()方法
public class Teacher implements Comparable<Teacher> {
    private String name;
    private  int age;
    //无参构造方法
    public Teacher() {
    }
    //有参构造方法
    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //setXXX()和getXXX()方法
    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;
    }
    //重写toString()方法
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //重写equals()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return age == teacher.age &&
                Objects.equals(name, teacher.name);
    }
    //重写hashCode()方法
    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
    //重写compareTo方法
    @Override
    public int compareTo(Teacher o) {
        int r = this.getAge()-this.getAge();//通过元素中年龄大小来排序
        int r1 = r==0?this.getName().compareTo(o.getName()):r;//如果年龄相同,在根据名字的字典顺序来比较

        return r1;//返回值
                  //根据返回值的正负 ,0 来存放元素
    }
}


 

7.Set集合总结(TreeSet集合HashSet集合 一、Set集合 1.Set集合特点 可以去除重复 存取顺序不一致 没有带索引的方法,所以不能使用普通的for循环遍历,也不能通过索引来获取、删除Set集合里面的元素。 2.Set集合中元素的遍历 二、TreeSet集合 1.TreeSet集合概述特点 不可以存储重复元素 没有索引以及带索引的方法 可以将元素按照规则进行排序(如果需要对其他Student类型进行排序,必须指定排序规则 ) TreeSet():根据元素的自然顺序进行排序 TreeSet(Comparator comparator):根据指 阅读详情

相关推荐

JAVA_Set系列集合:HashSetLinkedHashSetTreeSet底层详解

创建TreeSet对象时候,传递比较器Comparator指定规则练习:要按照字符串长度来比较,用自然排序无法比较,所以要使用自定义步骤//创建集合@Override//o1:表示当前要添加的元素//o2表示已经在红黑树存在的元素//按照长度排序//如果一样长则按照首字母排序//调用默认的字符排序,就不会被丢弃return i;});//添加//打印:上面的匿名内部类可以用 Lambda 简化练习题 :TreeSet对象自定义排序。

2301_79947226的博客 1665

集合框架set特点及循环方式&hashset&treeset用法

目录一、set特点二、循环方式三、hashset集合用法四、treeSet用法思维导图内容大致如下 (1)数据不重复(2)没有顺序【示例】 效果图如图所示--- (1)fore增强for循环 效果如图所示: (2) 迭代器方式注意:使用for循环没有下标,所以不能使用此种for循环 *1.Set去重原理是与对象的hashcode以及equals方法相关 * 2.判断重复元素时,是比较hashcode值,再调用equals比较内容自然排序比较器排序(1) comparabl

qq_66924116的博客 2641

演示HashSetTreeSet集合特点

演示HashSet集合特点:无序不可重复 package Collection; import java.util.HashSet; import java.util.Set; /* HashSet集合: 无序不可重复 1.存储时顺序取出时的顺序不同 2.不可重复 3.放到HashSet集合中的元素实际上是放到HashMap集合的key部分了。 */ public class HashSetTest { public static void main(String[]

qq_57935389的博客 245

java day13 Set集合 & Map集合 & Stream流

双列集合Map类集合Set集合的底层实现原理相同所以特点相同。

moskidi的博客 2285

Java单列集合

Collection是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素JDK 不提供此接口的任直接实现.它提供更具体的子接口(如SetList)实现方法名说明添加元素从集合中移除指定的元素根据条件进行移除清空集合中的元素判断集合中是否存在指定的元素判断集合是否为空int size()集合的长度,也就是集合中元素的个数创建Collection集合的对象可使用多态的方式,有具体的实现类ArrayList有序,存取的元素顺序一致。

2401_87463962的博客 883

day22-集合(泛型、SetHashSetLinkedHashSetTreeSet

泛型的介绍​ 泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制泛型的好处把运行时期的问题提前到了编译期间避免了强制类型转换泛型的定义格式: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如:: 指定多种类型的格式,多种类型之间用逗号隔开.例如: 不可以存储重复元素没有索引,不能使用普通for循环遍历不可以存储重复元素没有索引可以将元素按照规则进行排序。

u012011912的博客 101

JAVA基础复习十七-Set集合及其子类

一、Set集合特点 set集合中存储集合是无序的(除LinkedHashSet),且元素不可以重复(引用数据类型要重写hashcodeequals方法,否则比较的是地址值而不是自身属性,那就都不一样了) list集合add()方法添加元素,返回值是boolean类型,恒为true,因为list集合可以添加重复元素。而set集合添加元素,返回值可能是false,只要是元素重复就返回fa

qq_40877598的博客 452

Java中集合概述(补充ing)

Java中的集合框架提供了多种类型的集合,主要分为两大类:单列集合(只保存单一类型的对象)双列集合(保存具有键值对关系的对象)。下面对这些集合进行分类介绍,但由于源码分析会涉及大量的代码细节,这里只简要概述其关键特性设计思路。

qq_42802219的博客 578

Java集合常见面试题大全

Java 集合框架提供了一套性能优良,使用方便的接口类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包。

小斜同学的博客 1153

Java第十七次笔记(强化部分Day06)---Set系列集合、Map集合体系

目录本部分的学习目标:133一、Set系列集合 1341.1Set系列集系概述 134总结:1.2HashSet元素无序的底层原理:哈希表 134(无序的原因) HashSet1.8版本的原理解析:总结:​编辑 1.3HashSet元素去重复的底层原理 134 (不重复的原因)HashSet去重复原理解析: 总结:1.4实现类:LinkedHashSet 134 总结: 1.5实现类:TreeSet集合概述特点 134 自定义排序规则: 总结: 二、Collection体系的特点、使用场景总结 134三、

xiaoxixicc的博客 1516

浅谈集合(三)

Set集合 Set集合特点 ①:Set集合里的成员是不可重复的 ②: Set集合是Collection集合的子类,与Collection基本上完全一样,它没有提供额外的方 法,只是在行为上略有不同。 HashSet类 ①HashSet特点HashSet类不能保证元素添加进来的顺序与输出的顺序一致。 ②假如向HashSet类中添加元素时,...

weixin_45092997的博客 137

Java SE基础知识详解第[12]期—集合Set、Collections、Map、集合嵌套)

每一个不曾起舞的日子,都是对生命的辜负。 希望看到这里的每一个人都能努力学习,不负韶华,成就更好的自己。 以下仅是个人学习过程中的一些想法与感悟,Java知识博大精深,作为初学者,个人能力有限,哪里写的不够清楚、明白,还请各位不吝指正,欢迎交流与讨论。如果有朋友因此了解了一些知识或对Java有了更深层次的理解,从而进行更进一步的学习,那么这篇文章的意义也就达到了。 ...

zhuafeng222的博客 480

Java 进阶day06 Set、可变参数、Collections工具类、Map

Java 进阶day06 Set、可变参数、Collections工具类、Map

weixin_44504809的博客 364

Java集合的理解总结

1.集合概述 java集合框架 2、详述 2.1Collection接口(单列集合) Collection接口是单列集合的最顶层接口,定义了一些通用的方法。 add(E e)添加元素; clear()清空元素; remove(E e)移除元素; size()元素数量; toArray()集合转数组; contains(E e)判断元素是否存在; isEmpty()判断集合是否为空; 2.1.1List 接口 特点:有索引,精准操作元素; 元素有序,存储及取出时顺序一致; 元

L_030325的博客 1029

java进阶:集合

Map集合是一种双列集合,每个元素包含两个数据。Map集合的每个元素的格式: key-value(饽值对元泵)。Map集合也被称为“键值对集合”。Map集合整体格式:collection集合的格式:[元素1,元素2,元震3…1Map集合的完整格式:{key1-value1 , key2-value2 , key3-value3 , …}由键决定特性:不笆复、无索引、可排序可排序:按照键数据的大小默认升序〈有小到大)排序。只能对键排序。注意:TreeMap集合是一定要排序的。可以默认排序。...

weixin_49405762的博客 490

J-18 集合对象

SET接口 SET接口 HashSetLinkedHashSetTreeSetSET接口 一、Set接口概述 一个不包含重复元素的 collection。无序、唯一。 二、Set案例 存储字符串并遍历 存储自定义对象并遍历 HashSet类 一、HashSet概述 底层数据结构是哈希表。 不保证 set 的迭代顺序,特别是它不保证该顺序恒久不变。 二、HashSet保证元素唯...

weixin_34168880的博客 134

集合

  集合:属于容器类,存放的都是引用类型。集合的产生是由于数组的长度是定长的,一旦创建长度就会固定,但是集合的长度是不固定的,可以动态的插入删除。 数组相当于string,集合相当于StringBuilder/StringBuffer。 集合之间的继承关系       List子接口下面有三个类分别是ArrayList、LinkedList、Vector   List...

sweet的博客 572

学习笔记(java)①⑤(.Set集合,泛型)

1.Set集合概述特点 Set集合特点 ①不包含重复元素的集合 ②没有带索引的方法,所以不能使用普通for循环遍历 哈希值 哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值 Object类中有一个方法可以获取对象的哈希值 public int hashCode() 返回对象的哈希码值 对象的哈希值特点 ①同一个对象多次调用hashCode()方法返回的哈希值是相同的 ②默认情况下,不同对象的哈希值是不同的。而重写hashCode()方..

m0_56655954的博客 102
上一篇: 增强for循环和可变参数
下一篇: Map以及三个自实现类HashMap,HashLinkedMap,TreeMap集合
路还长@
博客等级 码龄8年 9粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值