关于java处理基本对象类型的问题:Long a = 2l;
Long b = 2l;
//结果为ture
System.out.println(a == b);
Long c = 128l;
Long d = 128l;
//结果为false
System.out.println(c == d);
//我觉得这里很容易让人产生错误,如果不去看源代码,还真不知道原因。
//始终觉得,前者应当返回假才好些
//实际上-128->127在java里定义了静态数据,所以这个值之内用自动封箱的给值方法,总是相等。不知道大家对java这样做,有没有什么其它看法。
Long b = 2l;
//结果为ture
System.out.println(a == b);
Long c = 128l;
Long d = 128l;
//结果为false
System.out.println(c == d);
//我觉得这里很容易让人产生错误,如果不去看源代码,还真不知道原因。
//始终觉得,前者应当返回假才好些
//实际上-128->127在java里定义了静态数据,所以这个值之内用自动封箱的给值方法,总是相等。不知道大家对java这样做,有没有什么其它看法。
解决方案 »
- 《Java编程思想》适合大三学生看吗?
- java对文件加密和解密的原理是什么?
- 我想把一个字符串中有英文输入的''改为中文输入法的‘’,如何修改,请大家帮帮忙!
- java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]用户
- 请问:关于线程的
- 为什么我的电脑装jdk1.5时电脑未响应,跟硬件配置有关系吗?cpu:塞扬333 内存:96M.请大侠指教,谢谢.
- 为什么JList里的label要设成透明的?
- 请问,如何让jlist和jcombobox一样,当鼠标移到选项上面时就已经选择到了那个选项上面!!!!
- 可不可以介绍一下?
- 请问,能设置Choice的长度,和宽度吗?
- 关于线程数量与线程池数量的关系
- 给大家推荐一个好东西Java Tutorial
==的比较更多用在null判断里喵~``
public class Test{ public static void main(String[] args){
Long a = 2l;
Long b = 2l;
System.out.println(a.equals(b)); //结果为ture
Long c = 128l;
Long d = 128l;
System.out.println(c.equals(d)); //结果为ture
}
}换成equals 就多是true了!
问题比较引用时,结果不一样,这就让人容易误解。实际都为false是比较容易理解的。
这已失去对象的含义了,是常量了.
long是原始数据类型,没有属性方法,只能进行数学运算.
Long是long相对应的引用数据类型,它有方法和属性.一个没方法属性,一个有方法属性,这就是它们的区别.
Long a = 2l;
Long b = 2l;
//因为2l在-128->127之间,所以他们的引用和值总是相等.无论a==b还是a.equals(b),返回值都应该是true.Long c = 128l;
Long d = 128l;
//因为128l>127,所以引用不相等,既c==d为false.但是值是相等的,既c.equals(d)为true。
public class Test{ public static void main(String[] args){
Long a = 2l;
Long b = 2l;
System.out.println(a==b); //结果为ture
System.out.println(a.equals(b)); //结果为ture
Long c = 128l;
Long d = 128l;
System.out.println(c==d); //结果为false
System.out.println(c.equals(d)); //结果为ture
}
}
真正在体系结构上改动太少了,而且象这样问题,在其它类型里也是一样的 Integer等。用了这么多年java ,感到它,革新得太少了,不知道什么时候可以重定义体系,使之更强大。一些做游戏领域比较重要的东西都没有,
运算符重载也没有。。唉。
这句这错了应该是:因为128l>127,没有使用自动定义的数据,所以值不相等,既c==d为false.但是对象引用是相等的 既c.equals(d)为true
所以觉得java这样做,很不理解。
为什么要把这部分数据静态?
很多人都会误会:定义了两个不同对象,不会引用到相同的地址。没想到在这里乱了.
会不会是 java为了提高1.4的速度?
Integer,Short 等等基类对象,都有这种行为。
实际上,如果要提高性台,用缓存的办法,是不错的想法。
真的是这样,还是要说java:做得不切底,
还不如把 所有,字符集,基本数据,基本对象,都缓存,这样生成String ,生成对象,不管怎么样都是引用一个地方的内容。
呵呵,这样就可以高性能了。还可以节省内存。
不过你"所有"一词是什么意思?
全部常量化,这样创建对象时就只需引用。
不就速度更快?
就算 10万个,也最多只需要 20W字节,大概0.2M内存空间,
我觉得这样是不是更有利于java在速度时间方面比较快。
也许正因为这种比较在实际编码逻辑上没有意义,java才做的这种优化.何况1.6在IO上比1.5的性能有大幅提高喵~~``
跑题了。hehe
我已经把 GBK字符集初始到内存里面,大概占不到 1M内存。
并且在项目中做了约定,创建对象时都从这个cache里取静态字符。
Long b = 2l;
//结果为ture
System.out.println(a == b);
只是因为你RP好......呵呵,在我这里就是false
类 Object 中的 equals 参数:
obj - 要与之进行比较的对象。
返回:
如果对象相同,则返回 true;否则,返回 false。
另请参见:
Object.hashCode(), Hashtable
在1.5,1.6里肯定是true;你用的什么版本咯。
这个以来具体的JDK实现吧?Sun的标准实现确实是缓存了-128-127的吧?
IBM的实现不知道是什么样的。
Long a = 2l;
Long b = 2l;
你在1.4里给俺写一个这样的。。不认的
效率本身就不是他的长向,应该专注于自己的优势。网络,呵呵,个人认为。