int i=10;
  int j=10;   
   
  这个两个变量里面的值是一样的,那么他们所指向的地址是不是就是相同的?
  听说好像是由于编译器给优化成了同一个地址是么?  是不是跟String s1="123";    String   s2="123"; 一样他是在堆内存中被优化,而基础数据类型是在栈内存中被优化的了?

解决方案 »

  1.   

    栈内存中同样存在数据共享,int i=10;int j = 10;
    首先它会在栈中创建一个变量为i的引用,然后查找栈中是否有10这个值,如果没找到,就将10存放进来,然后将i指向3。接着处理int j = 10;在创建完j的引用变量后,因为在栈中已经有10这个值,便将j直接指向10。这点和堆内存是一样的。
      

  2.   

    和String s1="123"; String s2="123"; 不同的是这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况i的修改并不会影响到j。
      

  3.   

    很显然在两个地方
    int i=10;
      int j=10;  
    如果来一个i++怎么办?!要在一个地方还乱套了呢!
    String s1="123"; 
    String s2="123";
    这两句是在同一个地方,String常量池中 
      

  4.   


    同意,补充一下:
    int i=10;和int j=10;
    如果是在类中定义的,那么i和j将作为类实例对象在JVM运行过程中创建的对象所在的堆中存放值。
    如果是在方法中定义的,那么i和j是局部变量,将在方法运行的过程中创建该方法的栈帧,并在操作数栈中短暂的存储其值,当方法运行结束后,栈帧空间将被回收掉。无论在哪里,i和j都对应了两个不同的内存空间。这一点和String s="123"的常量内存结构是不同的。关于String,还是老生常谈,看看文章吧:《String in Java
      
      

  5.   

    不好意思``以前在je上看过一篇文章`被我弄差了`我刚又重新查了下.是这样写的:"对于int值每个变量保存自己的值,如果它大于short能表示的范围,则放到常量池中去."要去补补基础知识了,不好意思.
      

  6.   

    有一本书叫《深入JAVA虚拟机第二版》,第五章,楼主去看看吧
      

  7.   


    拿 i 和j 在不同的内存地址中,为什么实用 “==”的时候却能比较出来了?
          实际上我是由于 "==" 和 equels这个问题演化而来的问题。。感觉的无比郁闷!
      

  8.   

    对于基础类型 “==“ 比较的是值
    对于应用类型,默认比较的是地址,除非重写equals方法了
      

  9.   

    "==" 比较的是内存地址是不是一样,而equels 比较的才是值,为什么我们比较基础类型的时候“==”却能判断出不同内存中的值是不是一样? 如果按上述几位所说,那么就全乱套了。。
     
       忘各位继续解答 谢谢。
      

  10.   

    建议读一下《深入JVM》这本书,里面讲的很详细。1,"==" 运算符,对于基础数据类型,比较的就是值,而不是内存地址,对于复杂类型,比如自定义的对象,比较的就是地址。2,equals()方法,默认的实现也是比较地址,不过在String类中重写了,所以string.equals("")比较的是值而不再是地址3,对于int i=10;
                 int j=10;   
        这种定义,10是作为一个常量,放在常量池中的,但是i、j本身不是存在同一个地址的,相当于int i = 1;
     int j = 10;
        1,10在常量池里,而i,j不是同一个地址
       也就是说,1,10这些值只会保存一份,而i、j这些变量则不是。好像是这么回事