java编程思想笔记(十) 集合容器深入
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()) && 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。
因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。
后续会有更多的精彩的内容分享给大家。
支付宝扫一扫
微信扫一扫
