Set集合方法之一 续 再谈HashSet
2017-03-17 11:46
337 查看
package andycpp; import java.util.HashSet; import java.util.Set; import org.junit.Test; /** * Collection接口: * List接口 * ArrayList(主要的实现类) * LinkedList(对于频繁的插入删除操作) * Vector(古老的实现类,线程安全,但效率要低于ArrayList) * Set接口 存储无序,不可重复的元素.Set中常用的方法都是Collection下定义的。 * HashSet(主要实现类) * LinkedHashSet * TreeSet * */ public class TestSet { /* * Set存储的元素是无序的,不可重复 * 1,无序性:无序不等于随机。真正的无序性,指的是元素在底层存储的位置是无序的,是根据哈希值来存的 * 2,不可重复性;即数学上集合元素的唯一性。 * 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法 * */ @Test public void testHashSet(){ Set set = new HashSet(); // set.add(123); // set.add(456); // set.add(new String("AA")); // set.add(new String("AA")); // set.add("BB"); // set.add(null); // Person p1 = new Person("GG",23); Person p2 = new Person("GG",23); System.out.println(p1.equals(p2));//输出false,很显然未重写equals方法和Hashcode方法,set特有的不同,所以两者不同 System.out.println(p1.hashCode()); System.out.println(p2.hashCode()); // set.add(p1); // set.add(p2); // System.out.println(set.size());//查看元素个数 // System.out.println(set);//查看set集合中元素,无序 } }
package andycpp; public class Person { private String name; private Integer age; //get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } //无参构造器 public Person() { super(); } //带参构造器 public Person(String name, Integer age) { super(); this.name = name; this.age = age; } //toString @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 == null) ? 0 : age.hashCode()); // 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 == null) { if (other.age != null) return false; } else if (!age.equals(other.age)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
输出
true
1144748369
340870931
package andycpp; import java.util.HashSet; import java.util.Set; import org.junit.Test; /** * Collection接口: * List接口 * ArrayList(主要的实现类) * LinkedList(对于频繁的插入删除操作) * Vector(古老的实现类,线程安全,但效率要低于ArrayList) * Set接口 存储无序,不可重复的元素.Set中常用的方法都是Collection下定义的。 * HashSet(主要实现类) * LinkedHashSet * TreeSet * */ public class TestSet { /* * Set存储的元素是无序的,不可重复 * 1,无序性:无序不等于随机。真正的无序性,指的是元素在底层存储的位置是无序的,是根据哈希值来存的 * 2,不可重复性;即数学上集合元素的唯一性。 * 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法 * */ @Test public void testHashSet(){ Set set = new HashSet(); // set.add(123); // set.add(456); // set.add(new String("AA")); // set.add(new String("AA")); // set.add("BB"); // set.add(null); // Person p1 = new Person("GG",23); Person p2 = new Person("GG",23); System.out.println(p1.equals(p2));//输出false,很显然未重写equals方法和Hashcode方法,set特有的不同,所以两者不同 System.out.println(p1.hashCode()); System.out.println(p2.hashCode()); // set.add(p1); // set.add(p2); // System.out.println(set.size());//查看元素个数 // System.out.println(set);//查看set集合中元素,无序 } }
输出
true
3946
3946
总结:
Set中的元素如何存储呢?使用了哈希算法:
当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置。若此位置之前没有对象
存储,则这个对象直接存储到此位置。若此位置已有对象存储,再通过equals()比较这两个对象是否相同,如果相同,后一个对象就不能再添加进来。
要求hashcode()方法和equals()方法一致。如果属性一样,哈希值也一样,反之都不一样。
万一返回false,则都存储,哈希值相同,存在一个位置上(两者属性不相同),不建议这么做。采用迭代方式来尽量避免,增强健壮性。利用Set集合自动生成hashcode方法
总之:Set集合 1,无序性 2,一致性
相关文章推荐
- Java基础 集合框架 共性方法 迭代器 ArrayList LinkedList Vector HashSet TreeSet
- 老紫竹JAVA提高教程(3)-认识Set集合之LinkedHashSet
- JAVA提高教程(3)-认识Set集合之LinkedHashSet
- 三种方法遍历Map集合 +遍历Set集合
- Nullable类型和HashSet<T>集合
- Java集合(set,map)的排序和HashCode方法详解
- 集合类的学习--HashSet vs TreeSet
- JAVA基础回顾1 遍历List Set 和Map集合的所有方法
- Java集合(set,map)的排序和HashCode方法详解
- 集合框架源码分析五之LinkedHashMap,LinkedHashSet
- iOS开发OC基础:OC集合NSSet、NSMutableSet以及NSCountedSet的基本方法的使用
- 集合 List ArrayList LinkedList HashMap HashSet Iterator 迭代器
- 黑马程序员--集合之HashSet/TreeSet原理
- hibernate映射关系之set集合的方法
- JAVA学习.JAVA集合类型Collection.Set.HashSet&TreeSet
- JAVA提高教程(2)-认识Set集合之HashSet
- My_Java之笔记(8)- 实现TreeSet集合的排序方法
- 遍历List和Set集合的常用方法
- java中List、Set、Map集合的遍历方法总结
- C# HashSet集合类型使用介绍