Set

概述

java.util.Set 接口和java.util.List 接口一样,同样继承自Collection 接口,它与Collection 接口中的方法基本一致,并没有对Collection 接口进行功能上的扩充,只是比Collection 接口更加严格了。

Set接口中元素无需,并且不可重复

HashSet

java.util.HashSet是Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)

HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能。

保证元素唯一性的方式依赖于: hashCodeequals 方法。

package Demo2;

import java.util.HashSet;
import java.util.Iterator;

public class Demo2 {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("锄禾日当午");
        set.add("汗滴禾下土");
        set.add("谁知盘中餐");
        set.add("粒粒皆辛苦");
        set.add("锄禾日当午");
       /* Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }*/
        for (String s:set) {
            System.out.println(s);
        }
    }
}

由于HashSet利用散列表存储,因此无法保证存储顺序,是无序的。
并且添加重复元素也是无效的
在这里插入图片描述

TreeSet

TreeSet是属于排序的子类,因此TreeSet能够保存元素的有序性。

注意:此处的有序并非指按照输入顺序排序,而是保证Unicode排序顺序

package Demo2;

import java.util.Set;
import java.util.TreeSet;

public class Demo3 {
    public static void main(String[] args) {
        Set<String> all = new TreeSet<>();
        all.add("D");
        all.add("X");
        all.add("A");
        System.out.println(all);
    }
}

//输出:[A, D, X]

虽然在增加元素的时候属于无序的操作,但是增加之后却可以为用户进行排序功能的实现。

当需要比较自己定义的类,则需要实现Comparable接口,并根据需要叙述排序规则

package Demo2;

import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;

public class Demo3 {
    public static void main(String[] args) {
       TreeSet<Person> data = new TreeSet<>();
       Person p1 = new Person("张三",18);
       Person p2 = new Person("李四",20);
       data.add(p1);
       data.add(p2);
       for (Person p:data){
           System.out.println(p);
       }


    }

    static  class Person implements Comparable<Person>{
        private String name;
        private int age;
        @Override
        public int compareTo(Person o) {
            //this与o比较
            //返回的数据 负数  this小/0相等/正数this大
            if (this.age>o.age){
                return 1;
            }else if(this.age == o.age){
                return 0;
            }else {
                return -1;
            }
        }

        public Person() {
        }

        public Person(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) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Person person = (Person) o;
            return age == person.age &&
                    Objects.equals(name, person.name);
        }

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

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

LinkedHashSet

HashSet可以保证元素唯一,但元素存放进去是无序的。当需要保证有序的时候,则可以使用HashSet下面的一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值