一个朋友发布了这样一条微博:
蛋疼的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.自己实现。
英文原文:http://www.eclipse.org/swt/faq.php 版本:Version 1.0
The SWT FAQ
- 7.问: 怎样为我的平台编译Eclipse执行文件?
- 答:Eclipse是被二进制可执行文件加载。执行二进制文件后,它弹出进度画面,加载虚拟机。对于不同的窗口系统、操作系统和硬件构架,我们必须为之编译不同的二进制文件。要么从CVS代码库编译,要么从下载的eclipse SDK编译。 阅读全文 »
由于代码每天都会更新,编译组每天晚上会针对当天的代码编译出一个新的Build(除非编译不通过),而测试组第二天早上都会安装前一天晚上编译出的Build进行测试。
一直以为测试组每天都手动地重复着这些枯燥无味的卸载、安装工作,直到同组的一个同事告诉我,测试组每天的卸载和安装工作都是通过脚本自动实现的,无需人为干预。 阅读全文 »