今天看到一个面试题,话不多说,先上代码
public class test {
public static void main(String[] args) {
String A = new String("java");
StringBuffer B = new StringBuffer("java");
st(A);
sb(B);
System.out.println(A + B);
}
public static void st(String st) {
st.replace("j", "1");
}
public static void sb(StringBuffer sb) {
sb.append("c");
}
}
请问控制台输出结果为多少?
解答:就算蒙也不能蒙 1avajavac 啊,面试官不可能这么XX啊,所以最有可能答案是:javajavac(正好是两个控制台命令) 这样的结果可能大部分小伙伴都明白原理。
原理:String是不可变的对象,在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String 。
看清楚了啊,main方法中,小便将st方法的值重新赋给了A,这次输出结果呢?
使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
所以尽管sb()方法对A进行replace进行操作了,但是修改后的A是一个新的对象,最初初始化A时的那个对象依然不变。
你以为到这里就完了吗,小编自己突发奇想有思考了另一个问题。
废话不多说,还是看代码:
public class test {
public static void main(String[] args) {
String A = new String("java");
StringBuffer B = new StringBuffer("java");
st(A);
sb(B);
System.out.println(A + B);
}
public static String st(String st) {
st.replace("j", "1");
return st;
}
public static void sb(StringBuffer sb) {
sb.append("c");
}
}
代码相比第一次,修改了st()方法,变成有返回值的了,这次结果呢?
答案:依然不变,还是那个原理,尽管return了结果值,但是最初初始化A时的那个对象依然不变。不管st()方法怎么改依然不会对A有影响。你可以这样理解:只要不对A进行=(赋值)操作,A的值是不会变化的,随便你st()方法怎么浪。
在对上面方法进行修改:
public class test {
public static void main(String[] args) {
String A = new String("java");
StringBuffer B = new StringBuffer("java");
A = st(A);
sb(B);
System.out.println(A + B);
}
public static String st(String st) {
st.replace("j", "1");
return st;
}
public static void sb(StringBuffer sb) {
sb.append("c");
}
}
看清楚了啊,main方法中,小便将st方法的值重新赋给了A,这次输出结果呢?
答案还是javajavac 。为什么?明明返回值已经赋给A了啊???
其实这次的你掉进了st()方法中的坑了。仔细想想return sb返回的sb值是多少呢?java!还是那个原理啊因为st.replace("j", "1")虽然replace成功了,但是sb本身还是初始化的sb啊,replace的结果又生成了一个新的"sb"。所以返回值仍让是java。
public class test {
public static void main(String[] args) {
String A = new String("java");
StringBuffer B = new StringBuffer("java");
A = st(A);
sb(B);
System.out.println(A + B);
}
public static String st(String st) {
st = st.replace("j", "1");//这样就容易理解了
return st;
}
public static void sb(StringBuffer sb) {
sb.append("c");
}
}
这次输出结果就是:
1avajavac 了
是不是很绕,你可以自己把代码考过去多加些输出语句就很容易明白了。
PS:大家不要只看不评论啊,有问题仍然不明白欢迎评论,没意见欢迎666刷起来!