关于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这样做,有没有什么其它看法。

解决方案 »

  1.   

    对值的比较使用equals
    ==的比较更多用在null判断里喵~``
      

  2.   

    以后一般情况下都用equals方法 不轻易用== 这样会好点吧 呵呵
      

  3.   

    对于对象类型都不建议直接使用==,而使用equals,但是对于有些个别的处理,虽然是多个句柄但是指向的是同一个对象的情况下就出现了相等的情况,但是始终还是不建议使用==来直接操作对象类型。
      

  4.   


    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了!
      

  5.   

    这写当然相等,你是比较值。
    问题比较引用时,结果不一样,这就让人容易误解。实际都为false是比较容易理解的。
      

  6.   

    第二个为 false,为什么第一个要搞成 ture?并且永远都是真,
    这已失去对象的含义了,是常量了.
      

  7.   

    实际上-128->127在java里定义了静态数据,所以这个值之内用自动封箱的给值方法,总是相等最关键的就是这句了!还要注意一点就是楼主是用Long定义的:
    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。
      

  8.   


    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 
      }
    }
      

  9.   

    虽然jdk1.5,1.6,1.7搞了很多新东西,个人觉得,没什么新义。
    真正在体系结构上改动太少了,而且象这样问题,在其它类型里也是一样的 Integer等。用了这么多年java ,感到它,革新得太少了,不知道什么时候可以重定义体系,使之更强大。一些做游戏领域比较重要的东西都没有,
    运算符重载也没有。。唉。
      

  10.   


    这句这错了应该是:因为128l>127,没有使用自动定义的数据,所以值不相等,既c==d为false.但是对象引用是相等的 既c.equals(d)为true 
      

  11.   

    关键这个逻辑包在JDK内,如果有新手,根本就不知道这回事。
    所以觉得java这样做,很不理解。
    为什么要把这部分数据静态?
    很多人都会误会:定义了两个不同对象,不会引用到相同的地址。没想到在这里乱了.
    会不会是 java为了提高1.4的速度?
      

  12.   

    问题看到源代码后,
    Integer,Short 等等基类对象,都有这种行为。
      

  13.   

    看来java 确是为了解决1.4过慢的问题,做出这样的选择。
    实际上,如果要提高性台,用缓存的办法,是不错的想法。
    真的是这样,还是要说java:做得不切底,
    还不如把 所有,字符集,基本数据,基本对象,都缓存,这样生成String ,生成对象,不管怎么样都是引用一个地方的内容。
    呵呵,这样就可以高性能了。还可以节省内存。
      

  14.   

    jvm就是把int(大于short的) ,long,double,float等基本类型的字面常量存在常量池里的,用到了直接拿过来.
    不过你"所有"一词是什么意思?
      

  15.   

    原来还有这一出,还是用equals稳当。
      

  16.   

    所有,是指字符集:如 utf-16le (java用的字符集)
    全部常量化,这样创建对象时就只需引用。
    不就速度更快?
      

  17.   

    没具体计算过放在 char[]在占多少内存。
    就算 10万个,也最多只需要 20W字节,大概0.2M内存空间,
    我觉得这样是不是更有利于java在速度时间方面比较快。
      

  18.   

    什么时候会被用来比较两个包装类的地址啊~~``
    也许正因为这种比较在实际编码逻辑上没有意义,java才做的这种优化.何况1.6在IO上比1.5的性能有大幅提高喵~~``
      

  19.   

    equals()与==的区别以及对象的创建问题看这里http://topic.csdn.net/u/20081120/17/54906067-d0c0-470e-b123-cf1fca9c4a28.html
      

  20.   

    楼上这里不是谈你说的问题 equals()与==的区别,这是学java的人首先要知道的。
    跑题了。hehe
      

  21.   

    由于cache对性能提高,与内存节省有很大的好处,我已经开始在项目中内置了字符收集器,象输入法一样
    我已经把 GBK字符集初始到内存里面,大概占不到 1M内存。
    并且在项目中做了约定,创建对象时都从这个cache里取静态字符。
      

  22.   

    Long a = 2l;
    Long b = 2l;
    //结果为ture
    System.out.println(a == b); 
    只是因为你RP好......呵呵,在我这里就是false
      

  23.   

    equalspublic boolean equals(Object obj)    将此对象与指定对象进行比较。当且仅当该参数不是 null,且 Long 对象与此对象包含相同的 long 值时,结果才为 true。    覆盖:
            类 Object 中的 equals    参数:
            obj - 要与之进行比较的对象。
        返回:
            如果对象相同,则返回 true;否则,返回 false。
        另请参见:
            Object.hashCode(), Hashtable
      

  24.   


    在1.5,1.6里肯定是true;你用的什么版本咯。
      

  25.   


    这个以来具体的JDK实现吧?Sun的标准实现确实是缓存了-128-127的吧?
    IBM的实现不知道是什么样的。
      

  26.   

    而且我想在这次技术大会,有人会提出java其它核心错误设计,我提的问题可能是冰山一角,可能java有更严重,更深的设计问题。
      

  27.   

    嘻嘻
    Long a = 2l; 
    Long b = 2l;
    你在1.4里给俺写一个这样的。。不认的
      

  28.   

    1.4你只能new 这样肯定是false ,如果说1。5这样写就是 true
      

  29.   

    说实在,java这样没有多大意义,让人感觉混乱。
    效率本身就不是他的长向,应该专注于自己的优势。网络,呵呵,个人认为。