博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Set集合HashSet,TreeSet
阅读量:5147 次
发布时间:2019-06-13

本文共 3401 字,大约阅读时间需要 11 分钟。

1.Set是Collection子接口,Set无法记住元素添加顺序,不允许重复元素,最多包含 一个 null 元素,当试图添加两个相同元素进Set集合,添加操作失败,add()方法会返回false。(无序,不重复)

2.Set判断两个对象是否相等用equals比较,而不是==。
3.常用子类:hashSet(散列存放),treeSet(有序存放)


HashSet类(不同步)

当想HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,判断已经存储在集合中的对象的hashCode值是否与添加对象的hashCode值一致:若不一致,直接添加;若一致,在进行equals方法比较,equals方法如果返回True,表明对象已经添加进去了,不会再添加新的对象,否则添加进去;
注意:
1.如果重写了equals方法,那么也必须重写hashCode方法,反之亦然。
2.如果需要某个类的对象保存到HashCode集合中,重写该类的equals()hashCode()方法,应该尽量保证两个对象通过equals比较返回true时,他们的hashCode返回也相等。

package com.wql;import java.util.HashSet;import java.util.Iterator;import java.util.Set;/** * HashSet演示 *  * @author wql * */class Person {    private String name;    public Person(String name) {        super();        this.name = name;    }    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + ((name == null) ? 0 : name.hashCode());        return result;    }    @Override    public boolean equals(Object obj) {        if (this == obj)            return true;        if (obj == null)            return false;        if (getClass() != obj.getClass())            return false;        Person other = (Person) obj;        if (name == null) {            if (other.name != null)                return false;        } else if (!name.equals(other.name))            return false;        return true;    }    @Override    public String toString() {        return name;    }}public class HashSetDemo {
public static void main(String[] args) { // TODO 自动生成的方法存根 Set s=new HashSet(); s.add(new Person("张三"));//如果不重写hashCode()和equals()方法,会输出三个张三 s.add(new Person("张三")); s.add(new Person("张三")); for (Iterator it = s.iterator(); it.hasNext();) { Object obj = (Object) it.next(); System.out.println(obj.toString()); } }}

运行结果:

这里写图片描述
如果没有重写hashCode()和equals()方法,或者只是重写两个方法其中一个,结果会输出三个 张三。


TreeSet类(不同步)

TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,既TreeSet会调用元素的compareTo(Object o)方法来比较元素的大小关系,然后将集合里的元素按升序排列。此时需要排序的元素的类必须实现compareTo(Object o)方法。
该方法用于比较对象,若:obj1.compareTo(obj2),返回0,表示两个对象相等,若返回一个正整数,表示obj1大于obj2,若返回一个负整数,表示obj1小于obj2。

package com.wql;import java.util.Iterator;import java.util.Set;import java.util.TreeSet;/** * TreeSet演示 *  * @author wql * */class Student implements Comparable{    //实现Comparable接口    private String name;    private int age;    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    @Override    public int compareTo(Object o) {        // TODO 自动生成的方法存根        if(o instanceof Student){            Student s=(Student)o;            return this.age-s.age;        }        return 0;    }    @Override    public String toString() {        return "Student [name=" + name + ", age=" + age + "]";    }}public class TreeSetDemo {
public static void main(String[] args) { // TODO 自动生成的方法存根 Set set=new TreeSet(); set.add(new Student("张三",25)); set.add(new Student("王五",28)); set.add(new Student("李四",23)); set.add(new Student("张三",25));//不会输出,Set集合不允许重复元素 for (Iterator it = set.iterator(); it.hasNext();) { Object obj = (Object) it.next(); System.out.println(obj.toString()); } }}

运行结果:

这里写图片描述

转载于:https://www.cnblogs.com/wangqilong/p/8279803.html

你可能感兴趣的文章
Hive(7)-基本查询语句
查看>>
Redis快速入门
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
inline函数的总结
查看>>
Python字符编码
查看>>
leetcode 49. 字母异位词分组(Group Anagrams)
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
财务结算的目的和一般流程
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
老李分享:5个衡量软件质量的标准
查看>>
Xcode部分插件无法使用识别的问题
查看>>
set学习记录
查看>>
用函数写注册功能
查看>>
JVM笔记4:Java内存分配策略
查看>>
IE8 window.open 不支持此接口 的问题解决
查看>>
Django -- 发送HTML格式的邮件
查看>>
最近面试问题汇总
查看>>