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);
}
}
}
java集合中set接口的三个实现类HashSet,TreeSet, LinkedhashSet代码实例
最新推荐文章于 2024-07-10 21:37:49 发布