大家都知道
如果String s1=new String("hello"); String s2="hello";
最后比较s1和s2 用==显示是不相等的 但是 直接使用对象名是调用了toString()方法
String toString()返回是字符串的内容 而两个内容是相同的 只是存放在了不同的堆空间 而这种从内容到堆空间地址的转换在这个==中是怎么做到的 我不太清楚
简单说 就是 在比较操作中 是怎么获取到两个hello所在的堆的地址的?还有以此附加个问题 怎样获取字符串的地址 就像其他对象直接输出 得到@xxxx一样

解决方案 »

  1.   

    此外 既然开辟了两个相同内容不同地址的堆空间 为什么s2指向的就不会是s1所指向的那个hello 而是另一个hello呢 困惑
      

  2.   

    别纠结了
    别再用 == 比较 String 了
    用 equals 比较吧纠结这些干什么
      

  3.   

    java里是获取不了内存地址的,你所说的@xxxx,这里的xxxx不是内存地址,是对象的内存信息的哈希值
    想获取String的哈希值,可以自己调用hashCode方法,即System.out.println(s1.hashCode());
      

  4.   

    java里是获取不了内存地址的,你所说的@xxxx,这里的xxxx不是内存地址,是对象的内存信息的哈希值
    想获取String的哈希值,可以自己调用hashCode方法,即System.out.println(s1.hashCode());
      

  5.   

    又是这样总问题 
    String s1=new String("hello"); 
    在虚拟机里 内存先创建 生成 "hello" 字符串;
    然后由于 new String  内存创建一个新对象 隐藏对象 赋值给S1
    S2 由于内存中已经生成了hello常量
    所以你懂得 下面那句话打印出来看下就明白了                  String s1=new String("hello"); String s2="hello";
    System.out.println(System.identityHashCode("hello"));
    System.out.println(System.identityHashCode(s1));
    System.out.println(System.identityHashCode(s2));
    System.out.println(s1==s2);
      

  6.   

    哎!  new 是概念 你还没弄懂么 简单的说 String就好比是一个人的概念 在这里 加入你叫“hello” 在String这个人的类里 还有一个叫“hello” 的  你说 你两能相等么?  如果这个程序是 
    class person{
       public static void main(String[] args){
            String s1 = "hello";
            String s2 = "hello";
            System.out.println(s1 == s2);
       }
    }
    你运行一下看看  这个是没问题的。 这个结果是true
      

  7.   

    new不是概念 new是开辟堆内存空间.
      

  8.   

    多谢回答 了解了 也就是他们其实是在比较类的hashCode的(String的hashCode()方法被覆写所以s1 s2相等吧)