28_Set集合
1.概念
2.接口方法
3.Set接口特点
4.HashSet
5.LinkedHashSet
6.什么原因导致了Set集合不重复
package com.bfd; import java.util.HashSet; public class Demo01 { public static void main(String[] args) { /*1.什么原因导致Set集合元素不重复 * 1.实现的数据结构导致的-hashtable * 通过 集合元素的hashCode方法 分配在那条链表或者红黑树上 * 通过 集合元素的equals方法,判断链表或集合中是否已存在此元素 * 2.Object的hashCode方法为:public native int hashCode(); 对象内存地址的h整数值 * 3.Object的equals方法为:return (this == obj); * 4.String的hashCode * * */ //"哈希冲突"问题 System.out.println("重地".hashCode()); System.out.println("通话".hashCode()); //String的哈希算法 char[] val = new String("重地").toCharArray(); int h = 0; for (int i = 0; i < "重地".length(); i++) { h = 31 * h + val[i]; } System.out.println(h); //31*37325+22320 System.out.println('重' + 0);//37325 System.out.println('地' + 0);//22320 System.out.println(31 * 37325 + 22320); //36890+31*35805+35805 System.out.println('通' + 0);//36890 System.out.println('话' + 0);//35805 System.out.println(31 * 36890 + 35805); System.out.println("=====测试hash冲突=========="); //模拟哈希冲突 HashSet set = new HashSet<>(); System.out.println(set.add(new Person("张飞",18))); System.out.println(set.add(new Person("关羽",22))); System.out.println(set.size()); } } class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } /* @Override public int hashCode() { return 1; } @Override public boolean equals(Object obj) { return true; }*/ }
7.什么原因导致了hashset无序和linkedhashset有序
package com.bfd; import org.apache.commons.lang3.builder.HashCodeBuilder; import java.util.HashSet; import java.util.Iterator; public class Demo01 { public static void main(String[] args) { /*1.什么原因导致hashset无序和linkedhashset有序呢? * 存放的顺序和hashcode的value有关,Integer的value是它的数值 * value/16就是它存放第几条链表的位置*/ HashSet hashset = new HashSet(); hashset.add(5); hashset.add(4); hashset.add(9); hashset.add(1); hashset.add(16); for (Object i : hashset ) { System.out.println(i); } //存放HashCode的值相同,就会存放在一条链表或者红黑树上 hashset.clear(); hashset.add(new Person("x", 1)); hashset.add(new Person("y", 2)); hashset.add(new Person("z", 4)); hashset.add(new Person("m", 3)); Iterator iterator = hashset.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } } } class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { return 1; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界