1. HashSet
collection
下面有:
List
:元素的有序的,元素可以重复,因为该集合体系有索引
______ArrayList
:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删速度慢
______LinkedList
:底层的数据结构使用的是链表结构。特点:查询速度慢,但是增删速度快
______Vector
:底层的数据结构使用的是数组结构,线程同步,被ArrayList替代了
Set
: 元素是无序,元素不可以重复
______HashSet
:底层的数据结构使用的是哈希表。保证元素的唯一性的原理:判断元素的HashCode值是否相同。如果相同,还会继续判断元素的equals方式,是否为true
______TreeSet
Set集合的功能和Collection一样
package collectionDemo;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
sop(hashSet.add("shh01")); // 返回true,说明存进去了
sop(hashSet.add("shh01")); // 返回false,说明没有存进去,验证了Set集合的不可重复性
hashSet.add("shh02");
hashSet.add("shh03");
hashSet.add("shh04");
Iterator it = hashSet.iterator();
while (it.hasNext()){
sop(it.next());
}
/*
输出:
shh02
shh01
shh04
shh03
验证了Set集合的无序性。
*/
}
public static void sop(Object obj){
System.out.println(obj);
}
}
2. HashSet存储自定义对象
往HashSet集合中存入自定义对象。
姓名和年龄相同为同一个人,重复元素。
总结:
HashSet是如何保证元素的唯一性的呢?
- 通过元素的两个方法,hashCode和equals来完成
- 如果元素的hashCode值相同,才会判断equals是否为true
- 如果元素的hashCode值不同,不会调用equals
package collectionDemo;
import java.util.HashSet;
import java.util.Iterator;
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public boolean equals(Object obj){
if(obj instanceof Person){
Person p = (Person)obj;
System.out.println("调用equals......"+this.name+"..."+p.getName());
return this.name.equals(p.getName()) && this.age==p.getAge();
}
return false;
}
//定义Person自己的hash值
public int hashCode(){
System.out.println("计算哈希值......"+this.name);
return 60; //设置所有的元素的hashCode值都是一样的,这样都会使用equals方法
/*
return this.name.hashCode()+age*39;
这样设置hash值,就只有名字和年龄一样的,hash值才相同,才会调用equals,输出结果如下:
计算哈希值......shh1
计算哈希值......shh2
计算哈希值......shh3
计算哈希值......shh4
计算哈希值......shh4
调用equals......shh4...shh4
shh4::14
shh3::13
shh2::12
shh1::11
*/
}
}
public class HashSetTest {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(new Person("shh1",11));
hashSet.add(new Person("shh2",12));
hashSet.add(new Person("shh3",13));
hashSet.add(new Person("shh4",14));
hashSet.add(new Person("shh4",14));
Iterator it = hashSet.iterator();
while (it.hasNext()){
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
输出:
计算哈希值......shh1
计算哈希值......shh2
调用equals......shh2...shh1
计算哈希值......shh3
调用equals......shh3...shh1
调用equals......shh3...shh2
计算哈希值......shh4
调用equals......shh4...shh1
调用equals......shh4...shh2
调用equals......shh4...shh3
计算哈希值......shh4
调用equals......shh4...shh1
调用equals......shh4...shh2
调用equals......shh4...shh3
调用equals......shh4...shh4
shh1::11
shh2::12
shh3::13
shh4::14
3. HashSet判断和删除的依据
注意:
对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode
和equals
方法。
package collectionDemo;
import java.util.HashSet;
import java.util.Iterator;
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public boolean equals(Object obj){
if(obj instanceof Person){
Person p = (Person)obj;
System.out.println("调用equals......"+this.name+"..."+p.getName());
return this.name.equals(p.getName()) && this.age==p.getAge();
}
return false;
}
//定义Person自己的hash值
public int hashCode(){
System.out.println("计算哈希值......"+this.name);
//return 60;
return this.name.hashCode()+this.age*39;
}
}
public class HashSetTest {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(new Person("shh1",11));
hashSet.add(new Person("shh2",12));
hashSet.add(new Person("shh3",13));
hashSet.add(new Person("shh4",14));
sop("shh1 is contains? "+hashSet.contains(new Person("shh1",11)));
sop("删除shh3:"+hashSet.remove(new Person("shh3",13)));
Iterator it = hashSet.iterator();
while (it.hasNext()){
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
输出:
计算哈希值......shh1
计算哈希值......shh2
计算哈希值......shh3
计算哈希值......shh4
计算哈希值......shh1
调用equals......shh1...shh1
shh1 is contains? true
计算哈希值......shh3
调用equals......shh3...shh3
删除shh3:true
shh2::12
shh4::14
shh1::11