阅读 14230 次
发表时间: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就没有规定何时产生新对象。代码就不应该依赖于这种没定义的行为。
Global site tag (gtag.js) - Google Analytics