请问:
下面两种定义字符串的形式都有哪些不同呢??
什么情况下使用第一种,什么情况下使用第二种?
  String s1 = "abc";
  String s2 = new String("abc");

解决方案 »

  1.   

    第二种是构造一个新的String,第一种是把字符串内容放在了对象池中,具体我也不太清楚.
    这段代码是引用koj5201314 的,我觉得不错.public   static   void   main(String[]   args)   { 
    String   str1   =   "Hello   World! "; 
    String   str2   =   "Hello   World! "; 
    System.out.println(str1.hashCode()); 
    System.out.println(str2.hashCode()); 
    //   比较字符串的值 
    System.out.println(str1.equals(str2));//   输出true 
    //   比较两个字符串的hashcode,默认是内存地址 
    System.out.println(str1   ==   str2);//   输出true 
    String   str3   =   "Hello   World! "; 
    String   str4   =   new   String( "Hello   World! "); 
    System.out.println(str3.hashCode()); 
    System.out.println(str4.hashCode()); 
    //   比较字符串的值 
    System.out.println(str3.equals(str4));//   输出true 
    //   比较两个字符串的hashcode,默认是内存地址 
    System.out.println(str3   ==   str4);//   输出false 

    控制台结果: 
    -969099747 
    -969099747 
    true 
    true 
    -969099747 
    -969099747 
    true 
    false
      

  2.   

    <第二种是构造一个新的String,第一种是把字符串内容放在了对象池中>
    是什么意思啊,对象池是啥???
      

  3.   

    String   s1   =   "abc "; 在java程序中,只要有string literal,compiler 就会创建一个string object。
    LZ可以自已去看看。
    http://java.sun.com/docs/books/tutorial/java/data/strings.html
      

  4.   

    http://hi.baidu.com/johnsoncr/blog/item/aa345bf9590c2e5a252df202.html
    看下这里的
      

  5.   

    第一个是把变量"abc"赋给对象s1;
    第二个是重新创建一个对象,把第一个的对象值赋个新创建的对象
      

  6.   

    嘿嘿 这个问题 是个很著名的面试题来着的:
    String s = "shabi";
    String ss = new String("sb");
    (2条代码同时出现)
    第一条代码 生成几个对象:
    第2条代码 生成几个对象
    答案:1;2;
    至于为什么,我就不解释了,论坛上有好多解释的帖子,自己去找。。
    补充:
    如果是这样:
    String s = "shabi";
    String ss = new String("shabi");
    (2条代码同时出现)
    这样就都是1个对象了
      

  7.   

    单独出现时:
    String   s1   =   "abc "; 
    生成一个对象,在栈里
     String   s2   =   new   String( "abc ");
    生成两个对象,栈里一个,堆里一个(new的作用是开辟一片新的内存),
    同时出现时
    String   s1   =   "abc "; 
    生成一个对象,在栈里
    String   s2   =   new   String( "abc ");栈里的“abc”已经有了,所以不需要在 创建,就只在堆里创建了一个对象
      

  8.   

    7楼所说的< 生成两个对象,栈里一个,堆里一个 >
    栈里也可以存放对象吗,我听老师讲过说对象生死在堆里的啊!
      

  9.   

    后一种是构造了一个Stirng对象
    前一种只是定义了一个String类型的变量 是不能当对象处理和使用的
    前一种就可以
      

  10.   

    这两个方法应该是一样的,使用上应该没有区别吧就跟i = i + 1;跟i ++;一样...没区别
      

  11.   

    1楼的例子不错.
     
       //   比较两个字符串的hashcode,默认是内存地址 
        System.out.println(str1   ==   str2);//   输出true这里注释应该是:比较两个字符串的refrence,就是内存地址;没有比较hashcode.
      

  12.   

    永远不要用第二种方式,从性能上第一种要高一些,应该它只产出一个对象,而第二种则可能产生两个对象(如果当前字符串常量池中没有abc的定义),第二种无非是编码格式好一些。