idea离线安装 tensorflow 多进程 Pytorch html 金融信贷 asynchronous flash laravel4 cuda Font Awesome 建站一条龙 jquery解析json centos查看php版本 mysql小数用什么类型 oracle查询数据库 js原生点击事件 python教学 mysql临时表 python文件写入 python安装 python实例教程 python入门指南 python中的循环 python数字类型 python自定义异常 java教程 java字符串 java集合框架 java的数据结构 java开发接口 java读文件 pushstate popen 销售清单打印软件 苹果滚动截屏 js判断字符串相等 在线手册 firework下载 识别音乐的软件
当前位置: 首页 > 学习教程  > 编程语言

java语言--------javaSE之Set集合概述及特点

2020/8/11 19:13:26 文章标签:

Set集合概述及特点

Set 集合:元素唯一,不允许重复。
 HashSet
 LinkedHashSet
 TreeSet
 HashSet:底层数据结构是哈希表(JDK1.7 数组+链表 JDK1.8 优化 数组+链表+红黑树)
元素无序(存取元素的顺序不一致)且唯一(元素不允许重复)
  HashSet集合保证元素的唯一性,是靠元素重新hashCode和equals()方法来保证的,如果元素不重写,则无法保证元素的 唯一性。

HashSet存储字符串并遍历

HashSet<String> set = new HashSet<>();
set.add("aaaa");
set.add("aaaa");
set.add("aaaa");
set.add("bbb");
set.add("ccc");
//元素无序(存取元素的顺序不一致)且唯一(元素不允许重复)	

for (String s : set) {
    System.out.println(s);
}
运行结果:
ccc
bbb
aaaa

HashSet保证元素唯一性

  • HashSet 底层数据结构是哈希表. HashSet 不是线程安全的 集合元素可以是 null
    哈希表:是一个元素为链表的数组,综合了数组和链表的优点 (像新华字典一样) (JDK1.7之前)
  • 当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,
    然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。
    HashSet 集合判断两个元素相等的标准:
    两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
  • 结论:HashSet 保证元素唯一性是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。

HashSet存储自定义对象保证元素唯一性

public static void main(String[] args) {
    //HashSet 底层用的HashMap 这个集合来存的
    //合理的重写hashCode方法,为了减少equals()方法的调用次数,也就是说为了减少碰撞。
    HashSet<Student> set = new HashSet<>();
    set.add(new Student("张三",23));
    set.add(new Student("张三", 23));
    set.add(new Student("张三", 23));
    set.add(new Student("李四", 24));
    set.add(new Student("王五", 25));

    for (Student student : set) {
        System.out.println(student);
    }

    ArrayList<Integer> list = new ArrayList<>();
    list.add(100);
    list.add(100);
    list.add(100);
    list.add(100);

    HashSet<Integer> integers = new HashSet<>(list);

    System.out.println(integers);
}
public class Student {
    private String name;
    private int age;

    public Student() {
    }

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

    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;
    }

   /* @Override
    public boolean equals(Object o) {
        System.out.println("equals方法"+this+"==="+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() {
                    // "张三", 23
                     // "张三", 23
                    // "李四", 24  21+24*11
                    //  "王五" 25  20+25*11
        return this.name.hashCode()+this.age*11;
       // return 0;
}
*/

    @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(name, age);
    }

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

                '}';
    }
}

运行结果:

Student{name=‘张三’, age=23}
Student{name=‘李四’, age=24}
Student{name=‘王五’, age=25}
[100]

LinkedHashSet的概述和使用

数据结构 有两个 链表和哈希表
链表保证有序 哈希表保证元素唯一
LinkedHashSet的概述: 元素有序 , 并且唯一

public static void main(String[] args) {
    //LinkedHashSet 元素有序,且唯一,底层数据结构是链表+哈希表 链表保证元素有序,哈希表保证元素唯一

    LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();
    linkedHashSet.add(100);
    linkedHashSet.add(100);
    linkedHashSet.add(100);
    linkedHashSet.add(200);
    linkedHashSet.add(300);
    linkedHashSet.add(400);

    for (Integer integer : linkedHashSet) {
        System.out.println(integer);
    }
}

运行结果:

100
200
300
400

TreeSet存储Integer类型的元素并遍历

  • TreeSet集合的特点: 元素唯一,并且可以对元素进行排序
    排序:
    a: 自然排序
    b: 使用比较器排序

  • 到底使用的是哪一种的排序取决于,构造方法.

  • 注意:使用TreeSet集合进行元素的自然排序,那么对元素有要求,要求这个元素
    必须实现Comparable接口 否则无法进行自然排序

  • 保证元素的唯一性是靠compareTo方法的返回值来确定如果返回0 表示两个元素相等
    则不重复存储

//TreeSet 底层数据结构是二叉树,元素唯一,且能对元素进行排序。

public static void main(String[] args) {
        //TreeSet 采用的两种排序方式,一种是 自然排序,一种是 比较器排序。
        //自然排序:采用空参构造, 自然排序对元素有要求,要求元素必须实现一个Comparable 接口 重写 compareTo(T o);
        //根据compareTo(T o);的返回值的 正 负 0 来决定元素在二叉树中放置左右的位置

        //安照学生的年龄大小来排序

        TreeSet<Student> treeSet = new TreeSet<>();
        treeSet.add(new Student("张庭aaaaaadfdfdfasdfasdf",23));
        treeSet.add(new Student("张庭2aaa", 23));
        treeSet.add(new Student("张柏芝aaa", 18));
        treeSet.add(new Student("张惠妹aaa", 20));
        treeSet.add(new Student("张惠妹", 20));
        treeSet.add(new Student("张惠妹", 22));
        treeSet.add(new Student("张余生", 20));
        treeSet.add(new Student("张曼玉aaaaaaa", 24));
        treeSet.add(new Student("林青霞aaaaaaaaaa", 26));

        for (Student student : treeSet) {
            System.out.println(student.getName()+"=="+student.getAge());
        }
        //安照姓名长度来排序
    }
}
public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
    }

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

    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;
    }


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

                '}';
    }

    @Override
    public int compareTo(Student s) {
       // System.out.println(this+"=="+s);
        //根据年龄大小来排序
     /*   int num=this.age - s.age;
        //如果年龄相同,并不能说明他们是同一个对象,还得比较姓名是否相同。
        int num2=num==0?this.name.compareTo(s.name):num;
        return num2;*/

     /*按照姓名的长度来排序*/
       int num =this.name.length()-s.name.length();
       //当姓名的长度一样,不能说明是同一个对象,还得比较姓名内容
        int num2=num==0?this.name.compareTo(s.name):num;
        //当姓名长度,姓名内容一样,也不能说明是同一个对象,还得比较年龄是否相同
        int num3=num2==0?this.age-s.age:num2;

        return num3;

    }
}

运行结果:

张余生20
张惠妹
20
张惠妹22
张庭2aaa
23
张惠妹aaa20
张柏芝aaa
18
张曼玉aaaaaaa24
林青霞aaaaaaaaaa
26
张庭aaaaaadfdfdfasdfasdf==23


本文链接: http://www.dtmao.cc/news_show_100079.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?