黑马程序员-集合2-Set集合

来源:互联网 发布:织梦cms视频模板 编辑:程序博客网 时间:2024/05/01 09:28

集合2-Set集合

Set集合的功能和Collection是一致的。

|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、

|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

HashSet是如何保证元素唯一性的呢?

是通过元素的两个方法,hashCode和equals来完成。

如果元素的HashCode值相同,才会判断equals是否为true。

如果元素的hashcode值不同,不会调用equals。

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

|--TreeSet:可以对set集合中的元素进行排序。

底层数据结构是二叉树。

保证元素唯一性的依据:

compareTo方法相同return 0.

TreeSet排序的第一种方式:让元素自身具备比较性。

元素需要实现Comparable接口,覆盖compareTo方法。

也种方式也成为元素的自然顺序,或者叫做默认顺序。

TreeSet的第二种排序方式。

当元素自身不具备比较性时,或者具备的比较性不是所需要的。

这时就需要让集合自身具备比较性。

在集合初始化时,就有了比较方式。

Java代码 复制代码 收藏代码
  1. import java.util.*;
  2. class HashSetDemo
  3. {
  4. public static void sop(Object obj)
  5. {
  6. System.out.println(obj);
  7. }
  8. public static void main(String[] args)
  9. {
  10. HashSet hs = new HashSet();//创建set集合
  11. sop(hs.add("java01"));//在集合中添加元素
  12. sop(hs.add("java01"));
  13. hs.add("java02");
  14. hs.add("java03");
  15. hs.add("java03");
  16. hs.add("java04");
  17. Iterator it = hs.iterator();//使用迭代器对集合元素进行获取
  18. while(it.hasNext())
  19. {
  20. sop(it.next());
  21. }
  22. }
  23. }

往hashSet集合中存入自定对象

姓名和年龄相同为同一个人,重复元素。

Java代码 复制代码 收藏代码
  1. import java.util.*;
  2. class HashSetTest
  3. {
  4. public static void sop(Object obj)
  5. {
  6. System.out.println(obj);
  7. }
  8. public static void main(String[] args)
  9. {
  10. HashSet hs = new HashSet();//创建一个集合
  11. hs.add(new Person("a1",11));//在集合中添加若干元素
  12. hs.add(new Person("a2",12));
  13. hs.add(new Person("a3",13));
  14. hs.add(new Person("a2",12));
  15. hs.add(new Person("a4",14));
  16. //sop("a1:"+hs.contains(new Person("a2",12)));
  17. hs.remove(new Person("a4",13));
  18. Iterator it = hs.iterator();//获取迭代器
  19. while(it.hasNext())
  20. {
  21. Person p = (Person)it.next();//因为要使用集合中元素的特有方法,要进行强转
  22. sop(p.getName()+"::"+p.getAge());//打印元素的属性
  23. }
  24. }
  25. }
  26. class Person//创建一个person类
  27. {
  28. private String name;//类中有若干成员属性
  29. private int age;
  30. Person(String name,int age)
  31. {
  32. this.name = name;
  33. this.age = age;
  34. }
  35. //因存入到hashset中,所以覆盖hashcode和equals方法
  36. public int hashCode()
  37. {
  38. System.out.println(this.name+"....hashCode");
  39. return name.hashCode()+age*37;//哈希值根据姓名和年龄计算
  40. }
  41. public boolean equals(Object obj)
  42. {
  43. if(!(obj instanceof Person))//判断是否是同一类型
  44. return false;
  45. Person p = (Person)obj;
  46. System.out.println(this.name+"...equals.."+p.name);
  47. return this.name.equals(p.name) &&this.age == p.age;//如果姓名和年龄相同,视为同一个人
  48. }
  49. //定义获取属性的方法
  50. public String getName()
  51. {
  52. return name;
  53. }
  54. public int getAge()
  55. {
  56. return age;
  57. }
  58. }

Treeset:

需求:

往TreeSet集合中存储自定义对象学生。

想按照学生的年龄进行排序。

记住,排序时,当主要条件相同时,一定判断一下次要条件。

当元素自身不具备比较性,或者具备的比较性不是所需要的。

这时需要让容器自身具备比较性。

定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序都存在时,以比较器为主。

定义一个类,实现Comparator接口,覆盖compare方法。

Java代码 复制代码 收藏代码
  1. class TreeSetDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. TreeSet ts = new TreeSet();//创建一个treeSet集合
  6. ts.add(new Student("lisi02",22));//在集合中添加若干元素
  7. ts.add(new Student("lisi007",20));
  8. ts.add(new Student("lisi09",19));
  9. ts.add(new Student("lisi08",19));
  10. //ts.add(new Student("lisi007",20));
  11. //ts.add(new Student("lisi01",40));
  12. Iterator it = ts.iterator();//获取迭代器
  13. while(it.hasNext())
  14. {
  15. Student stu = (Student)it.next();//强转
  16. System.out.println(stu.getName()+"..."+stu.getAge());//获取元素的成员属性
  17. }
  18. }
  19. }
  20. class Student implements Comparable//该接口强制让学生具备比较性。
  21. {
  22. private String name;
  23. private int age;
  24. Student(String name,int age)
  25. {
  26. this.name = name;
  27. this.age = age;
  28. }
  29. //覆盖compareTo方法,是该类具有一定的比较规则
  30. public int compareTo(Object obj)
  31. {
  32. if(!(obj instanceof Student))//判断比较的是否是同类对象
  33. throw new RuntimeException("不是学生对象");
  34. Student s = (Student)obj;
  35. System.out.println(this.name+"....compareto....."+s.name);
  36. if(this.age>s.age)//比较年龄
  37. return 1;
  38. if(this.age==s.age)
  39. {
  40. return this.name.compareTo(s.name);//如果年龄相同按照姓名排序
  41. }
  42. return -1;
  43. /**/
  44. }
  45. public String getName()
  46. {
  47. return name;
  48. }
  49. public int getAge()
  50. {
  51. return age;
  52. }
  53. }

原创粉丝点击