当前位置:   article > 正文

Java中的HashSet、TreeSet、LinkedHashSet_java linkedhashset treeset

java linkedhashset treeset

/**
 * Set接口
 * 1、无序的(不保证顺序)
 * 2、不允许重复元素
 * HashSet、TreeSet、LinkedHashSet
 *
 * 如果要排序,选择treeSet
 * 如果不用排序,也不用保证顺序选择HashSet
 * 不要排序,要保证顺序,选择linkedHashSet
 *
 * @author 11010
 *
 */

LinkedHashSet

/**
     * 哈希表和链表列表实现
     * 维护着一个运行于所有条目的双重链接列表,此链接列表定义了迭代顺序,即按照将元素插入到Set中的顺序(插入顺序)进行迭代。
     *
     */

  1. private static void linkHashSet() {
  2. LinkedHashSet<Cat> set = new LinkedHashSet<>();
  3. Cat c1 = new Cat("喵喵",5,"公");
  4. Cat c2 = new Cat("咪咪",3,"母");
  5. Cat c3 = new Cat("奶茶",4,"母");
  6. Cat c4 = new Cat("喵喵",5,"母");
  7. set.add(c1);
  8. set.add(c2);
  9. set.add(c3);
  10. set.add(c4);
  11. for(Cat c:set) {
  12. System.out.println(c);
  13. }
  14. }

TreeSet

/**
     * 有序的,基于TreeMap(二叉树数据结构),对象需要比较大小,通过对象比较器(Comparator<Cat>)来实现,
     * 对象比较器还可以用来去除重复元素,如果自定义的数据类,没有实现比较器接口,将无法添加到TreeSet集合中
     *
     */

  1. private static void treeSet() {
  2. TreeSet<Cat> tree = new TreeSet<>(new CatComparator());
  3. Cat c1 = new Cat("喵喵",5,"公");
  4. Cat c2 = new Cat("咪咪",3,"母");
  5. Cat c3 = new Cat("奶茶",4,"母");
  6. Cat c4 = new Cat("喵喵",5,"母");
  7. tree.add(c1);
  8. tree.add(c2);
  9. tree.add(c3);
  10. tree.add(c4);
  11. System.out.println(tree.size());
  12. for(Cat c:tree) {
  13. System.out.println(c);
  14. }
  15. }

HashSet

/**
     * 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;
     */

  1. package com.chen;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. private static void hashSet() {
  5. Set<String> set = new HashSet();
  6. set.add("周泰");
  7. set.add("关羽");
  8. set.add("戏志才");
  9. set.add("张角");
  10. set.add("袁术");
  11. set.add("曹操");
  12. String[] names = set.toArray(new String[]{});
  13. for(String s:names) {
  14. System.out.println(s);
  15. }
  16. Cat c1 = new Cat("喵喵",5,"公");
  17. Cat c2 = new Cat("咪咪",3,"母");
  18. Cat c3 = new Cat("奶茶",4,"母");
  19. Cat c4 = new Cat("喵喵",5,"公");
  20. Set<Cat> cats = new HashSet<>();
  21. cats.add(c1);
  22. cats.add(c2);
  23. cats.add(c3);
  24. cats.add(c4);
  25. cats.add(c2);
  26. System.out.println(cats.size());
  27. for(Cat c:cats) {
  28. System.out.println(c);
  29. }
  30. System.out.println("c1="+c1.hashCode());
  31. System.out.println("c2="+c2.hashCode());
  32. System.out.println("c3="+c3.hashCode());
  33. System.out.println("c4="+c4.hashCode());
  34. }
  35. public static void main(String[] args) {
  36. }
  37. }

自定义对象

  1. package com.chen;
  2. public class Cat {
  3. private String name;
  4. private int age;
  5. private String sex;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public int getAge() {
  13. return age;
  14. }
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. public String getSex() {
  19. return sex;
  20. }
  21. public void setSex(String sex) {
  22. this.sex = sex;
  23. }
  24. @Override
  25. public String toString() {
  26. return "Cat [name=" + name + ", age=" + age + ", sex=" + sex + "]";
  27. }
  28. public Cat(String name, int age, String sex) {
  29. super();
  30. this.name = name;
  31. this.age = age;
  32. this.sex = sex;
  33. }
  34. public Cat() {
  35. super();
  36. }
  37. @Override
  38. public int hashCode() {
  39. final int prime = 31;//系数
  40. int result = 1;
  41. result = prime * result + age;
  42. result = prime * result + ((name == null) ? 0 : name.hashCode());
  43. result = prime * result + ((sex == null) ? 0 : sex.hashCode());
  44. return result;
  45. }
  46. @Override
  47. public boolean equals(Object obj) {
  48. if (this == obj)
  49. return true;
  50. if (obj == null)
  51. return false;
  52. if (getClass() != obj.getClass())
  53. return false;
  54. Cat other = (Cat) obj;
  55. if (age != other.age)
  56. return false;
  57. if (name == null) {
  58. if (other.name != null)
  59. return false;
  60. } else if (!name.equals(other.name))
  61. return false;
  62. if (sex == null) {
  63. if (other.sex != null)
  64. return false;
  65. } else if (!sex.equals(other.sex))
  66. return false;
  67. return true;
  68. }
  69. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/955329
推荐阅读
相关标签
  

闽ICP备14008679号