您的位置:首页 > 编程语言 > Java开发

java毕向东听课笔记24(集合框架-Set集合HashSet)

2016-04-23 22:31 447 查看
Set集合在之前讲过,里面的元素是无序的,这里的无序指的是存入和取出的顺序不一定一致,而且元素不可以重复。

Set集合的功能和Collection是一致的。

Set集合常见的子类有两个:HashSet,TreeSet。其中HashSet底层数据结构是哈希表。

import java.util.*;

class HashSetDemo{
public static void sop(Object obj){
System.out.println(obj);
}

public static void main(String[] args){
HashSet hs = new HashSet();

hs.add("java1");
hs.add("java1");
hs.add("java2");
hs.add("java3");
hs.add("java4");

Iterator it = hs.iterator();

while(it.hasNext())
sop(it.next());

}
}



可见,HashSet中存放元素是无序的(这里有点特殊,呈现了倒序),而且即使有重复的元素,集合中也只存放一个,这一点可以根据add方法的返回值类型是boolean来验证

import java.util.*;

class HashSetDemo{
public static void sop(Object obj){
System.out.println(obj);
}

public static void main(String[] args){
HashSet hs = new HashSet();

sop(hs.add("java1"));
sop(hs.add("java1"));
hs.add("java2");
hs.add("java3");
hs.add("java4");

Iterator it = hs.iterator();

while(it.hasNext())
sop(it.next());

}
}



可见第一次存放java1成功,第二次存放java1失败。

-----------------------------------------------------------------------------------

HashSet存放自定义元素

添加自定义元素,打印自定义元素,去除重复元素

import java.util.*;

public class HashSetTest{
public static void main(String[] args){
HashSet hs = new HashSet();

hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
hs.add(new Person("a2",12));
hs.add(new Person("a3",13));
hs.add(new Person("a4",14));

Iterator it = hs.iterator();

while(it.hasNext()){
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}

public static void sop(Object obj){
System.out.println(obj);
}
}

class Person{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
public boolean equals(Object obj){

if(!(obj instanceof Person))
return false;
Person p =(Person)obj;

return this.name.equals(p.name)&&this.age == p.age;//这里的equals是字符串中的equals
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}




这里发现,即使在Person类中复写了equals方法,还是出现了重复元素。这是因为对于HashSet,首先判断的是地址值,如果地址值都不一样,那么就不用调用equals方法。

现在要做的就是要在Person类中复写HashCode方法,建立自己的哈希值,根据判断条件建立(这里是根据姓名与年龄),因为每个字符串都有自己的哈希值,所以:

import java.util.*;

public class HashSetTest{
public static void main(String[] args){
HashSet hs = new HashSet();

hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
hs.add(new Person("a2",12));
hs.add(new Person("a3",13));
hs.add(new Person("a4",14));

Iterator it = hs.iterator();

while(it.hasNext()){
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}

public static void sop(Object obj){
System.out.println(obj);
}
}

class Person{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
public int hashCode(){
return name.hashCode()+age;
}
public boolean equals(Object obj){

if(!(obj instanceof Person))
return false;
Person p =(Person)obj;

return this.name.equals(p.name)&&this.age == p.age;//这里的equals是字符串中的equals
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}



事实上,因为相同字符串的哈希值也一样,所以实际上,本代码中第二次添加“a2”,12的时候,程序先比较了哈希值,发现哈希值相同,接着调用了被复写的equals方法,发现还是相同,才没有被写入到集合中去

结论:HashSet是如何保证元素的唯一性的呢?是通过元素的两个方法:hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,才会调用equals()。

--------------------------------------------------------------------

HashCode判断和删除

对于判断元素是否存在,以及删除等操作,以来的方法是元素的hashcode和equals方法,先判断前者
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: