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

java:ArrayList集合与HashSet集合元素重复性探讨

2015-07-22 23:25 459 查看
/*1. 关于hashCode*/
class Student
{
private String name;
private int age;

public Student(String name, int age)
{
this.name = name;
this.age = age;
}
}

//对象的HashCode值
class TestHashCode
{
public static void main(String[] args)
{
String str1 = "hello";
String str2 = "hi";
String str3 = "hello";

Student s1 = new Student("lisi", 45);
Student s2 = new Student("zhangsan", 40);
Student s3 = new Student("lisi", 45);

//打印hashCode值                      打印结果
System.out.println(str1.hashCode());  //99162322
System.out.println(str2.hashCode());  //3329
System.out.println(str3.hashCode());  //99162322
System.out.println(s1.hashCode());    //27134973
System.out.println(s2.hashCode());    //1284693
System.out.println(s3.hashCode());    //31168322

}
}

/*
上述程序验证了:
1.(hashCode)哈希值与对象的地址有关;
2.不同的对象,其hashCode值不一样;
3.内容相同的String对象,其hashCode()返回值一样。
*/

/*2. 当元素没有覆盖hashCode() 和 equals()方法*/
import java.util.*;

//定义元素,没有覆盖hashcode() 和 equals()方法
class Student
{
private String name;
private int age;

public Student(String name, int age)
{
this.name = name;
this.age = age;
}

public String toString()
{
return name +":" +age;
}

}

class TestAgain
{
public static void main(String[] args)
{
//创建ArrayList集合
ArrayList<Student> a = new ArrayList<Student>();

//向集合中添加元素
a.add(new Student("lisi1", 10));
a.add(new Student("lisi2", 20));
a.add(new Student("lisi5", 50));
a.add(new Student("lisi4", 40));
a.add(new Student("lisi2", 20));

System.out.println(a);
//打印结果是:[lisi1:10, lisi2:20, lisi5:50, lisi4:40, lisi2:20]

//创建HashSet集合
HashSet<Student> hs = new HashSet<Student>();

//向集合中添加元素
hs.add(new Student("lisi1", 10));
hs.add(new Student("lisi2", 20));
hs.add(new Student("lisi5", 50));
hs.add(new Student("lisi4", 40));
hs.add(new Student("lisi2", 20));

System.out.println(hs);
//打印结果是:[lisi2:20, lisi1:10, lisi2:20, lisi5:50, lisi4:40]

}
}
/*
元素对象当没有覆写hashCode()和equals()方法时,
ArrayList 和 HashSet中的元素都可以重复。
*/

/*3. 元素只覆盖了hashCode()方法*/
import java.util.*;

//定义元素,只覆盖覆盖hashCode()方法
class Student
{
private String name;
private int age;

public Student(String name, int age)
{
this.name = name;
this.age = age;
}

//覆写hashCode()
public int hashCode()
{
return name.hashCode() + age;
}

public String toString()
{
return name +":" +age;
}

}

class TestAgain1
{
public static void main(String[] args)
{
//创建ArrayList集合
ArrayList<Student> a = new ArrayList<Student>();

//向集合中添加元素
a.add(new Student("lisi1", 10));
a.add(new Student("lisi2", 20));
a.add(new Student("lisi5", 50));
a.add(new Student("lisi4", 40));
a.add(new Student("lisi2", 20));

System.out.println(a);
//打印结果是:[lisi1:10, lisi2:20, lisi5:50, lisi4:40, lisi2:20]

//创建HashSet集合
HashSet<Student> hs = new HashSet<Student>();

//向集合中添加元素
hs.add(new Student("lisi1", 10));
hs.add(new Student("lisi2", 20));
hs.add(new Student("lisi5", 50));
hs.add(new Student("lisi4", 40));
hs.add(new Student("lisi2", 20));

System.out.println(hs);
//打印结果是:[lisi2:20, lisi2:20, lisi5:50, lisi4:40, lisi1:10]
}
}

/*
元素对象只覆写hashCode()方法时,
ArrayList 和 HashSet中的元素都可以重复。
*/

/*4. 覆写hashCode()和equals()方法*/
import java.util.*;

//集合元素,覆写HashCode()和equals()方法
class Student
{
private String name;
private int age;

public Student(String name, int age)
{
this.name = name;
this.age = age;
}

//覆写hashCode()方法
public int hashCode()
{
return name.hashCode() + age;
}

//覆写equals()方法
public boolean equals(Object obj)
{
Student s = (Student)obj;
if(this.name == s.name && this.age == s.age)
return true;
else
return false;
}

public String toString()
{
return name +":" +age;
}

}

class TestAgain3
{
public static void main(String[] args)
{
//创建ArrayList集合
ArrayList<Student> a = new ArrayList<Student>();

//向集合中添加元素
a.add(new Student("lisi1", 10));
a.add(new Student("lisi2", 20));
a.add(new Student("lisi5", 50));
a.add(new Student("lisi4", 40));
a.add(new Student("lisi2", 20));

System.out.println(a);
//打印结果是:[lisi1:10, lisi2:20, lisi5:50, lisi4:40, lisi2:20]

//创建HashSet集合
HashSet<Student> hs = new HashSet<Student>();

//向集合中添加元素
hs.add(new Student("lisi1", 10));
hs.add(new Student("lisi2", 20));
hs.add(new Student("lisi5", 50));
hs.add(new Student("lisi4", 40));
hs.add(new Student("lisi2", 20));

System.out.println(hs);
//打印结果是:[lisi2:20, lisi5:50, lisi4:40, lisi1:10]
}
}

/*
元素对象覆写hashCode()和equals()方法时,
ArrayList中的元素可以重复,
而,HashSet中的元素不可以重复了。

总结:
1.ArrayList集合中的元素,无论是否覆写了hashCode()和equals()方法,
都可以重复存在。
2.HashSet集合中的元素,只有同时覆写了hashCode()和equals()方法,
才能保证元素不重复。
3.HashSet判断集合元素的唯一性,首先根据元素的hashCode值,然后在根据equals方法,
如果不覆盖equals方法,会调用Object类的equals方法,是比较两个对象的地址值。
</pre><pre name="code" class="java"><span style="color: rgb(85, 85, 85); font-family: Arial; font-size: 14px; line-height: 26px;"><span style="color: rgb(255, 0, 0);"><span style="white-space:pre">	</span>Java系统首先调用对象的hashCode()方法获得该对象的哈希码表,然后根据哈希吗找到相应的存储区域,最后取得该存储区域内的每个元素与该对象进行equals方法比较</span></span>
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: