java基金会成立Set
2023-09-27 14:27:03 时间
1、设置
当向集合Set中添加对象时。首先集合计算要添加对象的hashcode,依据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set觉得该对象在集合中不存在,直接添加进去。假设在该位置有一个对象存在。接着将准备添加到集合中的的对象与该位置上的对象进行equals比較。若返回false,在进行一次散列。将该对象放到散列后计算出的新地址。若返回true,不会再将该对象添加到集合中
2、当重写equals方法时,必需要重写hashcode方法
假设一个类的两个对象。使用equals方法比較时。结果为true,那么这两个对象必须具有同样的hashcode
3、请參考下面代码执行。查看输出结果来理解以上说法
test1和test2比較的是String,因为String重写了equals方法和hashcode方法。所以,String = “abc"。和 string = new String("abc")比較equals方法时候是返回true,因此test1和test2输出结果一致。Person类没有重写equals方法。而Person1重写了,所以test3和test4输出结果不一致。
/** * author Ding Chengyun * 2014-2-23 */ package test; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * @author Ding Chengyun * 2014-2-23 */ public class SetTest { /** * @param args */ public static void main(String[] args) { test4(); } public static void test1() { Set<String> s1 = new HashSet<String>(); s1.add("abc"); s1.add("xyz"); s1.add("abc"); for (Iterator<String> iter = s1.iterator(); iter.hasNext();) { System.out.println(iter.next()); } // 输出: // abc // xyz } public static void test2() { Set<String> s1 = new HashSet<String>(); s1.add(new String("abc")); s1.add(new String("xyz")); s1.add(new String("abc")); for (Iterator<String> iter = s1.iterator(); iter.hasNext();) { System.out.println(iter.next()); } // 输出: // abc // xyz } public static void test3() { Set<Person> s = new HashSet<Person>(); s.add(new Person("zhangsan")); s.add(new Person("lisi")); s.add(new Person("zhangsan")); for (Iterator<Person> iter = s.iterator(); iter.hasNext();) { System.out.println(iter.next().getName()); } // 输出: // zhangsan // zhangsan // lisi } public static void test4() { Set<Person1> s = new HashSet<Person1>(); s.add(new Person1("zhangsan")); s.add(new Person1("lisi")); s.add(new Person1("zhangsan")); for (Iterator<Person1> iter = s.iterator(); iter.hasNext();) { System.out.println(iter.next().getName()); } // 输出: // lisi // zhangsan } } class Person { String name; public Person(String name) { this.name = name; } public String getName() { return name; } } class Person1 { String name; public Person1(String name) { this.name = name; } public String getName() { return name; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof Person1) { Person1 p = (Person1)obj; if (this.name.equals(p.getName())) { return true; } } return false; } public int hashCode() { return name.hashCode(); } }
版权声明:本文博客原创文章。博客,未经同意,不得转载。
相关文章
- Java中集合List,Map和Set的差别
- 在java 8 stream表达式中实现if/else逻辑
- java 获取某路径下的子文件/子路径
- Java 集合List、Set、HashMap操作一(Array转List、Set排序、HashMap遍历、Set遍历、List遍历、HashMap大小长度、List打乱顺序)
- java基础—统计一个字符串中各个字符出现的次数
- 【Java】Collection集合和Map集合(List、Set、HashMap、TreeMap)
- Java Script 内置对象(四) --------- String 对象
- Java 后端自学之路
- 52 类 110 个常用 Java 组件和框架整理
- Java工程师必备
- 第二十四节:Java语言基础-讲解数组的综合应用
- Java NIO 与 IO
- Java基础语法:4. Java全局变量与局部变量
- java实现MD5加密
- Java中集合Set的用法
- Java中Set集合的使用
- java Set接口(元素不可以重复)
- elasticsearch之JAVA环境变量报错:could not find java; set JAVA_HOME or ensure java is in PATH
- java中 set,list,array(集合与数组)相互转换
- java中list、set和map 的区别(转)
- Java_慎用方法级别的synchronized关键字
- Java中List Set Map 总结
- java(2014版)连接数据库的工具类
- Java中的set集合如何理解(三)——精简
- Java -- 容器使用 Set, List, Map, Queue
- 【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)
- Implementing the skip list data structure in java --reference