final修饰的字符串不是不可变的。
String ss="abc"; //初始值
String sscopy="abc"; //copy的一个字符串
String replace="1232"; //替换初始值的值
Field[] f= ss.getClass().getDeclaredFields(); //反射获取"ss"这个字段
System.out.println("ss的hashode:"+ss.hashCode()+",replace的hashode:"+replace.hashCode());
for (Field field : f) { //遍历里面元素的value
if("value".equals(field.getName())){ //因为我们只要区value的值
field.setAccessible(true); //为true强行越过private修饰符
char [] value = (char[]) field.get(sscopy); //这个field.get(可以字符串不一样,但是地址值一定是一样。不然无法解析获取)
for (int i = 0; i < value.length; i++) { //遍历field.get()获取的值,就是ss的值abc已经通过下标存储到数组里了。
value[i] = replace.toCharArray()[i]; //替换元素的值 toCharArrays:包含一切字符均转换成相应的字符数组
}
}
}
System.out.println("此时ss的值:"+ss); //替换成功,但是为啥1232替换过后的结果是123?这个实际不可扩容造成的。
System.out.println(replace==ss); //不能进行等值比较,String需要等址比较
System.out.println(Integer.parseInt(replace)==Integer.parseInt(ss));
System.out.println(replace.equals(ss));
总结:final修饰的基本数据类型是不可变的,但是String,Map,数组等,都可以改变其内部的值。因为他们隶属于类,而类里面的属性还是可更改的。
本站博客:www.wurao.xin