论坛首页 招聘求职论坛

我也有两个无聊变态的java题目

浏览 14235 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-17  
很多编程题都很BT。
比如写一长串不加括号的表达式考运算符的优先级。
按我说,要有问题也是写代码的人的问题。
0 请登录后投票
   发表时间:2008-03-17  
很多编程题都很BT。
比如写一长串不加括号的表达式考运算符的优先级。
按我说,要有问题也是写代码的人的问题。
0 请登录后投票
   发表时间:2008-03-17  
为什么100是true
200是false?
0 请登录后投票
   发表时间: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);
    }

0 请登录后投票
   发表时间: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之间的数都是事先实例化好的,所以相同的数是同一个引用。
0 请登录后投票
   发表时间:2008-03-18  
我靠,还别说,我在一个项目中真的就犯了第二个那样的错误,当时一直没有搞清楚为什么类没有初始化,今天开发这个帖子才明白过来。 晕!!!
0 请登录后投票
   发表时间:2008-03-18  
受教了!!!!!
0 请登录后投票
   发表时间:2008-03-18  
第一个题目其实考得很有道理的,不过其实可以换一个考法,比如解释一下Integer.valueOf(10)和new Integer(10)的差异。

这个题目在实际编程中是有实际价值的,new Integer(10)这种写法是会造成额外的不必要开销。

我当年就是看Integer源代码时才发现的这个特性,之后就基本都只用valueOf方法了。
0 请登录后投票
   发表时间:2008-03-18  
依我看阿,这些都是程序语言设计实现时候的缺陷和陷阱!

第一个问题还属于设计不够简洁优雅(OO不纯粹),
第二个问题就是典型的缺陷了(同类情况下行为的不一致)!

现在看java似乎也在步C++的后尘(随语言的发展,语法陷阱也出名的多)!
0 请登录后投票
   发表时间:2008-03-18  
pig345 写道
依我看阿,这些都是程序语言设计实现时候的缺陷和陷阱!

第一个问题还属于设计不够简洁优雅(OO不纯粹),
第二个问题就是典型的缺陷了(同类情况下行为的不一致)!

现在看java似乎也在步C++的后尘(随语言的发展,语法陷阱也出名的多)!

这不是什么陷阱。本来auto-boxing就没有规定何时产生新对象。代码就不应该依赖于这种没定义的行为。
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics