发表时间:2008-03-17
很多编程题都很BT。
比如写一长串不加括号的表达式考运算符的优先级。 按我说,要有问题也是写代码的人的问题。 |
|
发表时间:2008-03-17
很多编程题都很BT。
比如写一长串不加括号的表达式考运算符的优先级。 按我说,要有问题也是写代码的人的问题。 |
|
发表时间:2008-03-17
为什么100是true
200是false? |
|
发表时间:2008-03-17
看下 Integer的源代码就知道了
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); } |
|
发表时间:2008-03-18
franktony 写道 foy 写道 受教了,但是第二个题还知道怎么回事
第一个题就很疑惑了,太怪异了 第一个题目是因为: 有些primitive值会被unbox成常量、不可变的wrapper对象,-127到127之间的值是不可变的wrapper类型,虚拟机对i和j使用了同样的对象实例及内存地址。 二是因为: static final的属性,编译器会解析成对常量的本地copy,该常量存在于引用者的常量池或者字节码流中,或者二者都有(参见深入java虚拟机),使用不会引起类的初始化 说得很对,但是是1.5版本以后的JDK的Integer类才做了缓存,题目也特别提到了是1.5版本以后,-128到127之间的数都是事先实例化好的,所以相同的数是同一个引用。 |
|
发表时间:2008-03-18
我靠,还别说,我在一个项目中真的就犯了第二个那样的错误,当时一直没有搞清楚为什么类没有初始化,今天开发这个帖子才明白过来。 晕!!!
|
|
发表时间:2008-03-18
受教了!!!!!
|
|
发表时间:2008-03-18
第一个题目其实考得很有道理的,不过其实可以换一个考法,比如解释一下Integer.valueOf(10)和new Integer(10)的差异。
这个题目在实际编程中是有实际价值的,new Integer(10)这种写法是会造成额外的不必要开销。 我当年就是看Integer源代码时才发现的这个特性,之后就基本都只用valueOf方法了。 |
|
发表时间:2008-03-18
依我看阿,这些都是程序语言设计实现时候的缺陷和陷阱!
第一个问题还属于设计不够简洁优雅(OO不纯粹), 第二个问题就是典型的缺陷了(同类情况下行为的不一致)! 现在看java似乎也在步C++的后尘(随语言的发展,语法陷阱也出名的多)! |
|
发表时间:2008-03-18
pig345 写道 依我看阿,这些都是程序语言设计实现时候的缺陷和陷阱!
第一个问题还属于设计不够简洁优雅(OO不纯粹), 第二个问题就是典型的缺陷了(同类情况下行为的不一致)! 现在看java似乎也在步C++的后尘(随语言的发展,语法陷阱也出名的多)! 这不是什么陷阱。本来auto-boxing就没有规定何时产生新对象。代码就不应该依赖于这种没定义的行为。 |