java入门篇 (18) set集合

1.接口Set< E >

a.元素无序
b.元素不重复,如果加入重复元素,add方法会返回false
c.可以直接输出set对象(多态),已经重写了toString()方法
d.set判断两个对象是否相等用equals方法

2.Hashset类

2.1 Hashset底层数据结构是哈希表

(1)JDK1.7中,哈希表:是一个元素为链表的数组,综合了数组和链表的优点
(2)JDK1.8中,哈希表:是一个元素为链表或者红黑树的数组
(3)当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象早HashSet中存储的位置。

2.2HashSet集合判断两个元素是否相等

(1)先是通过hashCode()判断是否相等
(2)第一步成立的基础上再用equals方法判断两个对象的内容是否相等

2.3 Hashset类的特点

(1)元素无序且唯一
元素的唯一性要:
a.重写:HasCode()方法
目的:
i.为了确定元素在数组中的位置
ii.减少元素之间用而equals()方法比较确定链表上的位置的次数

public class student {
    String name;
    String age;

    public student() {
    }

    public student(String name, String age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int hashCode() {
        return this.name.hashCode() * 19 + this.age.hashCode();
    }
}

b.重写:equals()方法
步骤:
1.判断两个队象是否地址相同
2.判断两个对象类型是否一致
3.判断两个对象内容是否相同

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return false;
        if (!(o instanceof student))
            return false;
        student stu = (student) o;
        if (!(stu.name.equals(stu.name) && stu.age.equals(stu.age)))
            return false;
        else
            return true;
    }

说明:只重写equals方法可能会遇到两个对象,一个对象那个的成员变量的值比另一个对象那个的成员变量的多,但相同的变量的值相同,这时equals方法无法判断出正确的结果,就需要HashCode方法来判断。

(2)HashSet不是线程安全的
(3)HashSet 迭代很可能支出较大,因为它所需迭代时间与其容量 成正比。
(4)集合元素可以是NUll,但是只能放入一个null值。

2.4HashSet集合的遍历

方法:用增强for循环来遍历

3.LinkedhashSet类

4.1底层数据结构:双重链接列表和哈希表
4.2特点:
a.与hashSet一样根据元素的hashCode值来决定元素的存储位置
c.有序链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代

d.可预知迭代顺序
e.允许null元素,只允许有一个null值。
f.迭代所需时间与 set 的大小 成正比,而与容量无关

public class ste_text {
    public static void main(String[] args) {
        Set set = new LinkedHashSet();
        set.add("zhang");
        set.add("zhg");
        set.add("zhng");
        set.add("zhng");
        set.add("ng");
        set.add("zg");
        set.add("g");
        set.add("z");
        set.add(null);
        set.add(null);
        boolean b = set.add("zhang");
        System.out.println(b);
        System.out.println(set);
    }
}

结果:[zhang, zhg, zhng, ng, zg, g, z, null]

4.TreeSet类

4.1特点

a.元素有序且唯一
b.通过equals方法返回blloean类型结果或者compareto方法返回0
来判断

4.2TreeSet类的排序

a.自然排序:
调用参数为Comparator对象的有参构造函数创建TreeSet对象,并重写compare方法。

TreeSet<student> set = new TreeSet<>(new Comparator<student>() {
    @Override
        public int compare(student o1, student o2) {
           int num = o1.name.compareTo(o2.name);
           int num1 = num == 0 ? o1.age.compareTo(o2.age) : num;
          return num1;
        }
  });

b.使用比较器排序

public class student implements Comparable<student>{
   @Override
    public int compareTo(student o) {
        int num = this.name.compareTo(o.name);
        int num1 = num == 0 ? this.age.compareTo(o.age) : num;
        return -num1;
    }

5.案例

5.1编写案例,获取10个1~20随机数,不允许重复

思路:利用Set集合的唯一性

public class column {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        Random a = new Random();
        while (true) {
            Integer b = a.nextInt(20) + 1;
            set.add(b);
            if (set.size() == 10)
                break;
        }
        for (Integer num : set) {
            System.out.print(num + " ");
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值