赞
踩
/**
* Set接口
* 1、无序的(不保证顺序)
* 2、不允许重复元素
* HashSet、TreeSet、LinkedHashSet
*
* 如果要排序,选择treeSet
* 如果不用排序,也不用保证顺序选择HashSet
* 不要排序,要保证顺序,选择linkedHashSet
*
* @author 11010
*
*/
/**
* 哈希表和链表列表实现
* 维护着一个运行于所有条目的双重链接列表,此链接列表定义了迭代顺序,即按照将元素插入到Set中的顺序(插入顺序)进行迭代。
*
*/
- private static void linkHashSet() {
- LinkedHashSet<Cat> set = new LinkedHashSet<>();
- Cat c1 = new Cat("喵喵",5,"公");
- Cat c2 = new Cat("咪咪",3,"母");
- Cat c3 = new Cat("奶茶",4,"母");
- Cat c4 = new Cat("喵喵",5,"母");
- set.add(c1);
- set.add(c2);
- set.add(c3);
- set.add(c4);
-
- for(Cat c:set) {
- System.out.println(c);
- }
- }
/**
* 有序的,基于TreeMap(二叉树数据结构),对象需要比较大小,通过对象比较器(Comparator<Cat>)来实现,
* 对象比较器还可以用来去除重复元素,如果自定义的数据类,没有实现比较器接口,将无法添加到TreeSet集合中
*
*/
- private static void treeSet() {
- TreeSet<Cat> tree = new TreeSet<>(new CatComparator());
- Cat c1 = new Cat("喵喵",5,"公");
- Cat c2 = new Cat("咪咪",3,"母");
- Cat c3 = new Cat("奶茶",4,"母");
- Cat c4 = new Cat("喵喵",5,"母");
- tree.add(c1);
- tree.add(c2);
- tree.add(c3);
- tree.add(c4);
- System.out.println(tree.size());
-
- for(Cat c:tree) {
- System.out.println(c);
- }
- }
/**
* HashSet
* 1、实现原理。基于哈希表(HashMap)实现
* 2、不允许重复,可以有一个NULL元素
* 3、不保证顺序恒久不变
* 4、添加元素时把元素作为HashMap的Key存储,HashMap的value使用一个固定的Object对象
* 5、排除重复,通过equals值来检查是否相同
* 6、判断两个对象是否相同,先判断两个对象的hashCode是否相同(如果两个对象的hashCode相同,
* 不一定是同一个对象,如果不同,那一定不是同一个对象),如果不同,则两个对象不是同一个对象,如果相同,
* 还要进行equals判断,如果相同,是同一个对象,如果不同,则不是同一个对象
* 7、自定义对象要认为属性值都相同时为同一个对象,有这种需求时,那么我们要重写对象所在类的hashCode和equals方法
*
* 小结
* (1)哈希表的存储结构:数组+链表,数组里的每个元素以链表的形式存储
* (2)如何把对象存储到哈希表中,先计算对象的hashCode值,再对数组的长度求余数,来决定对象要存储在数组中的那个位置
* (3)解决HashSet中的重复值使用的方法是:参考上述6;
*/
- package com.chen;
-
- import java.util.HashSet;
- import java.util.Set;
-
- private static void hashSet() {
- Set<String> set = new HashSet();
- set.add("周泰");
- set.add("关羽");
- set.add("戏志才");
- set.add("张角");
- set.add("袁术");
- set.add("曹操");
- String[] names = set.toArray(new String[]{});
- for(String s:names) {
- System.out.println(s);
- }
- Cat c1 = new Cat("喵喵",5,"公");
- Cat c2 = new Cat("咪咪",3,"母");
- Cat c3 = new Cat("奶茶",4,"母");
- Cat c4 = new Cat("喵喵",5,"公");
- Set<Cat> cats = new HashSet<>();
- cats.add(c1);
- cats.add(c2);
- cats.add(c3);
- cats.add(c4);
- cats.add(c2);
- System.out.println(cats.size());
-
- for(Cat c:cats) {
- System.out.println(c);
- }
-
- System.out.println("c1="+c1.hashCode());
- System.out.println("c2="+c2.hashCode());
- System.out.println("c3="+c3.hashCode());
- System.out.println("c4="+c4.hashCode());
- }
-
- public static void main(String[] args) {
-
- }
-
- }
自定义对象
- package com.chen;
-
- public class Cat {
-
- private String name;
- private int age;
- private String sex;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- @Override
- public String toString() {
- return "Cat [name=" + name + ", age=" + age + ", sex=" + sex + "]";
- }
- public Cat(String name, int age, String sex) {
- super();
- this.name = name;
- this.age = age;
- this.sex = sex;
- }
- public Cat() {
- super();
- }
- @Override
- public int hashCode() {
- final int prime = 31;//系数
- int result = 1;
- result = prime * result + age;
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- result = prime * result + ((sex == null) ? 0 : sex.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;
- Cat other = (Cat) obj;
- if (age != other.age)
- return false;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- if (sex == null) {
- if (other.sex != null)
- return false;
- } else if (!sex.equals(other.sex))
- return false;
- return true;
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。