java集合中set接口的三个实现类HashSet,TreeSet, LinkedhashSet简介说明
下文笔者讲述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); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。