下列代码的运行结果是(“_”表示空白):
          public class Base{
                 private void test() {
                       String aStr = "_One_";
                       String bStr = aStr;
                       bStr =aStr.trim();
                       System.out.println("[" + aStr + "," + bStr + "]");
                 }
                public static  void main(String[] a) {
                       new Base().test();
                 }
           }A.[One,_One_]B.[_One_,One]C.[One,One]D.[_One_,_One_]正确答案:B 问,为什么会是B呢,thanks

解决方案 »

  1.   

    public class Base{
      private void test() {
      String aStr = "_One_";
      String bStr = aStr;
      bStr =aStr.trim(); //aStr.trim()得到 One,但是没有改变aStr,只是把结果返回给bStr,aStr.trim() 在 字符串常量池中增加了 One这个字符串常量 ,bStr = aStr.trim(),即让bStr指向常量池中的One,而aStr还是指向常量池的_One_,没有改变
      System.out.println("[" + aStr + "," + bStr + "]");
      }
      public static void main(String[] a) {
      new Base().test();
      }
      }
      

  2.   

    完全正确,string字符串是不可以改变的!
      

  3.   


    public String trim() {
    int len = count;
    int st = 0;
    int off = offset;      /* avoid getfield opcode */
    char[] val = value;    /* avoid getfield opcode */ while ((st < len) && (val[off + st] <= ' ')) {
        st++;
    }
    while ((st < len) && (val[off + len - 1] <= ' ')) {
        len--;
    }
    return ((st > 0) || (len < count)) ? substring(st, len) : this;
        }
    这是String的trim方法,如果String前后没有包含空格,会直接返回原String,否则会new出一个新的, String aStr = "_One_";
      String bStr = aStr;//bStr指向" One "了
      bStr =aStr.trim();//由于aStr修改了,会返回一个新的String ,bStr指向的是新的内容是One,aStr没有改变内容,所以输出就是[ One ,One]
      

  4.   

    aStr依然是aStr:"_one_";
    bStr被重新赋值为aStr.trim(),就是去掉了"_one_"(aStr)的所有空格,所以bStr的值为"one";
    结果为:"_one_,one"
      

  5.   

    关键词:String 是不可变的字符串~~~
      

  6.   

    题目中"下列代码的运行结果是(“_”表示空白):
    “_”表示的是空白String bStr = aStr;
    bStr =aStr.trim();String的trim方法:
    [JAVA api] 返回字符串的副本,忽略前导空白和尾部空白。
    若字符串中没有代码大于 '\u0020' 的字符,则创建并返回一个表示空字符串的新 String 对象。 所以最终:System.out.println("[" + aStr + "," + bStr + "]");执行结果为[ One ,One]
    将空格变为"_"就选择B。              B.[_One_,One]
     
      

  7.   

    仔细研究一下trim方法的原理,不要人云亦云的
      

  8.   

    String aStr = "_One_";//在栈中没有"_One_",则创建它,并且赋值给变量aStr。
    String bStr = aStr;//指向相同的地址
    bStr =aStr.trim();// aStr.trim()处理完得到"One",在栈中没有"One",创建它,并且重新赋值给变量bStr。
    这时候栈中存在aStr ,bStr 2个变量,"_One_","One"2个对象。
      

  9.   

      String aStr = "_One_"; -------1
      String bStr = aStr;-------------2
      bStr =aStr.trim();执行这句,返回一个String类型的对象。也就是bStr引用指向的新对象。
    2就作废了。
      

  10.   

    public class Base{
       private void test() {
       String aStr = "_One_";
       String bStr = aStr; //bStr的值为:_One_
       bStr =aStr.trim(); // 虽然aStr.trim()但是并没有改变aStr内存中的值,而是将值赋给内存变量bStr,因此,bStr值为“One”。比如,int a;int b; a=a+b;一样。
       System.out.println("[" + aStr + "," + bStr + "]");
       }
       public static void main(String[] a) {
       new Base().test();
       }
       }
      

  11.   

    多谢大家,再问
    String str1=new String("abc");
    String str2="abc";
    这二句有什么不同呢,
      

  12.   

    B啊,trim()方法是返回一个新的字符串对象,新的字符串对象相对于原来的字符串对象是去了开始和结束的空格