Java常见疑难问题-应用15


47. 不可变的引用类型
BigInteger total = BigInteger.ZERO;
total.add(new BigInteger(“1”));
total.add(new BigInteger(“10”));
System.out.println(total);//0
上面程序的结果为11吗?答案是0。

BigInteger实例是不可变的。String、BigDecimal以及包装类型:Integer、Long、Short、Byte、
Character、Boolean、Float和Double也是如此。对这些类型的操作将返回新的实例。

不可变类型更容易设计、实现与作用;它们出错的可能性更小,并且更加安全。

本程序修改如下:
BigInteger total = BigInteger.ZERO;
total=total.add(new BigInteger(“1”));
total=total.add(new BigInteger(“10”));
System.out.println(total);//11
48. 请同时重写equals()与hashCode()
class T {
private String str;

T(String str) {
this.str = str;
}

public boolean equals(Object obj) {
if(!(obj instanceof T)){
return false;
}
T t = (T)obj;
return t.equals(this.str);
}

public static void main(String[] args) {
Set set = new HashSet();
set.add(new T(“str”));
System.out.println(set.contains(new T(“str”)));//false
}
}
上面的程序不会打印true,而是false,为什么?

hashCode约定要求相等的对象要具有相同的散列码。

无论何时,只要你重写了equals方法,你就必须同时重写hashCode方法。

如果将自定的类型对象放入HashSet、HashMap、Hashtable、LinkedHashSet、LinkedHashMap
这此散列集合时,一定需要重写equals与hashCode方法,这样在放入进去之后还能查找出
来。如果放入其他非散列类型的集合时,其实只需要重写equals就可以了。

本程序解决办法重写hashCode()方法:
public int hashCode() {
return 37 * this.str.hashCode();
}
49. 日期设置
Calendar c = Calendar.getInstance();
c.set(2010, 12, 31);// 月是从0开始的,11其实表示12月
System.out.println(c.get(Calendar.YEAR) + ” ” + c.get(Calendar.MONTH));
c = Calendar.getInstance();
c.set(2010, 11, 31);
System.out.println(c.get(Calendar.YEAR) + ” ” + c.get(Calendar.MONTH));
本程序较简单,只需注意月是从0开始的就可以了,如果你设置月为12,则会自动转换为
下一年。
50. IdentityHashMap
class T {
private String str;

T(String str) {
this.str = str;
}

public int hashCode() {
return 37 * this.str.hashCode();
}

public boolean equals(Object obj) {
return this.str.equals(((T) obj).str);
}

public static void put(Map m) {
m.put(“str”, “1”);
/*
* 由于上面程序将 “str” 放入了字符串常量池,
* 所以str是同一个对象,不管是什么样类型的
* Map,即使使用IdentityHashMap都只放入一次
*/
m.put(“str”, “2”);
m.put(new T(“str”), “3”);
m.put(new T(“str”), “4”);
}

public static void main(String[] args) {
Map m = new HashMap();
put(m);
System.out.println(m.size());// 2
//IdentityHashMap比较时使用==替换equals()方法
m = new IdentityHashMap();
put(m);
System.out.println(m.size());// 3
}
}

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Java常见疑难问题-应用15
本文地址:https://www.zhiletu.com/archives-248.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微