谈笑有鸿儒,往来无白丁

在恰当的时间、地点以恰当的方式表达给恰当的人...  阅读的时候请注意分类,佛曰我日里面是谈笑文章,其他是各个分类的文章,积极的热情投入到写博的队伍中来,支持blogjava做大做强!向dudu站长致敬>> > 我的微博敬请收听

邢红瑞 发表于 2007-6-8 16:00:58

最近给替一个朋友出的几道java的面试题,主要是面试java高级工程师,报酬就是晚饭,已经沦落的卖艺的境地。
题目很简单
   Integer i1 = 100;
   Integer i2 = 100;
   Integer i3 = 1000;
   Integer i4 = 1000;
   System.out.println(i1==i2);
   System.out.println(i3==i4);
很遗憾,没有一个答对的,正确答案是
true
false
如果面试者写这样的写是错误的,就算通过。
这个的原因要从java5的Boxing和unboxing谈起,boxing就是封装基本类型的对象,unboxing就是转换对象到基本类型。
Integer, Long, Float, Double, Short, Character etc.都是这样的类型他们是immutable。
Boxing
在jdk1.4.2中,
必须是// Assigning primitive type to wrapper type
   Integer iWrapper = new Integer(10);
java5中
 // Assigning primitive type to wrapper type
   Integer iWrapper = 10;
unboxing
在jdk1.4.2中,
int iPrimitive = iWrapper.intValue();
java5中
int iPrimitive = iWrapper;
下面是基本类型作为对象存储的范围,
boolean values true and false
All byte values
short values between -128 and 127
int values between -128 and 127
char in the range \u0000 to \u007F
如果int values between -128 and 127,VM使用相同的对象,否则创建新的对象。
所以这段代码,大家不要奇怪
System.out.println(0L == 0);
System.out.println(((Long)0L).equals(0));
第二行代码是0不等于0
因为大家犯这样的一个错误
 static private final String LOCK = "LOCK";
  void testMethod() {
    synchronized(LOCK) {
    ...
    }
  }
应该用new,不要直接=,对于int,最好使用int a[0] ,因为array也是对象,不像Integer,a[0]的值可以改变。

posted on 2007-06-12 22:39 坏男孩 阅读(5986) 评论(3)  编辑  收藏 所属分类: java命令学习

FeedBack:
# re: java中的Boxing和unboxing
2007-06-21 10:32 | lang
过来灌水  回复  更多评论
  
# re: java中的Boxing和unboxing
2012-07-17 10:59 | ptzhuf
在java规范中有要求 String 不要用new 。。。。。。。
至于 Integer 和 Boolean 都用 valueOf  回复  更多评论
  
# re: java中的Boxing和unboxing
2014-09-26 11:16 | JackJCSN
@ptzhuf
这个地方的String 不new的话很可能会被死锁的,字符串常量是在JVM中共享的,如果别的程序也用了这个字符串常量去加锁的话很有可能会造成死锁。
感觉更安全和简便的方法是
static private final Object LOCK = new Object();
void testMethod() {
synchronized(LOCK) {
...
}
}  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: