1 public String replace(char oldChar, char newChar) { 2 if (oldChar != newChar) { 3 int len = value.length; 4 int i = -1; 5 char[] val = value; /* avoid getfield opcode */ 6 7 while (++i < len) { 8 if (val[i] == oldChar) { 9 break; 10 } 11 } 12 if (i < len) { 13 char buf[] = new char[len]; 14 for (int j = 0; j < i; j++) { 15 buf[j] = val[j]; 16 } 17 while (i < len) { 18 char c = val[i]; 19 buf[i] = (c == oldChar) ? newChar : c; 20 i++; 21 } 22 return new String(buf, true); 23 } 24 } 25 return this; 26 }
该代码的逻辑为:
1、首先查找字符串中是否有需要替换的字符,并记录此位置为i
2、接下来判断是否存在,如果i的值字符串长度说明此字符串不包含需要被替换的字符,则直接返回原字符串的引用
3、如果存在需要替换的字符,则开辟新的空间并将i之前的字符串复制到新开辟的空间中,之后对i及之后的字符串进行判断后复制
4、构建新的String对象并返回
给我的提示:
1、replace方法并不会每次都构建新的String对象
2、String对象所代表的字符串是保存在一个char[]数组中,为final,但是保存的内容并不是不可变的(通过反射)
3、改实现首先判断是否存在需替换的字符,然后在需要的时候才进行内存的开辟和对象的构建,提高了代码的效率,减少了内存的消耗
4、编码过程中对于一个需求的实现,首先分析未发生该事件时的处理办法,然后基于分析完成后续的编码
原文:http://www.cnblogs.com/NightTassel/p/4966332.html