BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #44931同步于 2015/10/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

谁说String不可变的?

cuter
2015/10/24镜像同步12 回复
String a="abc"; Field valueFieldString=String.class.getDeclaredField("value"); valueFieldString.setAccessible(true); char[]value=(char[])valueFieldString.get(a); value[2]='@'; String b="abc"; System.out.println(a==b); System.out.println("abc"==b); System.out.println(a); System.out.println(b); System.out.println("ab@"==a); true true ab@ ab@ false
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2015/10/24
这……好吧,恭喜。 不过可以说说你用的是哪个jvm吗?java api并没有说string里有value这个字段。
cuter机器人#2 · 2015/10/24
点开string源码就有了。。。sincejdk1.0 文档上不知道说没说 【 在 nuanyangyang 的大作中提到: 】 : 这……好吧,恭喜。 : 不过可以说说你用的是哪个jvm吗?java api并没有说string里有value这个字段。
nuanyangyang机器人#3 · 2015/10/24
oracle的jdk? 【 在 cuter 的大作中提到: 】 : 点开string源码就有了。。。sincejdk1.0 : 文档上不知道说没说
icyfox机器人#4 · 2015/10/24
有是肯定有的...String and StringBuffer都是用char[]存储的 不过是定长 【 在 nuanyangyang (暖羊羊) 的大作中提到: 】 : 这……好吧,恭喜。 : 不过可以说说你用的是哪个jvm吗?java api并没有说string里有value这个字段。
cuter机器人#5 · 2015/10/24
嗯 【 在 nuanyangyang 的大作中提到: 】 : oracle的jdk?
nuanyangyang机器人#6 · 2015/10/24
【 在 icyfox 的大作中提到: 】 : 有是肯定有的...String and StringBuffer都是用char[]存储的 : 不过是定长 : 我的意思是,这是实现String类的一种方法,但不是唯一的。比如,可以完全用C和JNI实现逻辑,然后String用一个long来保存本地指针。但这样,好像失去了很多垃圾回收带来的好处。
cuter机器人#7 · 2015/10/24
暖神,话说怎么获取到指针的啊?能获取实际的内存地址吗? 【 在 nuanyangyang 的大作中提到: 】 : : 我的意思是,这是实现String类的一种方法,但不是唯一的。比如,可以完全用C和JNI实现逻辑,然后String用一个long来保存本地指针。但这样,好像失去了很多垃圾回收带来的好处。
icyfox机器人#8 · 2015/10/24
是是是... 【 在 nuanyangyang (暖羊羊) 的大作中提到: 】 : 我的意思是,这是实现String类的一种方法,但不是唯一的。比如,可以完全用C和JNI实现逻辑,然后String用一个long来保存本地指针。但这样,好像失去了很多垃圾回收带来的好处。
nuanyangyang机器人#9 · 2015/10/24
【 在 cuter 的大作中提到: 】 : 暖神,话说怎么获取到指针的啊?能获取实际的内存地址吗? 是说指向java对象的指针么?这……说来话长,java的对象可能会被GC移动,也可能在内存里有多个备份,也有可能根本不在内存里。所以……你懂的。 其实C也没说指针就是地址,但大多数人用地址来实现指针。