目录
1、Set接口的一个实现类,它不保证Set的迭代顺序,特别是它不保证该顺序恒久不变。
2、唯一性:底层依赖于hashCode()和equals()方法。
一、 Set<object>接口
1、Set接口特点:无序的,唯一的
- 存储顺序和取出顺序不一致,有自己的存储顺序
- 不可重复
- List接口:有序的,可重复
程序代码:
package hashset.cn;
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> set = new HashSet<String>();
set.add("hello");
set.add("world");
set.add("java");
set.add("hello");
set.add("world");
set.add("java");
for(String s: set) {
System.out.println(s);
}
}
}
输出结果:
二、HashSet<object>类
1、Set接口的一个实现类,它不保证Set的迭代顺序,特别是它不保证该顺序恒久不变。
2、唯一性:底层依赖于hashCode()和equals()方法。
程序代码:
package hashset.cn;
import java.util.HashSet;
public class HashSetOnlyDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<Student> hs = new HashSet<Student>();
Student stu1 = new Student("彰显",22);
Student stu2 = new Student("魔女",23);
Student stu3 = new Student("绣逗",19);
Student stu4 = new Student("彰显",22);
Student stu5 = new Student("张翰",22);
Student stu6 = new Student("张哈",22);
hs.add(stu1);
hs.add(stu2);
hs.add(stu3);
hs.add(stu4);
hs.add(stu5);
hs.add(stu6);
for(Student s: hs) {
System.out.println(s.getName()+":"+s.getAge());
}
}
}
输出结果:
程序结果中有重复的元素,并没有保证唯一性,这是因为Student类中没有重写hashCode()和equals()方法,上面Set中第一个程序用的是String类,String重写了hashCode()和equals()方法,所以保证了唯一性。hashCode()如果没有重写,则该类的两个对象无论如何都不会相等
程序代码:
package hashset.cn;
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int 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) {
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;
}
}
输出结果:
关于hashCode()和equals():
hashCode()方法的作用是获取哈希码(散列码)
两者的规定:
- 如果两对象相等,则hashCode()一定相等。
- 两对象相等,则调用equals()都返回true。
- 两对象有相同的hashCode值,他们也不一定相等(物理内存上不同,逻辑值上相同,杂凑算法中容易出现碰撞)。
- equals()被覆盖,则hashCode()也必须被覆盖。
- hashCode()的默认行为是对堆上的对象产生独特值,hashCode()如果没有重写,则该类的两个对象无论如何都不会相等(即便是指向相同的数据)