zoukankan      html  css  js  c++  java
  • 黑马程序员集合2Set集合

    集合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. }

  • 相关阅读:
    jquery中的ajax方法参数的用法和他的含义:
    链接
    数据库视图作用?什么时候用视图?
    八大排序算法的 Python 实现
    @wrap装饰器
    model方法取值总结
    js获取select改变事件
    SQL Server查询时添加一列连续的自增列
    UIAppearance使用详解-备
    NSString、NSData、char* 类型之间的转换-备
  • 原文地址:https://www.cnblogs.com/bjanzhuo/p/3576077.html
Copyright © 2011-2022 走看看