首页 / JAVA / java数据结构--集合Set
java数据结构--集合Set
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java数据结构--集合Set,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4127字,纯文字阅读大概需要6分钟。
内容图文
![java数据结构--集合Set](/upload/InfoBanner/zyjiaocheng/1327/f67071e84cb24c58985a05d85efebdbd.jpg)
Set接口
Set接口用来表示:一个不包含“重复元素”的集合
Set接口中并没有定义特殊的方法,其方法多数都和Collection接口相同。
重复元素的理解:
通常理解:拥有相同成员变量的对象称为相同的对象,如果它们出现在同一个集合中的话,称这个集合拥有重复的元素
HashSet中对重复元素的理解:和通常意义上的理解不太一样!
两个元素(对象)的hashCode返回值相同,并且equals返回值为true时(或者地址相同时),才称这两个元素是相同的。
TreeSet中对重复元素的理解:元素的compareTo方法或者集合的比较器compare方法返回值为0则认为这两个元素是相同的元素。
1.Set接口的方法
可知Set接口并没有比父类Collection接口提供更多的新方法。
3.HashSet类
线程不安全,存取速度快
它的大多数方法都和Collection相同
它不保证元素的迭代顺序;也不保证该顺序恒久不变
当HashSet中的元素超过一定数量时,会发生元素的顺序重新分配。
3.1HashSet构造方法
public HashSet() { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } publicHashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } publicHashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
看来set底层是HashMap
3.4成员变量
3.5成员方法
3.6HashSet如何保证元素唯一?
考查add(Object obj)方法的实现过程:
- 先调用obj的hashCode方法,计算哈希值(槽位值slot:bucket)
- 根据哈希值确定存放的位置
- 若位置上没有元素,则这个元素就是第一个元素,直接添加
- 若此位置上已经有元素,说明还有元素的hashCode方法返回值与它相同,则调用它的equals方法与已经存在的元素进行比较
- 若返回值为true,表明两个元素是“相同”的元素,不能添加
- 若返回值为false,表明两个元素是“不同”的元素,新元素将以链表的形式添加到集合中
![技术分享图片](/upload/getfiles/default/2022/10/30/20221030042845659.jpg)
![技术分享图片](/upload/getfiles/default/2022/10/30/20221030042845837.jpg)
import java.util.HashSet; /* *自定义对象存储到HashSet中 * *int hashCode:元素被添加时被调用,用于确认元素的槽位值 *boolean equals:当发生碰撞时,调用被添加元素的equals方法和已经存在的元素进行比较, * true:不能添加 * false:可以添加,多个元素占用一个槽位值.以链表形式存在. * */ class Worker{ // static int i = 0; private String name; private int age; private String id; public String getName() { return name; } public void setName(String name) { this.name = name; } publicint getAge() { return age; } publicvoid setAge(int age) { this.age = age; } public String getId() { return id; } publicvoid setId(String id) { this.id = id; } public Worker(String name, int age, String id) { super(); this.name = name; this.age = age; this.id = id; } public Worker() { super(); // TODO Auto-generated constructor stub } @Override publicint hashCode() { finalint prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override publicboolean equals(Object obj) { if (this == obj) returntrue; if (obj == null) returnfalse; if (getClass() != obj.getClass()) returnfalse; Worker other = (Worker) obj; if (age != other.age) returnfalse; if (id == null) { if (other.id != null) returnfalse; } elseif (!id.equals(other.id)) returnfalse; if (name == null) { if (other.name != null) returnfalse; } elseif (!name.equals(other.name)) returnfalse; returntrue; } @Override public String toString() { return "Worker [name=" + name + ", age=" + age + ", id=" + id + "]"; } //如何重写hashCode?尽量让所有的成员变量都参与到运算中. //name age id/*@Override public int hashCode() { int code1 = name.hashCode(); int code2 = id.hashCode(); return code1 * 3 + age + code2; }*/ } publicclass HashSetDemo2 { publicstaticvoid main(String[] args) { HashSet<Worker> set = new HashSet<>(); Worker w1 = new Worker("tom1", 20, "001"); Worker w2 = new Worker("tom1", 20, "001"); Worker w3 = new Worker("tom2", 22, "003"); Worker w4 = new Worker("tom2", 22, "003"); Worker w5 = new Worker("tom3", 22, "003");// set.add(w1); set.add(w2); set.add(w3); set.add(w4); set.add(w5); for (Worker worker : set) { System.out.println(worker); } } }
HashSet注意事项:
1.想要往HashSet中添加的对象,需要在定义类时,重写hashCode和equals方法
2.由于HashSet使用的是散列算法,所以,轻易不要在迭代集合元素的时候改变集合中的元素
3.7并发修改异常
![技术分享图片](/upload/getfiles/default/2022/10/30/20221030042845659.jpg)
![技术分享图片](/upload/getfiles/default/2022/10/30/20221030042845837.jpg)
import java.util.HashSet; import java.util.Iterator; /* * 演示HashSet并发修改异常 */ public class HashSetDemo3 { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("hello"); set.add("hello2"); set.add("world"); set.add("world"); Iterator<String> it = set.iterator(); while(it.hasNext()){ String str = it.next(); if(str.equals("world")){ // set.remove("world");//ConcurrentModificationException it.remove(); } } for (String s : set) { System.out.println(s); } } }
补充技能:
3.8
原文:https://www.cnblogs.com/wqbin/p/11192280.html
内容总结
以上是互联网集市为您收集整理的java数据结构--集合Set全部内容,希望文章能够帮你解决java数据结构--集合Set所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。