final可修改String的一种方式,涨姿势篇

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));

 

blob.png

 

总结:final修饰的基本数据类型是不可变的,但是String,Map,数组等,都可以改变其内部的值。因为他们隶属于类,而类里面的属性还是可更改的。

本站博客:www.wurao.xin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值