关于StringBuffer和String的replace面试题目

今天看到一个面试题,话不多说,先上代码


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 。

使用 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刷起来!






评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值