我也是小白,只是见过类似的问题,说是名也就是地址的比较,如果要比较值的话,需要加一个,eqlore忘了是不是这么写,反正仅供参考

解决方案 »

  1.   

    应该是 String str2="hello"+str1;这样涉及到了str1的地址,所以导致str2和str3的对象地址不同吧。 String str2="hello"+"abc";这个是直接从常量池中引用,所以是一样的。(本人也是新手,意见仅供参考)
      

  2.   

    我觉得可能是这样的:  String str1="abc";
      String str2="hello"+str1;//在堆中创建一个String对象存放 "hello" + str1;
      String str3="hello"+str1;//同上
      System.out.println((str2==str3));//两个引用指向堆中不同的对象,值为false
      String str1="abc";
      String str2="hello"+"abc";//因为是两个常量相加,在常量池中创建一个新的常量 "hello" + "abc"
      String str3="hello"+"abc";//同上
      System.out.println((str2==str3));//两个引用指向常量池中同一个对象,值为true
      

  3.   

    就是5楼说的那样,这样说吧,常量池是放确定的内容,String str2="hello"+str1; 因为str1是引用,所以可能变化,所以java并不会在常量池里创建一个空间保存helloabc,所以就new 一个堆内存存入helloabc,str2指向他,同理str3也一样,==是比较引用地址,所以2个对象的地址不可能相等。而String str2="hello"+"abc";是一定的(一定是helloabc)所以java会把它放入常量池str2指向他同理str3也指向他,所以他们的地址一样
      

  4.   

    代码:
    public class Stringequals {
        public static void main(final String[] args) {
            System.out.println(test01());
            System.out.println(test02());
            System.out.println(test03());        System.out.println(test10());
            System.out.println(test20());
            System.out.println(test30());
        }    private static boolean test01() {
            String str1 = "abc";
            String str2 = "hello" + str1;
            String str3 = "hello" + str1;
            return str2 == str3;
        }    private static boolean test02() {
            String str2 = "hello" + "abc";
            String str3 = "hello" + "abc";
            return str2 == str3;
        }    private static boolean test03() {
            String str2 = new String("hello"+"abc");
            String str3 = "hello" + "abc";
            return str2 == str3;
        }    private static boolean test10() {
            String str1 = "abc";
            String str2 = "hello" + str1;
            String str3 = "hello" + str1;
            return str2.equals(str3);
        }    private static boolean test20() {
            String str2 = "hello" + "abc";
            String str3 = "hello" + "abc";
            return str2.equals(str3);
        }    private static boolean test30() {
            String str2 = new String("hello"+"abc");
            String str3 = "hello" + "abc";
            return str2.equals(str3);
        }
    }输出:
    false
    true
    false
    true
    true
    true说明:
    test01、02、03都是在比较两个对象的引用是否相等,
    test02里面都是完全的字面常量,Java为了节约内存空间,会把它们保存在完全相同的地址上这里的目的应该是比较各个对象的字面量是否相同,应该使用String类的equals()方法test10、20、30是修改后的正确的书写方法
    其中test03和test30是追加的示例
      

  5.   

    另外附加两点建议:1)认真阅读一下
    《JAVA 2核心技术 卷I:基础知识》和《JAVA.2核心技术.卷II:高级特性》
    以及《Thinking In Java》2)用eclipse的Checkstyle功能,尽量去除掉所有警告