java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料

保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。

1.散列与散列码(hashcode)

hashcode基本就是把对象转换成了一串数字,常用的功能就是在集合容器里把这一串数字作为数组的下标,以实现快速插入到数组的功能,这样性能就能有效的提升。

当使用HashSet,HashMap这些集合容器存对象时,如果该对象不是java的8种基本类型中的,那就要重写hashcode和equals方法,不然后面会出现找不到该对象等等问题。

 

class Person {
	private String name;
	private int age;

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

public class Test1{
	public static void main(String[] args) {
	Map<Person,Integer> map = new HashMap<Person, Integer>();
	map.put(new Person("hhm", 12), 1);
	map.put(new Person("yyh", 18), 2);
	map.put(new Person("hyh", 20), 3);
	System.out.println(map.containsKey(new Person("hhm",12)));
}

 

 

输出:false

输出false是因为底层调用了默认hashcode和equals方法,而默认的方法无法判断是否相等。

 

重写hashcode和equals方法:

 

class Person {
	private String name;
	private int age;

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int hashCode() {
		return this.name.hashCode() ^ (this.age * 10);
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null)
			return false;

		Person p = (Person) obj;
		return this.getName().equals(p.getName()) &amp;&amp; this.getAge() == p.age;
	}

}
public class Test1{
    public static void main(String[] args) {
		Map<Person,Integer> map = new HashMap<Person, Integer>();
		map.put(new Person("hhm", 12), 1);
		map.put(new Person("yyh", 18), 2);
		map.put(new Person("hyh", 20), 3);
		System.out.println(map.containsKey(new Person("hhm",12)));
     }
}

 

输出:true

 

重写hashcode方法要求保证每个对象都是不同的hashcode码

重写equals方法的要求:
1.自反性:对于任何非空引用x,x.equals(x)应该返回true。
2.对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3.传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4.一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5.非空性:对于任意非空引用x,x.equals(null)应该返回false。

javawebjava编程思想

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。