java中String是不可改变的,因为每次给String赋值的时候都会隐式的new一个String对象,但是String对象中的value还是能改变的
看String的源码中是这么储存数据的:
private final char value[];
因为是final的,value数组不可以更换,只能修改元素的值:
/** * 主函数 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String s = "maomao"; System.out.println("修改前:s=" + s + ",hashcode=" + s.hashCode()); modifyString(s); System.out.println("修改后:s=" + s + ",hashcode=" + s.hashCode()); System.out.println("比较maomao和moomoo:" + "maomao".equals("moomoo")); }
/** * 修改字符串中的值 * * @param s * @throws NoSuchFieldException * @throws IllegalAccessException */ private static void modifyString(String s) throws NoSuchFieldException, IllegalAccessException { // 修改String的值 Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[]) field.get(s); value[1] = 'o'; value[4] = 'o'; }
运行结果:
修改前:s=maomao,hashcode=-1081393632
修改后:s=moomoo,hashcode=-1081393632
比较maomao和moomoo:true