问题  如题.
  比如 有int a = 0;
那么怎么才能看到 这个a 在内存中的地址呢?  
  还有一个问题就是 如果我也定义一个 变量 int b = 0;定义在同一个类中,那么是不是意味着a 和b 的地址是同一个呢.如果是同一个那么 对a 进行操作时,如何保证不影响 b 呢.
   因为 String 类型时有 String str1 = "abcd";
                         String str2 = "abcd";
str1 和str2 在内存中是同一个空间故有此疑问.

解决方案 »

  1.   

    Java中没有指针(地址)的概念,根本看不到a在内存中的地址
    String str1 = "abcd";和String str2 = "abcd"; 也不可能在一块类存区,除非中间用个str1=str2;
      

  2.   

    说白了 又是再问String的问题
      

  3.   

    这个是不对的。
    他们是占用同一块内存空间的。
    所有在程序中出现的“abcd”这样的东西,都是在编译时就确定的,会将他们放在常量池里,如果出现多次相同的,常量池里只会有一个。如果你担心这样是不是会str1 = "xxxx",这样str2就变了,那么别忘记String 是 final的。
    另外如果String是new出来的或者通过其他方式得来的,这个是在运行时才申请空间的。String str1 = new String("abcd");
    String str2 = new String("abcd");
    str1 == str2就不成立了。
      

  4.   

     我也是这样理解的. 恩但是关于 这个看地址. 应该有个途径,可以看到 吧.不然我们何以确定 这个两个String 的地址是一样的啊. 虽然 别人是这么说的,但是要 眼见才为实撒.
      

  5.   

    不知 兄台可知道如何看 str1 在内存中的地址. 
    hashCode() 有人说是可以看,但是我自己试了一下 .这个方法 对String 来说似乎要解释成 是String里面的内容跟合理一些. 
    String as = new String("te45");
    String as2 = new String("te1");输出 
     System.out.println(as.hashCode());
     System.out.println(as2.hashCode());3554482
    114656把as改为   String as = new String("te2");
    输出为:
    114657
    114656
      

  6.   

    用hashCode()方法可以知道,它显示是的哈希码.
    String的值是不变的,String a = "abc",会把a放在常量池中,如果再声明
    String b ="abc", 则a和b是指向同一个引用.你可以用==或equals()验证.
    如:System.out.pringln(a==b);或System.out.pringln(a.equals(b));
      

  7.   

    但是如果你是用String a ="abc",String b = new String("abc");
    用同样的方法,看看和上面的区别.你就能明白一些了.
      

  8.   

    当两个字符串引用相同的常量对象的时候才会占用相同的内存空间
    String a=new String("abc")
    String b=new String("abc")
    a,b就不会占用相同的内存空间
    字符串特殊....整形完全没有这个的说
      

  9.   

    那Integer 也有这样的情况啊.
      

  10.   


    兄台 能否 告知如何用 hashCode 看地址呢?
      

  11.   

    Integer是因为新版本JDK的一个特性
    他提供了一个数值范围的对象池,可能有助于提高运行效率,实则鸡肋的特性。
      

  12.   

    那Float 和  Character Double 呢都是有 String 和Integer这样的特性吗?
      

  13.   

    无法看到地址,因为JAVA无法操作地址,边读取都办不到。
      

  14.   

    无法看到地址,因为JAVA无法操作地址,连读取都办不到。
      

  15.   

    String 中的 hashCode 被重写过的,可以使用 System.identityHashCode 方法查看。
      

  16.   

    int a 在内存里的地址,如果说直接得到的话,那应该是不可能的,原因很简单,你运行的环境是jvm,你创建的
    a 并不是 直接操作内存,而是由jvm操作的,c++就可以直接操作内存块,所以你要得到a的内存的地址,我个人
    觉得比较有难度,当然要得到也是可以的。至于hashcode,这个不是内存地址吧,还有我觉得java都明白的告诉
    你要让java比c++减少更多的编程错误,其中,指针的概念就是为此而消失的。
      

  17.   

    做如下操作String s时,只是创建了一个引用的句柄,就相当C中的指针一样的,都说JAVA中没有指针,其实是有指针的,只是对它进行了严格的控制而已!创建S的时候不会在内存中开辟空间,只是放在堆栈中,实际S现在没有指向任何对象。
    当String s=new String(“123”)时,这是才会在内存中开辟一个空间存取“123”,其中的S其实只是指向了对象“123”的首地址,这是我们只要操作这个句柄S就可以对对象进行操作了!(很多人都把S叫成对象,其实它并不是对象)
    按LZ说的String str1 = "abcd"; 
           String str2 = "abcd"; 
    确实是它们指向了同一个内存地址,是因为本来就有“abcd”这个对象,现在将“abcd”的首地址同时给了str1,str2,所以str1,str2才指向了同一个内存地址,只有当你用NEW这个关键字的时候才会在内存中开辟空间!
    现在在做个比较 String s1=new String("abcd");
                 String s2=new String("abcd");
    这里用NEW开辟了两个内存空间,都是用来存取“abcd”,并分别用s1,s2来引用他们的首地址!LZ可以想想,在内存中开辟两个空间,你说它们在内存中的地址会一样吗,虽然都是存放的是相同的东西!
    当我们用“s1==s2”去比较它们的时候是比较他们的地址,所以s1,s2是不相等的,但是当我们用的“s1.equals(s2)”时是比较的内容(特别注意,在用equals比较时,只有String ,Date,File以及封装类时是比较的内容,因为它们对ToString()方法进行了重写,其他的并没有进行重写,所以还是比较的HashCode,也就是比较的是地址值,是不相等的)很多人都以为equals()都是比较的内容,但是前提是进行了重写!!!
      

  18.   

    谢谢先.
    然后我还想在请教一个问题. String有这样的特性(str1 = "abc" str2 = "abc" str1 的地址和str2的地址一样).  我的新问题是:    Integer Float Double Character 有这样的性质吗?
                      int float double char 没有这样的性质是吗?
                     
    还有个 疑问是如果 Integer 也有和String 一样的性质(Integer i1 = 2; Integer i2 = 2; i1 = i2)那 它如何做到数据 修改不互相影响的.因为String是固定的所以没有这个问题.但是Integer 不是固定的啊.要是两个对象指向同一个地址,修改了一个那另一个不是也改了?
      

  19.   

    String a="abcd";
    String b="abcd";
    System.out.println(a==b);
    这样输出true,就可以知道a和b指向同一块内存了,然后改变a="efgh";System.out.println(b);输出还是abcd,就可以知道了,
    改变a的值(其实是a的指向),并不会影响到b的值(即b的指向).至于int类型的,根本不是引用类型...
      

  20.   

    最近怎么流行研究java的内存问题了,奇怪。
      

  21.   

    因为之前我用C语言测试过在tc下 int 和 char 就算值相同指向的也不会是同一个地址.
    但是同样的代码用VC 编译 运行就会发现值相同的话,输出的地址是一样的.
    所以我主要是想知道.JAVA 是否也是 值相同就放到 同一个空间里.如果是放到同一个空间里.那么如何解决的,对一个值修改但是又不影响其他值的? 因为他们是两个不同变量,从理论上讲他们应该彼此没有关系的,修改任一个的值不会 影响其他的.  
      

  22.   

    String 类的对象是不可变的,所以指向同一个对象是可以的,而基本数据类型肯定不是同一个内存地址
      

  23.   

    我也有此疑问,看了各位的回答,难道是说在java中,变量的内存地址是不可得的?
      

  24.   

    我觉得上面都没有解决LZ的疑问:
    int a =1;int b=1;
    在java中值相同,a和b是使用同一块内存空间的,a,b只是这块空间不同的引用而已。一同指向值为1的空间。
    很多人误以为开辟了2块空间。