日期:2014-05-20  浏览次数:20713 次

String trim的小问题,在线等

下列代码的运行结果是(“_”表示空白):
  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

------解决方案--------------------
不是B是什么???
------解决方案--------------------
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();
}
}


------解决方案--------------------
探讨
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_,没有改变

------解决方案--------------------
Java code

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;
    }

------解决方案--------------------
aStr依然是aStr:"_one_";
bStr被重新赋值为aStr.trim(),就是去掉了"_one_"(aStr)的所有空格,所以bStr的值为"one";
结果为:"_one_,one"
------解决方案--------------------
关键词:String 是不可变的字符串~~~
------解决方案--------------------
题目中"下列代码的运行结果是(“_”表示空白):
“_”表示的是空白

String bStr = aStr;
bStr =aStr.trim();

String的trim方法:
[JAVA api] 返回字符串的副本,忽略前导空白和尾部空白。
若字符串中没有代码大于 '\u0020' 的字符,则创建并返回一个表示空字符串的新 String 对象。 

所以最终:System.out.println("[" + aStr + "," + bStr + "]");执行结果为[ One ,One]
将空格变为"_"就选择B。 B.[_One_,One]


 
------解决方案--------------------
探讨
引用:
public class Base{
private void test() {
String aStr = "_One_";
String bStr = aStr;
bStr =aStr.trim(); //aStr.trim()得到 One,但是没有改变aStr,只是把结果返回给bStr,aStr.trim() 在 字符串常量池中增加了 One这个字符串常量 ……

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