以前是C的,现在自学JAVA,  在论坛上找了一圈,只看到这里好象是JAVA的论坛,但是都是高深的问题,问个简单的,希望能有以教我谢谢。        String str1, str2;
        str1 = "Free the bound periodicals.";
        str2 = "Free the bound periodicals.";        System.out.println("String1: " + str1);
        System.out.println("String2: " + str2);
        System.out.println("Same object? " + (str1 == str2));这个如果是在C里面应该是FALSE,因为两个字串本身地址不同,而且复制内容不能是“str1=str2”。但这样一段,JAVAC后JAVA,系统输出是 Same object? true
我是应该理解为哪一种呢:1, JAVA把两个字符串指向另一存储“Free the bound periodicals.”的空间地址,“str1==str2”是判断两者指向相同空间地址
2, JAVA把两个字符串指向另一存储“Free the bound periodicals.”的空间地址,“str1==str2”是判断两个字串内容相同
3, JAVA自动优化把其中一个字串指向另一个,判断两个字串最终指向相同地址
4, JAVA自动优化其中一个字串为另一个字串的别名,两个字串内存中地址相同 
5, JAVA自动优化其中一个字串为另一个字串的别名,两个字串内存相同喔米托佛  惭愧得很  善载  善载

解决方案 »

  1.   

    已经懂了  因为两者指向同一个池中的常量地址,所以JVM判断他们指向同一个对象。但是如果是两个int型,应该就是FALSE了吧?
      

  2.   

    这个是Java的特性,你在程序中直接写出字符串值的Java内部有一个字符缓冲重用机制,这个名词不官方,但确实存在这机制,如果你将str1   =   "Free   the   bound   periodicals."; 
                    str2   =   "Free   the   bound   periodicals."; 修改为str1   =   new String("Free   the   bound   periodicals."); 
                    str2   =   new String("Free   the   bound   periodicals.");结果就不一样了,Java的入门教材中会提到这些 
      

  3.   

    int是原始类型,不用面向对象的思维去考虑它,对应的包装类才是
      

  4.   

    搞错了如果是内置类型,他就直接判断他们的值,而不判断地址,是吗。
    怎么才能取两个INT变量的地址出来判断呢?
      

  5.   

    2楼说的后面一种,是说强制他们在String池里分配两个常量地址吗?
      

  6.   

    JAVA入门教材都是千篇一律的太简单了,基本都是教从一乘到一百的或者比较两个字串的函数怎么拼写。我以前学C算法和程序上稍微有点深入,现在转JAVA是想看深入一点的又找不到合适的书。有看起来过瘾的书可以推荐几本吗。
      

  7.   

    注意3楼的提醒,new之后就不一样了,String是个数据类型,但是new了之后就是个对象了。
      

  8.   

    二楼说得对,我和朋友们一般喊那个缓冲叫String池,哈哈,很土吧
      

  9.   

    看下这个
    http://blog.csdn.net/sunyujia/archive/2007/11/17/1889779.aspx
    觉得楼主很谦虚,我很欣赏您的问问题的方式,应该是个优秀的程序员
      

  10.   

    String是一个final类,String的值是不能改变的,每当你对String赋新值的时候总是生成一个新的String
    所以当有大量字符操作的时候建议用StringBuffer......
    JVM对String进行了一定的优化,当出现两个内容相同的String的时候,他可能会像3楼说的那样,但并不总是能优化,所以比较String的时候总是用equals方法,当然你测试了玩是另一回事
      

  11.   

    因为String在java里面是不可修改的,所以共用也不会产生问题的。
    任何对String的修改,都会重新生成新的字符串。