java集合中set接口的三个实现类HashSet,TreeSet, LinkedhashSet简介说明

杨幂 Java经验 发布时间:2022-05-17 11:22:13 阅读数:8820 1
下文笔者讲述set接口的实现类简介说明,如下所示:
 
package Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;

/**
 * java265.com 示例分享
 * Set接口
 * 1,无序(有序或无序是指是否按照其添加的顺序来存储对象)
 * 2,不允许重复元素
 * 实现类 HashSet,TreeSet, LinkedhashSet
 * 如果要排序选择 TreeSet;布排序也不保证顺序选择HashSet;不排序,保证顺序,要选择LinkedHashSet
 */
public class SetDemo {
    public SetDemo() {
    }

    public static void main(String[] args) {
     // hashset();
    //  treeSet();
        linkedHashSet();
    }

    /**
     * HashSet
     * 1,实现原理,基于哈希表(hashMap)实现
     * 2,不允许重复,可以有一个null值
     * 3,不保证顺序恒久不变
     * 4,添加元素,把元素作为HashMap的key存储,HashMap的value值使用一个固定的(Object)对象
     * 5,排除重复元素是通过equals来检查对象是否相同
     * 6,判断两个对象是否相同,先判断两个对象的hashcode是否相同(如果两个对象的hashcode相同,不一定是同一个对象,如果奴同,不是同一个对象)
     * 如果相同,进行equals判断
     * 7,自定义对象要认为属性值都相同时,为同一对象,需要重写equals方法
     * 哈希表结构:数组+链表,数组的每个元素以链表形式存储
     * 如何把对象存入哈希表中,先计算对象的hashcode值,再对数组长度求余,来决定对象要存储在数组中的哪个个位置
     * 解决hashset中的重复值使用方法,参考第六点
     */
    private static void hashset(){
        HashSet<String> set = new HashSet<>();
        set.add("java265-1");
        set.add("java265-2");
        set.add("java265-3");
        String[] names = set.toArray(new String[]{});
        for(String s:names){
            System.out.println(s);

        }


        Cat c1 = new Cat("hi", 88, 99);
        Cat c2 = new Cat("hi2", 100,110);
        Cat c3 = new Cat("hi3", 120, 123);
        Cat c4 = new Cat("hi4", 555, 666);//会被添加进去,对象地址不同。如果去除这个,需要在Cat中重写equals方法
        HashSet<Cat> cats = new HashSet<>();
        cats.add(c1);
        cats.add(c2);
        cats.add(c3);
        cats.add(c4);
        for (Cat s : cats) {
            System.out.println(s);
        }
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());
        System.out.println(c4.hashCode());

    }

    /**
     * treeSet是有序的,基于TreeMap(二叉数据结构),对象比较大小,通过对象比较器来实现
     * 对象比较器还可以去除重复元素,如果自定义实现比较器接口,将无法添加TreeSet集合
     */
    private static void treeSet(){
        TreeSet<Cat> tree = new TreeSet<Cat>(new CatComparator());
        Cat c2 = new Cat("wuhan",88, 99);
        Cat c3 = new Cat("shenzhen",111, 2222);
        Cat c4 = new Cat("shanghai", 444, 666);
        Cat c1 = new Cat("hangzhou", 7777,8888);


        tree.add(c1);
        tree.add(c2);
        tree.add(c3);
        tree.add(c4);
        System.out.println(tree.size());
        for (Cat cat : tree) {
            System.out.println(cat);
        }
    }

    /**
     * 哈希表和来链接表来实现
     * 维护者一个运行于所有条目的双重链接列表,此链接列表定义了迭代顺序,既按照元素插入到set中的顺序(插入顺序,进行迭代)
     */
    private static void linkedHashSet(){
        LinkedHashSet<Cat> lhs = new LinkedHashSet<>();
        Cat c2 = new Cat("wuhan",88, 99);
        Cat c3 = new Cat("shenzhen",111, 2222);
        Cat c4 = new Cat("shanghai", 444, 666);
        Cat c1 = new Cat("hangzhou", 7777,8888);
        lhs.add(c1);
        lhs.add(c2);
        lhs.add(c3);
        lhs.add(c4);
        for (Cat c : lhs) {
            System.out.println(c);

        }
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202205/16527577843401.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者