当前位置:   article > 正文

Java—Set集合(HashSet、TreeSet)_java hashset treeset

java hashset treeset

今天来看看Java集合中的Set集合,为什么Set集合中元素不能重复?为什么Set集合是无序的?我们来共同交流交流

目录

Set集合的概述

特点

继承和实现情况

实际应用

HashSet

有什么特点吗?

方法有哪些?

实战演练

TreeSet

有什么特征吗?

方法有哪些?

实战演练

自然排序

定制排序


Set集合的概述

特点

元素不可重复(相同内容不会被加入,没有下标)

无序(存进去是这个顺序,取出来就不一定是这个顺序)(Set容器可以与数学中的“集合”的概念相对应)

Set接口是Collection的子接口,Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有有顺序的,而且不可以重复。

Set容器类:HashSet、TreeSet

继承和实现情况

  • TreeSet实现AbstractSet类
  • 实现NavigableSet接口:使用导航方法扩展的 SortedSet,报告给定搜索目标的最接近匹配。方法lower、floor、ceiling和higher分别返回小于、小于或等于、大于或等于和大于给定元素的元素,如果没有这样的元素则返回null。可以按升序或降序访问和遍历 NavigableSet。
  • 实现Cloneable接口:向 Object.clone() 方法指示该方法可以合法地对该类的实例进行逐个字段的复制。在未实现 Cloneable 接口的实例上调用 Object 的 clone 方法会导致抛出异常 CloneNotSupportedException。
  • 实现 java.io.Serializable接口:未实现此接口的类将不会对其任何状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于识别可序列化的语义。

实际应用

  1. import java.util.HashSet;
  2. import java.util.Set;
  3. public class SetTest {
  4. public static void main(String[] args){
  5. Set s = new HashSet();
  6. s.add("hello");
  7. s.add("world");
  8. s.add(new Name("f1","f2"));
  9. s.add(new Integer(100));
  10. s.add(new Name("f1","f2")); //相同的元素不会被加入
  11. s.add("hello"); //相同的元素不会被加入
  12. System.out.println(s);
  13. }
  14. }

输出结果:[100,hello,world,f1 f2]

  1. import java.util.Set;
  2. import java.util.HashSet;
  3. public class SetTest2 {
  4. public static void main(String[] args){
  5. Set s1=new HashSet();
  6. Set s2 =new HashSet();
  7. s1.add("1");
  8. s1.add("b");
  9. s1.add("c");
  10. s2.add("d");
  11. s2.add("a");
  12. s2.add("b");
  13. //Set和List容器类都具有Constructor(Collection c)
  14. //构造方法用以初始化容器类
  15. Set sn = new HashSet(s1);
  16. sn.retainAll(s2);
  17. Set su = new HashSet(s1);
  18. su.addAll(s2);
  19. System.out.println(sn);
  20. System.out.println(su);
  21. }
  22. }

输出结果:

[a,b]

[d,a,c,b]

下面我们来具体说说HashSet和TreeSet的使用吧~


HashSet

有什么特点吗?

  • 不可重复
  • 无序的,即不会记录插入的顺序
  • 可以存不同类型数据
  • 集合元素可以存null(但只能存储一个null值)

方法有哪些?

add:添加元素

remove:删除元素

contains:判断是否包含某个元素

clear:清空

Iterator:使用迭代器遍历集合

foreach:遍历集合

实战演练

  1. import java.net.SocketOption;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.Set;
  5. public class HashSetTest {
  6. public static void main(String[] args) {
  7. //实例化一个HashSet集合
  8. Set set = new HashSet();
  9. //添加元素
  10. set.add(1);
  11. set.add("a");
  12. System.out.println(set);
  13. //删除元素
  14. set.remove(1);
  15. System.out.println(set);
  16. //判断是否包含某个元素
  17. System.out.println(set.contains(1));
  18. //清空集合
  19. set.clear();
  20. System.out.println(set);
  21. set.add("a");
  22. set.add("b");
  23. set.add("c");
  24. set.add("d");
  25. set.add("d"); //重复的元素不会被添加
  26. set.add(null); //可以存取空值
  27. System.out.print(set);
  28. //使用迭代器遍历集合
  29. Iterator it =set.iterator();
  30. while (it.hasNext()){
  31. System.out.println(it.next());
  32. }
  33. //for each迭代集合
  34. for (Object obj:set){//把set的每一个值取出来,赋值给obj,直到循环完set的所有值
  35. System.out.println(obj);
  36. }
  37. System.out.println(set.size()); //获取集合的元素个数
  38. }
  39. }

如果想要让集合只能存同样类型的对象,怎么做呢?实例化时就指定出具体数据类型

  1. //使用泛型
  2. Set<String> set1 = new HashSet<String>();
  3. set1.add("a");
  4. set1.add("123");

注:可能很多小伙伴发现自己添加的元素有重复内容,但集合自动去重了,Set的去重原理是什么?这里有一篇还不错的博客,可以转战观看:​​​​​​Java笔记 —— Set集合的去重原理(源码分析)_一纸春秋的博客-CSDN博客_java set 去重原理


TreeSet

有什么特征吗?

  • 有序(底层在添加元素的时候会自动进行排序)
  • 可以对元素进行排序(自然排序(默认)、定制排序)

为什么TreeSet的存储结构是有序的?

在进行add添加元素的时候底层会进行一个逻辑判断,如果要新添加的元素在集合中存在,则该集合的元素保持;如果要添加的元素在集合中不存在,则将元素添加到集合中,并且进行自然排序:

TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列

  • 如果this>obj,返回正数1
  • 如果this<obj,返回正数-1
  • 如果this=obj,返回0,则认为这两个对象相等

必须放入同样类的对象。(默认会进行排序)否则可能会发生类型转换异常,我们可以使用泛型来进行限制

方法有哪些?

add:添加元素

remove:删除元素

contains:判断是否包含某个元素

clear:清空

实战演练

自然排序

  1. import java.util.Iterator;
  2. import java.util.Set;
  3. import java.util.TreeSet;
  4. public class TreeSetTest {
  5. public static void main(String[] args) {
  6. Set<Integer> set = new TreeSet<Integer>();
  7. //TreeSet自然排序
  8. set.add(5);
  9. set.add(2);
  10. set.add(4);
  11. set.add(3);
  12. System.out.println(set); //输出结果为2 3 4 5
  13. //删除元素
  14. set.remove(5);
  15. //判断是否包含某个元素
  16. set.contains(3);
  17. //清空集合
  18. set.clear();
  19. //使用迭代器遍历集合
  20. Iterator<Integer> it = set.iterator();
  21. while(it.hasNext()){
  22. System.out.println(it.next());
  23. }
  24. //for each迭代集合
  25. for (Integer i:set){
  26. System.out.println(i);
  27. }
  28. }
  29. }

定制排序

在创建TreeSet集合对象时,提供一个Comparator接口的实现类对象。由该Comparator对象负责集合元素的排序逻辑

  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5. public class TreeSetTest {
  6. public static void main(String[] args) {
  7. //-------------------------------------
  8. Person p1 = new Person("唐三",21);
  9. Person p2 = new Person("小舞",21);
  10. Person p3 = new Person("戴沐白",25);
  11. Person p4 = new Person("奥斯卡",24);
  12. Person p5 = new Person("朱竹清",20);
  13. Person p6 = new Person("宁荣荣",19);
  14. Person p7 = new Person("马红俊",26);
  15. Set<Person> personSet = new TreeSet<Person>(new Person());
  16. personSet.add(p1);
  17. personSet.add(p2);
  18. personSet.add(p3);
  19. personSet.add(p4);
  20. personSet.add(p5);
  21. personSet.add(p6);
  22. personSet.add(p7);
  23. for(Person p:personSet){
  24. System.out.println(p.name+" "+p.age);
  25. }
  26. }
  27. }
  28. class Person implements Comparator<Person> {
  29. String name ;
  30. int age;
  31. public Person(){}
  32. public Person(String name,int age){
  33. this.name=name;
  34. this.age=age;
  35. }
  36. //自己定制的比较方法,调用这个方法来判断age
  37. public int compare(Person o1,Person o2){
  38. if(o1.age>o2.age){
  39. return 1;
  40. }else if(o1.age<o2.age){
  41. return -1;
  42. }else{
  43. return 0;
  44. }
  45. }
  46. }

输出结果为:

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

闽ICP备14008679号