set集合 我就是我 2024-03-16 18:50 52阅读 0赞 **目录** 1,set集合的特点: 1.1,set集合添加的数据不可重复 1.2 hashset无序 Treeset有序 1.2.1set集合的遍历方法 1.2.2Treeset自定义对象无法排序,hashSet因为是无序所以会无规则遍历 1.2.3如何让Treeset集合进行排序(自然排序.比较器排序 ) -------------------- ## 1,set集合的特点: ## ### 1.1,set集合添加的数据不可重复 ### public static void main(String[] args) { Set s = new HashSet(); s.add("b"); s.add("a"); s.add("c"); s.add("b"); System.out.println(s); } 通过上一行代码输出的结果为: ![91161c8d7a004e4e9672a0d0143d2406.png][] 由此可以说明set集合里的数据不可重复。 但是若存放的数据为对象时: public static void main(String [] args) { HashSet<Object> set =new HashSet<Object>(); set.add(new person("zs",12)); set.add(new person("ww",12)); set.add(new person("ls",12)); System.out.println(set.size()); set.add(new person("ww",12)); System.out.println(set.size()); } 运行此段代码的结果如图: ![6d3ecad2c5904966a301f6f45af626c6.png][] 由此可以说明但我们在set集合添加属性值一样的对象时,因为地址同所以可以存放进去,那我们该怎么解决?我们尝试用list集合去重原理试一下。 package com.xzs.set; import java.util.HashSet; import java.util.Set; public class demo1 { public static void main(String [] args) { HashSet<Object> set =new HashSet<Object>(); set.add(new person("zs",12)); set.add(new person("ww",12)); set.add(new person("ls",12)); System.out.println(set.size()); set.add(new person("ww",12)); System.out.println(set.size()); } } class person{ private String name; private int age; 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 person(String name, int age) { super(); this.name = name; this.age = age; } public person() { super(); } @Override public String toString() { return "person [name=" + name + ", age=" + age + "]"; } @Override // public int hashCode() { // final int prime = 31; // int result = 1; // result = prime * result + age; // result = prime * result + ((name == null) ? 0 : name.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; person other = (person) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } 以上代码运行结果是 ![3101d63e032b4de58af224da73d67b05.png][] 同样集合的长度还是3和4由此说明set集合与list集合判定的底层逻辑就不同 package com.xzs.set; import java.util.HashSet; import java.util.Set; public class demo1 { public static void main(String [] args) { HashSet<Object> set =new HashSet<Object>(); set.add(new person("zs",12)); set.add(new person("ww",12)); set.add(new person("ls",12)); System.out.println(set.size()); set.add(new person("ww",12)); System.out.println(set.size()); } } class person{ private String name; private int age; 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 person(String name, int age) { super(); this.name = name; this.age = age; } public person() { super(); } @Override public String toString() { return "person [name=" + name + ", age=" + age + "]"; } @Override public int hashCode() { System.out.println("hashcode被调用了"); final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { System.out.println("equals被调用了"); if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; person other = (person) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } 同样是上一行代码,这时候运行的结果为 ![d1842ec0e9ae4bacb9736618af0f0fd8.png][] 由此可以说明,set集合在判定数据是先通过hascode,并且在上类代码中当我们的hashcode被注释的时候equlas,也不会被调用,所以set集合的判定是否为重复数组的原理是:“先来通过hashcode判定,才会进入equals判定” ### 1.2 hashset无序 Treeset有序 ### 要想判定set集合是否为有序的我们可以遍历他的元素即可 #### 1.2.1set集合的遍历方法 #### 1.为迭代器也就是图中的Iterator 2.增强for也就是foreach public static void main(String[] args) { Set s = new HashSet(); s.add("a"); s.add("c"); s.add("b"); for (Object o : s) { System.out.println(o); } System.out.println("=============================="); Iterator it = s.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } 结果为: ![3218cdf52bfc4d1997f31f7ab6fbb4d4.png][] 证明 string 类型是可以自动排序的 #### 1.2.2Treeset自定义对象无法排序,hashSet因为是无序所以会无规则遍历 #### package com.xzs.set; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class demo1 { public static void main(String [] args) { TreeSet<Object> set =new TreeSet<Object>(); set.add(new person("zs",3,12)); set.add(new person("ww",6,92)); set.add(new person("ls",1,17)); System.out.println(set.size()); for (Object object : set) { System.out.println(object); } } } class person{ private String name; private int level; private int age; public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } 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 person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "person [name=" + name + ", level=" + level + ", age=" + age + "]"; } public person(String name, int level, int age) { super(); this.name = name; this.level = level; this.age = age; } public person() { super(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + level; result = prime * result + ((name == null) ? 0 : name.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; person other = (person) obj; if (age != other.age) return false; if (level != other.level) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } 结果为:会出现数据转化异常 ![04ffb9708cbb441191e41d54829fae77.png][] #### 1.2.3如何让Treeset集合进行排序(自然排序.比较器排序 ) #### package com.xzs.set; import java.util.HashSet; import java.util.Iterator; import java.util.Objects; import java.util.Set; import java.util.TreeSet; public class demo1 { public static void main(String[] args) { Set s = new TreeSet(); s.add(new Student("zs",17)); s.add(new Student("ls",19)); s.add(new Student("ww",18)); System.out.println("目前集合容器中的元素:"+s); } } class Student implements Comparable{ private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } 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; } @Override public boolean equals(Object o) { System.out.println("调用了equals方法。。。"); if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && name.equals(student.name); } @Override public int hashCode() { System.out.println("调用了hashCode方法。。。"); return Objects.hash(name, age); } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public int compareTo(Object o) { Student student = (Student) o; return this.age - student.age; } } 结果为: ![43c9c843e94a49c9b72f62cc69667808.png][] 当然我们也可以用TreeSet构造器使用实现java.util.Comparator的匿名内部类 如 package com.xzs.set; import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.Objects; import java.util.Set; import java.util.TreeSet; public class demo1 { public static void main(String[] args) { TreeSet s=new TreeSet(new Comparator() { public int compare(Object o1, Object o2) { System.out.println("调用了compare方法。。。"); Student s1 = (Student) o1; Student s2 = (Student) o2; if (s1.getAge()-s2.getAge() == 0) return s1.getName().compareTo(s2.getName()); return s1.getAge()-s2.getAge(); } }); s.add(new Student("zs",16)); s.add(new Student("ls",17)); s.add(new Student("zs",17)); s.add(new Student("ww",18)); System.out.println("目前集合容器中的元素:"+s); } } class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } 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; } @Override public boolean equals(Object o) { System.out.println("调用了equals方法。。。"); if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && name.equals(student.name); } @Override public int hashCode() { System.out.println("调用了hashCode方法。。。"); return Objects.hash(name, age); } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } } 得到的结果为: ![81c13db714c740a69e0216e00d7cabc8.png][] [91161c8d7a004e4e9672a0d0143d2406.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/082b7de05024404da247d582ca654aec.png [6d3ecad2c5904966a301f6f45af626c6.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/d43bb56ad18747e2811f8117501393b7.png [3101d63e032b4de58af224da73d67b05.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/97d117a491a74b9cb4a953a6523caf70.png [d1842ec0e9ae4bacb9736618af0f0fd8.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/0fbbc0788a654e7c9df21fb76e3c0b74.png [3218cdf52bfc4d1997f31f7ab6fbb4d4.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/dd1e6e65c8014fbc9fcb9bd91afb4efb.png [04ffb9708cbb441191e41d54829fae77.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/891d88e996354059a3c8b02eaea03936.png [43c9c843e94a49c9b72f62cc69667808.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/15221b8def13412db8efbe3c19f9c94a.png [81c13db714c740a69e0216e00d7cabc8.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/6d45a413e1184b2985716fa1a8e9ebba.png
相关 集合set 35个问题测试你对Python集合的认识 如何通过掌握集合的基本原理来压制算法问题 图片来自Pexels的Andrea Piacquadio 在我追求掌握面试算法的过程中,我 ╰半夏微凉°/ 2024年04月06日 13:19/ 0 赞/ 77 阅读
相关 set集合 目录 1,set集合的特点: 1.1,set集合添加的数据不可重复 1.2 hashset无序 Treeset有序 1.2.1set集合的遍历方法 1.2.2Tree 我就是我/ 2024年03月16日 18:50/ 0 赞/ 53 阅读
相关 集合——Set Set接口 1.set接口的主要实现类有HashSet和 TreeSet 2.HashSet是基于哈希表实现的,数据是无序的, HashSet元素可以是null,但只 逃离我推掉我的手/ 2023年01月21日 05:30/ 0 赞/ 133 阅读
相关 Set集合 Scala `Set`是相同类型成对的不同元素的集合。换句话说,一个集合是不包含重复元素的集合。 集合有两种:不可变(`immutable`)和可变(`mutable`)。可变 短命女/ 2022年06月07日 11:16/ 0 赞/ 213 阅读
相关 Set集合 简介 > 无序,不可重复的集合 HashSet ①、HashSet:不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL; ②、对于 Has 柔光的暖阳◎/ 2022年05月28日 23:40/ 0 赞/ 198 阅读
相关 集合 set 集合 set :去重复,做操作 .add 是增加一个整体,如add('op')是加'op'.update 是增加一个一个的字符是加 o和p in ,no 超、凢脫俗/ 2022年02月23日 10:45/ 0 赞/ 275 阅读
相关 set集合 概述 Set接口继承Collection Set接口常用实现类 1. HashSet 实现了 Set 接口 “它不保证 set 的迭代顺序;特别是它不保证 Bertha 。/ 2022年01月22日 08:39/ 0 赞/ 284 阅读
相关 集合 SET 集合 SET 定义: 只有键没有值的字典,保留无序的元素,没有索引。集合的元素不可变。 创建: 1.set\_1 = set(seq) 2.set\_2 太过爱你忘了你带给我的痛/ 2021年12月05日 05:13/ 0 赞/ 365 阅读
相关 Set(集合) ''' 集合:可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复。 {} ''' set1 = set({1, ゝ一世哀愁。/ 2021年11月17日 22:38/ 0 赞/ 358 阅读
相关 集合Set 集合的一个关键的特点就是不能存放重复的元素,二分搜索树是一个非常好的实现集合的底层数据结构 1、二分搜索树实现集合: ![在这里插入图片描述][watermark_ty 川长思鸟来/ 2021年09月23日 22:14/ 0 赞/ 396 阅读
还没有评论,来说两句吧...