大家好,这里是K字的研究.
今天呢, 我们再来一次编程挑战,做一个小题目.
编程挑战
据朋友F哥说, 是他去某个知名互联网大厂的笔试题.
String s = new String("abc”);
// 在这中间可以添加N行代码,但必须确认s引用的指向不变,将输出变成abcd
System.out.println(s);
我也来挑战一下试试, 看看我能不能做出来.
考点分析
首先,确定这道题考什么.
Java的String类型, 是一个引用类型. 但是, 他是一个不可变类型.一旦初始化以后,只能换一个新的.不可能用原来的引用指向新的字符串.
挑战不可能, 就是这个题的考点.
然而, 众所周知, Java String的实现方式, 是内置了一个数组 char[] value
.
如果我们能够把内部数组改掉, 是不是就可以做到了.
public final class String {
/** The value is used for character storage. */
private final char value[];
}
然而, 这个数组是一个private
+final
值.
就算private
可以用反射突破,final
值是不是不变的吗, 能改吗?
我们来试一下.
反射解法
### code
String s = new String("abc");
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
value.set(s,new char[]{
'a','b',