String是由private final char value[]保存的值,当字符串内容发生改变时本质都是new一个新的string用于保存新的字符串内容
private 意味着外部不能直接访问
final 意味着其地址值不能直接修改
String str = "张三";
//hashCode()方法返回的值可比作地址值
System.out.println(str + "的hashCode值:" + str.hashCode());
str += "王二";
System.out.println(str + "的hashCode值:" + str.hashCode());
运行结果:
使用反射后
String str = "张三 ";
System.out.println(str + "的hashCode值:" + str.hashCode());
Class<String> stringClass = String.class;
char[] chars = {'张', '三', '加','王','二'};
try {
Field value = stringClass.getDeclaredField("value");
value.setAccessible(true);
value.set(str,chars);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(str + "的hashCode值:" + str.hashCode());
运行结果:
甚至可以直接修改hash的值
String str = "张三 ";
System.out.println(str + "的hashCode值:" + str.hashCode());
Class<String> stringClass = String.class;
int hash=666;
try {
Field value = stringClass.getDeclaredField("hash");
value.setAccessible(true);
value.set(str,hash);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(str + "的hashCode值:" + str.hashCode());