面试官Q1:请问String常见的方法有哪些,列举几个?
String是我们开发中使用频率最高的类,它有哪些方法,大家一定不会陌生,例如:
-
length();//计算字符串的长度
-
charAt();//截取一个字符
-
getChars();//截取多个字符
-
equals();//比较两个字符串
-
equalsIgnoreCase();//比较两个字符串,忽略大小写
-
startsWith();//startsWith()方法决定是否以特定字符串开始
-
endWith();//方法决定是否以特定字符串结束
-
indexOf();//查找字符或者子串第一次出现的地方。
-
lastIndexOf();//查找字符或者子串是后一次出现的地方。
-
substring();//截取字符串
-
concat();//连接两个字符串
-
replace();//替换
-
trim();//去掉起始和结尾的空格
-
valueOf();//转换为字符串
-
toLowerCase();//转换为小写
-
toUpperCase();// 转换为大写
但是像replace(),substring(),toLowerCase()这三个方法需要注意一下,我们看下下面一段代码:
import java.util.*; public class StringTest { public static void main(String[] args){ String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1', '0'); System.out.println("ss = " + ss); } }
打印结果:
ss = 123456
ss = 123456
如果你不了解replace方法的源码,可能会认为最后的打印结果为 "ss = 023456",但是实际上方法内部创建了一个新的String对象,并将这个新的String对象返回。对ss是没有做任何操作的,我们也知道String是不可变的嘛。源码如下:
public String replace(char oldChar, char newChar) { // 判断替换字符和被替换字符是否相同 if (oldChar != newChar) { int len = value.length; int i = -1; // 将源字符串转换为字符数组 char[] val = value; /* avoid getfield opcode */ while (++i < len) { // 判断第一次被替换字符串出现的位置 if (val[i] == oldChar) { break; } } // 从出现被替换字符位置没有大于源字符串长度 if (i < len) { char buf[] = new char[len]; for (int j = 0; j < i; j++) { // 将源字符串,从出现被替换字符位置前的字符将其存放到字符串数组中 buf[j] = val[j]; } while (i < len) { char c = val[i]; // 开始进行比较;如果相同的字符串替换,如果不相同按原字符串 buf[i] = (c == oldChar) ? newChar : c; i++; } // 使用String的构造方法进行重新创建String return new String(buf, true); } } return this; }
方法内部最后重新创建新的String对象,并且返回这个新的对象,原来的对象是不会被改变的。substring(),toLowerCase()方法也是如此。
还有诸如contact()方法,源码如下:
public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); str.getChars(buf, len); return new String(buf, true); }
从上可知参数str不能为null,否则就会包空指针异常。用contact()拼接字符串速度也很快,因为直接Arrays.copyOf,直接内存复制。
面试的时候,如果能对一些方法有自己的认识,看过底层源码,对于面试官来说会有比较深刻的印象!