一个朋友发布了这样一条微博:
蛋疼的String啊……虽然我之前注意到Java会利用String的不可变性在subString 的时候利用原Stirng的char数组和偏移量创建新的String,但是这还导致了split也一样是浅拷贝。如果想容一个超长的Stirng里 cut出一小部分,其实本体char数组都还在那个小部分里面留着,有撒方法能获取纯净的String吗……
出于好奇,我查看了一下String的代码,原来在String中用一个char[]数组来保存一段字符串,offset表示一个位移值,count表示字符串的长度。从char[]数组中的第offset开始,连续的count个字符就组成了这个字符串。比如说,如果char[]中存储的是”abcdefg”,offset是1,count是3,那么这个字符串就是“bcd”。
对于一个原始字符串我debug了一下String的subString()和Split()两个函数,得知在通过这两个方法返回的String都保存了原始字符串中char数组,通过offset和count来得到最终的字符串。的确,和我想象的很不一样。
查看了一下subString()的代码,和String(orgString)这个拷贝函数,发现String(orgString)这个拷贝函数会返回一个“纯净”的String。于是,我回复:
我倒有个办法,不如调用new String(subString)在得到的subString上再创建一个string吧,这是一个深拷贝。如果嫌效率低,不如自己用 Arrays.copyOfRange()自己写一个subString()的方法。
最后,他给我发了一个链接:String.split() will keep original char array inside
嗯,也给出了两种方法:1.使用构造函数;2.自己实现。