J2EE第八周
代码分析:
public
final
class
LineItemKey
implements
Serializable {
private
Integer customerOrder;
private
int
itemId;
public
LineItemKey() {}
public
LineItemKey(Integer order,
int
itemId) {
this
.setCustomerOrder(order);
this
.setItemId(itemId);
}
@Override
public
int
hashCode() {
return
((
this
.getCustomerOrder() ==
null
?
0
:
this
.getCustomerOrder().hashCode())
^ ((
int
)
this
.getItemId()));
}
@Override
public
boolean
equals(Object otherOb) {
if
(
this
== otherOb) {
return
true
;
}
if
(!(otherOb
instanceof
LineItemKey)) {
return
false
;
}
LineItemKey other = (LineItemKey) otherOb;
return
((
this
.getCustomerOrder() ==
null
? other.getCustomerOrder() ==
null
:
this
.getCustomerOrder()
.equals(other.getCustomerOrder()))
&& (
this
.getItemId() == other.getItemId()));
}
@Override
public
String toString() {
return
""
+ getCustomerOrder() +
"-"
+ getItemId();
}
/* Getters and setters */
}
其中hashCode的作用是:
当我们向一个集合中添加某个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置。这样处理,当我们存入大量元素时就可以大大减少调用equals()方法的次数,极大地提高了效率。
所以hashCode在上面扮演的角色为寻域(寻找某个对象在集合中区域位置)。hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的hash码,可以将hash码分组,每个分组对应着某个存储区域,根据一个对象的hash码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。这里由于customerOrder和itemId一起组成一个复合键来标示一个实体,所以如果customerOrder不存在则返回0,如果存在则返回customerOrder的hash值^itemId的数值。
equal的作用:
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。这里是比较两个对象是否相同,如果相同则返回true,如果不相同则返回false。