java迷题_Java谜题——库谜题

1、Java中的不可变对象和可变对象

(1)不可变类:当你获得这个类的实例的引用之后,你不可以改变这个实例的内容。比如:String,BigInteger,BigDecimal,还有基本数据类型的封装类,这些都是不可变类。用实例来调用方法时,不会改变里面的变量的值。代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

importjava.math.BigInteger;public classBigProblem {public static voidmain(String[ ] args) {

BigInteger fiveThousand= new BigInteger("5000");

BigInteger fiftyThousand= new BigInteger("50000");

BigInteger fiveHundredThousand= new BigInteger("500000");

BigInteger total=BigInteger.ZERO;

total.add(fiveThousand);

total.add(fiftyThousand);

total.add(fiveHundredThousand);

System.out.println(total);

}

}

View Code

你可能认为会打印555000,但实际上打印的是0。就是因为你调用方法之后并不能改变这个对象的值。稍微修改下就可以:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

importjava.math.BigInteger;public classBigProblem {public static voidmain(String[] args) {

BigInteger fiveThousand= new BigInteger("5000");

BigInteger fiftyThousand= new BigInteger("50000");

BigInteger fiveHundredThousand= new BigInteger("500000");

BigInteger total=BigInteger.ZERO;

total=total.add(fiveThousand);

total=total.add(fiftyThousand);

total=total.add(fiveHundredThousand);

System.out.println(total);

}

}

View Code

本谜题的教训是:不要被误导,认为不可变类型是可变的。这是一个在刚入门的Java程序员中很常见的错误。公正地说,Java不可变类型的某些方法名促使我们走上了歧途。像add、subtract和negate之类的名字似乎是在暗示这些方法将修改它们所调用的实例。也许plus、minus和negation才是更好的名字。

(2)可变类:当你获得这个类的实例的引用之后,你可以改变这个实例的内容。

2、HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键

(1)hashCode()方法获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。

(2)equals(Object)方法

(3)接下来有两个个关于这两个方法的重要规范(我只是抽取了最重要的两个,其实不止两个):

(a)若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回 值。

(b)如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。

总之,当你覆写equals方法时,一定要记着覆写hashCode方法。

3、0的添加

千万不要在一个整型字面常量的前面加上一个0;这会使它变成一个八进制字面常量。有意识地使用八进制整型字面常量的情况相当少见,你应该对所有的这种特殊用法增加注释。

4、技巧性的问题

(1)Java5中添加了一套位操作方法。

(2)splite方法将字符串按照标志进行分割。

(3)相等的字符串常量也是相同的。

(4)Math.abs(int):“如果其参数等于Integer.MIN_VALUE,那么产生的结果与该参数相同,它是一个负数。”    Math.abs不能保证一定会返回非负的结果。如果它的参数是Integer.MIN_VALUE,或者对于long版本的实现传递的是Long.MIN_VALUE,那么它将返回它的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值