HashSet
- 简单理解Hashset
- 方法摘要
- 初始化和遍历方法
- 存取实例
- HasSet原理:
- Hash表的数据结构
- HashSet去除重复自定义对象
- 面试题
简单理解Hashset
HashSet是抽象类AbstractSet的子类,实现了Set接口,由父类特性可知,HashSet存取元素的顺序不一致,按HashCode来存取的;和List不同,HashSet无索引,不可以存储重复元素。
方法摘要
初始化和遍历方法
1.初始化
HashSet< E> hashset =new HashSet<>();
2.迭代器iterator遍历
Iterator it = hashset.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
3.使用增强for循环遍历
for(元素类型 变量名 :集合名){
}
for (String string : hashset) {
System.out.println(string);
}
存取实例
1.当存取元素为基本数据类型时
public static void Hashparagram(){
HashSet <Integer> hs = new HashSet<>();
hs.add(11);
hs.add(22); //自动装箱
hs.add(11);
hs.add(23);
hs.add(23);
hs.add(11);
for (Integer integer : hs) { //增强for循环
System.out.println(integer);
}
}
结果: 22 11 23
2.当存取元素为自定义对象时,要想使元素保持唯一,需要在自定义对象类中重写HashCode()和equals()方法
Perosn类中
public class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(){
}
@Override
public int hashCode() { //重写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) { //重写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;
}
@Override
public String toString() { //重写toString
return "姓名 " + name + ", 年龄 " + age ;
}
import java.util.HashSet;
import java.util.Random;
public class demoSet {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<Person> set =new HashSet<>();
set.add(new Person("张三",23));
set.add(new Person("李四",24));
set.add(new Person("张三",23));
set.add(new Person("张三",23));
set.add(new Person("李四",24));
set.add(new Person("张三",23));
set.add(new Person("李四",24));
for (Person person : set) { //增强for循环遍历
System.out.println(person);
}
//
}
结果:
HasSet原理:
当HashSet集合对象调用add()方法存储对象的时候,先调用对象的HashCod()方法的到一个哈希码,然后在集合中查找是否有哈希码相同的对象;
若无哈希码相同的对象,就直接存入集合。
若有哈希码相同的对象,调用者调用equals与其相比较,比较结果为false就存入集合中;
Hash表的数据结构
HashSet去除重复自定义对象
- 自定义类中必须重写hashCode()和equals();
- hashCode() : 属性相同,返回值相同;
- equals():属性相同返回true,不存
属性不同false,存;
**
面试题
1.如果两个对象的HashCode相同,两个对象的equals()一定相同吗?
答:不一定 ,HashCode 是由Hash算法决定的,不同的对象HashCode可能相同,
但是equals()不一定相同,如果两个对象的HashCode相同,就比较equals(),若equals()也相 同,则这两个对象一定相同。无法添加到HashSet集合中。
- 如果两个对象的equals()方法相同,这两个对象的HashCode一定相同吗?
答:一定相同的
**