据说, 这是某个知名互联网大厂的笔试题

这篇博客分享了一道来自知名互联网大厂的笔试编程挑战,主要涉及Java中String类型的不可变性以及反射的使用。博主通过分析题目,揭示了可以通过反射修改String的final属性,并探讨了其他可能的解题思路,包括利用访问控制和自定义标准输出流。文章总结了多个Java知识点,鼓励读者探索更多解法。
摘要由CSDN通过智能技术生成

大家好,这里是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',
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值