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

/*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>
*/




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值