欢迎来到天天文库
浏览记录
ID:55665119
大小:164.00 KB
页数:13页
时间:2020-05-23
《解决JAV的String的传值和传地址问题.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、(浪曦分享)解决JAVA的String的传值和传地址问题关于Java的String类型,可能你会碰到这种情况,将String类型的变量传到一个函数,在这个函数中修改变量的值,但是,实参的值并没有发生改变。Java中String的传值/传地址问题:例子引入:1packagecom.cnblog.GDUTtiantian.String;23/**4*@authorGDUTtiantian5*/6publicclassJavaString{78publicstaticvoidchange(Stringname){9//修改n
2、ame的值10name="ChangedName";11}121314publicstaticvoidmain(String[]args){15Stringname="GDUTtiantian";1617change(name);1819System.out.println(name);2021}2223}运行结果:1GDUTtiantian为什么结果不是"ChangedName"呢?String类的底层实现是用一个字符数组去实现的,就像Integer类,底层也是对int进行封装[装箱和拆箱]。看String类的修饰部
3、分(源码):1publicfinalclassString2implementsjava.io.Serializable,Comparable,CharSequence{3/**Thevalueisusedforcharacterstorage.*/4privatefinalcharvalue[];注意,String类加了final关键字,所以不能被继承。第4行是字符串底层的存储结构:字符数组。String的内容不能被动态地修改,因为底层是字符数组实现的,数组的大小是在初始化时决定的;如果可以修改,新的
4、字符串长度比原来数组大,那么就会造成数组越界。String和StringBuffer的比较:1packagecom.cnblog.GDUTtiantian.String;23/**4*@authorGDUTtiantian5*6*String,StringBuffer在传参过程中的哈希值比较7*/8publicclassJavaString4{91011publicstaticvoidchange(Stringstr){12System.out.println("形参的哈希值:"+str.hashCode());131
5、4str="newString";//修改了形参的值15System.out.println("修改后:"+str.hashCode());16}1718publicstaticvoidchange(StringBuffersb){19System.out.println("形参的哈希值:"+sb.hashCode());20sb.append("newStringBuffer");//修改了形参的值21System.out.println("修改后:"+sb.hashCode());22}232425publicst
6、aticvoidmain(String[]args){26Stringstr=newString("GDUTtiantian");27StringBuffersb=newStringBuffer("tiantian");2829System.out.println("修改前:"+str.hashCode());30change(str);3132System.out.println("----------------------------");3334System.out.println("修改前:"+sb.
7、hashCode());35change(sb);36}3738}运行结果:1修改前:-5014512642形参的哈希值:-5014512643修改后:-59570641545----------------------------67修改前:10367820958形参的哈希值:10367820959修改后:1036782095实参String变量传给形参,是传一个地址过去,并没有重新创建一个对象,StringBuffer变量也是这么做;但是,在修改形参的值后,String变量的哈希值发生了改变,StringBuffe
8、r变量的哈希没有发生改变,即String变量指向了一个新建的对象。看看JDK中String类的一段源码(String类的一个构造方法):1/**2*Allocatesanew{@codeString}thatcontainscharactersfromasubarray3*ofthe
此文档下载收益归作者所有