1,基本类型在内存中的存储形式。
2,对于
   int a = 1;
   int b = 1;
   a==b 为true;的原理你赞同那种解释:
   (1) a和b指向了同一个内存地址。
   (2) java 对于基本类型的 == 操作与 对象类型有所区别,是比较值而不是比较地址。

解决方案 »

  1.   

    (2)
    如果是(1) a和b指向了同一个内存地址。 那如果a改变了这个值 是不是 b也要跟着改变了?
      

  2.   

    那么 
    String s1 = "abc";
    String s2 = "abc";
    呢?
      

  3.   

    ==号比较int型用的是if_icmpne指令 比较栈顶两int型数值大小
    ==号比较对象类型用的是if_acmpne指令 比较栈顶两引用型数值
    String s1 = "abc";
    String s2 = "abc";
    s1==s2肯定是if_acmpne
      

  4.   

    我想请问:
     比较栈顶两int型数值大小 是什么意思。能详细说下 if_icmpne 的执行过程吗?
    还有,基本类型在内存中的存储结构是什么:
    1 基本类型就是引用的值。
    2 它有独立的内存地址。不过按你的说法,好像是1的意思。
      

  5.   

    int a = 1;
    int b = 1;
    if(a==b)
    执行过程就是
    1 常数1进操作数栈
    2 操作数栈到变量a
    3 常数1进操作数栈
    4 操作数栈到变量b
    ----
    5 把变量a压入操作数栈
    6 把变量b压入操作数栈
    7 调用if_icmpne比较栈顶两int型数值大小
      

  6.   

    String 特殊啊 有字符串池啊
    int a=1;
    int b=1;栈里就是2个1啊
      

  7.   

    1,2 两个题其实是一会事
     
    1,基本类型在内存中的存储形式。
    2,对于
      int a = 1;
      int b = 1;
      a==b 为true;的原理你赞同那种解释:
      (1) a和b指向了同一个内存地址。
      (2) java 对于基本类型的 == 操作与 对象类型有所区别,是比较值而不是比较地址。
    基本类型是在栈里,而对象是在堆里,栈里记录的是引用的值也即对象的地址值
    所以你可以这么理解 都是比较的值,但这个值是压在栈里的值
    基本数据因为直接压栈 所以比较的就是他们自己
    而 对象的话 比较的是他们压在栈里的对象在堆中的地址值
    所以如果两个引用相等的话他们就是指向的同一个对象
      

  8.   

    int是基本类型,==是比较值,也就是a和b各有自己的地址,各自的地址里都存着1,比较的时候,从a,b两个地址里取出对应的值来比较
    Sting是对象类型,对象类型存放的是地址,也就是s1和s2有各自的地址,该地址里存的是字符串"abc"的地址,比较的时候,从s1,s2两个地址里取出对应的地址来比较
    "abc"是个常量字符串对象,为了优化系统资源,jvm中始终只存在一个不同的字符串常量,所以s1和s2引用的是同一个对象,即s1的地址里存的是常量"abc"的地址,s2的地址里存的也是常量"abc"的地址
    如果把s2改为s2="bcd",这时jvm会生成一个"bcd"字符串常量对象,然后把该对象的地址存到s2的地址中
      

  9.   

    数据类型可以分为两种:基本数据型和引用类型
    基本类型的变量持有原始值,引用类型的变量持有引用值
    java虚拟机没有寄存器,指令集使用JAVA栈来存储中间数据.JAVA栈有一个个栈帧组成,栈帧由 局部变量区,操作数栈,帧数据区组成.
    字节码的世界里不存在名称,只知道第几个变量 再根据占用的空间 计算出地址
      

  10.   

    这个问题没什么好讨论的...
      你去翻下书,关于core java的.上面都写的很清楚
     == 在比较基本数据类型的时候,比较的是值
      equals才是地址.....  
      

  11.   


    基本类型 有 equals方法吗?
      

  12.   

    这就要从内存中的 堆跟栈 说起来。一般java的基础类型(int,long,boolean)等都是在栈中产生内存地址,栈中的内存地址是确定的,如 int a=1,jvm会先到栈中找有没有a和1,没有先创建。当 int b = 1时,又去栈中找,因为已经有1了,所以直接将b指向1的内存地址而不再次产生新的内存。也就是说a根b都指向来1的内存地址所以当用a==b时由于指向的是同一地址所以使true。==表示判断“对象的引用”是否相等,即是否是同一个对象。a.equals(b)只是比较a对象与b对象的“值”是否相等。