码迷,mamicode.com
首页 > 编程语言 > 详细

java集合 2

时间:2016-05-17 01:03:29      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:equals   java   

 这几天看了下 HashSet 和 HashMap,谈谈我的理解吧,如果有错误的话,请麻烦指出纠正,谢谢!


1.1 HashSet

    1.11 HashSet是实现Set接口的集合类,具备的特点是:

   (1)遍历元素时不保证元素返回的顺序

    (2)不允许重复元素,这里的“重复”元素指两个对象具有相同的散列码并且用equals()方法比较后返回true

    (3)允许包含空元素

    (4)底层是哈希表


    1.12 HashSet存储元素的原理

    以上拆自《Java高级编程》中对HashSet的描述。

    (在Set中添加对象时,使用该对象的散列码来选择放置对象的"桶"。不相等的对象可能有不同的散列码但仍放在同一个桶中,而判断为相等的两个对象总是放在同一个桶中。这点极为重要,因为判断Set中是否包含指定对象时,会使用该对象的散列码来判断该对象所在的桶,并遍历该桶中的对象同时使用equals()方法判断该桶是否已经包含该对象。换句话说,用hashcode()方法指定对象所在的对象子集合(桶),然后根据equals()检查该子集合并判断是否找到指定的对象。)


    根据我的理解,我用以下文字描述出来,希望我理解没有错误

    当往HashSet添加元素的时候,首先会调用元素的hashCode方法得到对象的哈希码值,通过值计算出该元素所在哈希表中的位置

    (1)如果算出的位置没有任何值,那么该元素可以添加到哈希表中

    (2)如果算出该位置已经存在其他元素,则调用equlas()方法与该位置上的元素比较,如果返回false,则添加进去。


    假设有这么几种情况,通过重写HashCode和equlas()试试看    

    1.hashCode相同且equals()返回为真

public class HashSetDemo {

	public static void main(String[] args) {
		HashSet<Person> set=new HashSet();
		Person p1=new Person(20, "小瀚", 20);
		Person p2=new Person(20, "小瀚", 20);
		set.add(p1);
		set.add(p2);
		System.out.println("p1 hashCode="+p1.hashCode()+"    "+"p2 hashCode="+p2.hashCode());
		System.out.println("Size="+set.size()+ "  Set="+set);
	}

}

class Person {
	private int id;
	private String name;
	private int age;

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

	@Override
	public int hashCode() {
		return id;
	}

	@Override
	public boolean equals(Object obj) {
		Person p=(Person) obj;
		return name.equals(p.name) && age==p.age;
	}
	@Override
	public String toString(){
		return "id="+id+" name="+name+" age="+age;
	}
}

输出结果为:
            p1 hashCode=20    p2 hashCode=20
            Size=1Set=[id=20 name=小瀚 age=20]


    2.hashCode相同但equals()返回假

		HashSet<Person> set=new HashSet();
		Person p1=new Person(20, "小瀚", 20);
		Person p2=new Person(20, "小露", 20);
		set.add(p1);
		set.add(p2);
		System.out.println("p1 hashCode="+p1.hashCode()+"    "+"p2 hashCode="+p2.hashCode());
		System.out.println("Size="+set.size()+ "  Set="+set);
		
输出结果为:	
        p1 hashCode=20    p2 hashCode=20
        Size=2  Set=[id=20 name=小露 age=20, id=20 name=小瀚 age=20]	

   由上面结果我们可知,当HashCode()相同的时候,会去调用equlas()方法来比较元素,从而判断是否将元素添加进去


1.2 HashMap

  Set是对象的集合,而Map不但是对象的集合,并且每个对象都有一个对应值。也就是说,映射(Map)表示一组键值对,键就是集合中元素。其中HashMap是实现Map接口的一个类,具备的特点是:

    (1)

java集合 2

标签:equals   java   

原文地址:http://11591236.blog.51cto.com/11581236/1774091

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!