java集合中set接口的三个实现类HashSet,TreeSet, LinkedhashSet代码实例

package Collection;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;

/**
 * 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("张三");
        set.add("李四");
        set.add("王麻子");
        String[] names = set.toArray(new String[]{});
        for(String s:names){
            System.out.println(s);

        }


        Cat c1 = new Cat("miao", 2, 1);
        Cat c2 = new Cat("hah", 3, 2);
        Cat c3 = new Cat("wh", 4, 3);
        Cat c4 = new Cat("wh", 4, 3);//会被添加进去,对象地址不同。如果去除这个,需要在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("hah", 3, 2);
        Cat c3 = new Cat("wh", 4, 3);
        Cat c4 = new Cat("wh", 4, 3);
        Cat c1 = new Cat("miao", 2, 1);


        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 c1 = new Cat("miao", 2, 1);
        Cat c2 = new Cat("hah", 3, 2);
        Cat c3 = new Cat("wh", 4, 3);
        Cat c4 = new Cat("wh", 4, 3);
        lhs.add(c1);
        lhs.add(c2);
        lhs.add(c3);
        lhs.add(c4);
        for (Cat c : lhs) {
            System.out.println(c);

        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值