初探java字符串-java开发java经验技巧

初探java字符串-java开发java经验技巧

ID:27818757

大小:469.50 KB

页数:8页

时间:2018-12-06

初探java字符串-java开发java经验技巧_第1页
初探java字符串-java开发java经验技巧_第2页
初探java字符串-java开发java经验技巧_第3页
初探java字符串-java开发java经验技巧_第4页
初探java字符串-java开发java经验技巧_第5页
资源描述:

《初探java字符串-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、初探Java字符串-编程开发技术初探Java字符串廉文出处:蔡晓建String印象String是java屮的无处不在的类,使用也很简单。初学java,就已经有字符串是不可变的盖棺定论,解释通常是:它是final的。不过,String是有字面量这一说法的,这是其他类型所没有的特性(除原牛类型)。另外,九阳中也冇字符串常量池这个说法,用來存储字符串字面量,不是在堆上,而是在方法区里边存在的。字面量和常量池初探字符串对象内部是用字符数组存储的,那么看下面的例子:Stringm二"hello,world";St

2、ringn二"hello,world";Stringu=newString(m);Stringv=newString("hello,world");这些语旬会发生什么事情?大概是这样的:1.会分配一个11长度的char数组,并在常量池分配一个山这个char数组组成的字符串,然后由m去引用这个字符串。2.用n去引用常最池里边的字符串,所以和n引用的是同一个对象。3.生成一个新的字符串,但内部的字符数组引用着m内部的字符数组。4.同样会生成一个新的字符串,但内部的字符数组引用常量池里边的字符串内部的字符数组

3、,意思是和u是同样的字符数组。如杲我们使用一个图来表示的话,情况就大概是这样的(使用虚线只是表示两者其实没什么特别的关系):结论就是,m和n是同一个对象,但m,u,v都是不同的对象,但都使用了同样的字符数组,并且用equal判断的话也会返回true。我们可以使用反射修改字符数组来验证一下效果,可以试试下而的测试代码:©Testpublicvoidtest1()throwsException{Stringm二〃hello,world";Stringn二"hello,world";Stringu=newSt

4、ring(m);Stringv=newString(/zhello,world'O;Fieldf二m.getCleiss().getDeclaredField(〃value〃);f.setAcccssiblc(true);char[]cs=(char[])f.get(m);cs[0]='H';Stringp二〃Hello,world";Assert.asscrtEquals(p,m);Assert・assertEquals(p,n);Assert.assertEquals(p,u);Assert.ass

5、ertEquals(p,v);}从上面的例子可以看到,经常说的字符串是不可变的,其实和其他的final类还是没什么区别,述是引用不可变的意思。虽然String类不开放value,但同样是可以通过反射进行修改,只是通常没人这么做而已。即使是涉及”修改”的方法,都是通过产生一个新的字符串对象來实现的,例如replace、toLower>concat等。这样做的好处就是让字符串是一个状态不可变类,在多线程操作时没有后顾之忧。当然,在字符串修改的时候,会产生一个新的对彖,如果执行很频繁,就会导致大量对彖的创建,

6、性能问题也就随之而来了。为了应付这个问题,通常我们会采用StringBuffer或StringBu订der类来处理。另外,字符串常量通常是在编译的时候就确定好的,定义在类的方法区里边,也就是说,不同的类,即使用了同样的字符串,述是属于不同的对象。所以才需要通过引用字符串常量来减少相同的字符串的数量。可以通过下面的代码来测试classA{publicvoidprint(){System.out・printlnC'hcllo");classB{publicvoidprint(){Strings="hello

7、";//修改s的笫一个字符为HSystem,out.printin(,,hello/,);//输出HellonewA().print();//输出hello字符串操作细节String类内部处理有个字符数组之外,还使用偏移位置offset和长度count,通过offset和count來确定字符数组的一部分,这部分才是这个字符申的真正的内容。例如,有substring这个常用方法,看下面的例子:Stringm="hello,world";Stringu=m.substring(2,10);Stringv二u

8、.substring(4,7);按照上面的说法,的数据结构就如下图所示:可以发现,m,n,V是三个不同的字符串对象,但引用的value数组其实是同一个。同样可以通过上述反射的代码进行验证,这里就不详述了。但字符串操作时,可能需要修改原来的字符串数组内容或者原数组没法容纳的时候,就会使用另外一个新的数组,例replace,concat,4-等操作。另外,oracle的JDK实现屮,String的构造方法,对于字符串参数只是引用部分字符数组的情

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。