HashSet 总结
HashSet 特点
无序:取出和存入的顺序不一致。
唯一:集合中不存在相同的元素
注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序
A:底层数据结构是哈希表(是一个元素为链表的数组)
B:哈希表底层依赖两个方法:hashCode()和equals()
执行顺序:
首先比较哈希值是否相同
相同:比较地址值或者继续执行equals()方法
返回true:元素重复了,不添加
返回false:元素不同,直接把元素添加到集合
不同:就直接把元素添加到集合
C:如何保证元素唯一性的呢?
由hashCode()和equals()保证的
D:开发的时候,代码非常的简单,自动生成即可。(alt+s选择生成hashCode和equals方法)
E:HashSet存储字符串并遍历
F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)
一般来说,需要重写类中的hashCode()和equals()方法,才能保证集合内元素的唯一性。
如果类没有重写这两个方法,默认使用Object()中相应的两个方法,则不能保证元素唯一性。
但是 String、Integer、Double 等类都已重写了hashCode() 和equals()方法,故可直接使用
如果集合内是自定义对象,则必须要重写hashCode()、equals()方法
例如:HashSet集合内为 Student学生类对象
---------------------------------------------------------------------------------------------
HashSet 特点
无序:取出和存入的顺序不一致。
唯一:集合中不存在相同的元素
注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序
A:底层数据结构是哈希表(是一个元素为链表的数组)
B:哈希表底层依赖两个方法:hashCode()和equals()
执行顺序:
首先比较哈希值是否相同
相同:比较地址值或者继续执行equals()方法
返回true:元素重复了,不添加
返回false:元素不同,直接把元素添加到集合
不同:就直接把元素添加到集合
C:如何保证元素唯一性的呢?
由hashCode()和equals()保证的
D:开发的时候,代码非常的简单,自动生成即可。(alt+s选择生成hashCode和equals方法)
E:HashSet存储字符串并遍历
F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)
一般来说,需要重写类中的hashCode()和equals()方法,才能保证集合内元素的唯一性。
如果类没有重写这两个方法,默认使用Object()中相应的两个方法,则不能保证元素唯一性。
但是 String、Integer、Double 等类都已重写了hashCode() 和equals()方法,故可直接使用
<span style="font-size:14px;">HashSet<String> hs=new HashSet<String> ();</span>
如果集合内是自定义对象,则必须要重写hashCode()、equals()方法
例如:HashSet集合内为 Student学生类对象
<span style="font-size:24px;"> public class Student{
private String name;
private int age;
...
************************hashCode()方法****************************************************
Tips 1:
* @Override
* public int hashCode(){
*
* return super.hashCode();
* }
如果不重写,默认调用Object的hashCode方法,每个对象得到的hashCode都不同,故最终造成添加进了重复的对象
Tips 2:
* @Override public int hashCode(){
* return 0;
* }
这样写,虽然能得到正确的结果(即能把重复的元素删去),但是所有的对象的hashCode都相同,
也就意味着所有的对象都要经过equals方法再比较,才能防止添加重复对象,复杂了很多
Tips 3:
* @Override
* public int hashCode() {
*
* int num = this.name.hashCode() +this.age * 11; // 11为任意给定的整数
* return num;
* }
这样写就能尽可能地使不同对象的hashCode不同
Tips 4:(自动生成的标准代码)
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
//( 31 + age ) *31 +name.hashCode();
return result;
}
**************************equals()方法****************************
Tips 1:
@overrides
public boolean equals(Object obj){
if(this==obj)
return true;
if(obj==null)
return false;
if(!(obj instanceof Student))
return false;
Student s=(Student)obj;
return (this.name.equals(s.getName())&&this.age==s.getAge());
}
Tips 2:(自动生成)
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) 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;
}
}</span>
---------------------------------------------------------------------------------------------