大家好,最近呢本人也是在面试,顺便记录一些让我们如何拿到高薪offer的经验和技巧,在我个人觉得,想要面试官对你满意,那就是关于一个问题,你能举一反三甚至往更多,这就要求我们必须对源码的掌握,你对源码掌握的深度,才能更明显的体现你到底是不是货真价实,我只是做一些整理,希望能够帮到需要的人。
几乎所有的Java面试,都是String开始的,第一印象非常重要,所以对于String的知识,我们必须深入的掌握才能为自己赢得更多的筹码
1.String是如何实现的?
以主流的JDK1.8来说,String的内部存储结构为char数组 ,源码如下:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
//用于存储字符串的值
private final char value[];
//缓存字符串的hash code
private int hash; // Default to 0
//其他内容
}
2.String常用有哪些构造方法?
①以String为参数的构造方法
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
②以char[]为参数的构造方法
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
③以StringBuffer为参数的构造方法
public String(StringBuffer buffer) {
synchronized(buffer) {
this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
}
}
④以StringBiulder的构造方法
public String(StringBuilder builder) {
this.value = Arrays.copyOf(builder.getValue(), builder.length());
}
其中我们比较忽略的是StringBuffer和StringBuilder为参数构造方法,因为三种数据类型,我们通常都是单独使用,所以我们要注意一下这里。
3.equals()比较两个字符串是否相等
源码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
String类型重写了Object中的equals()方法,equals()方法需要传递一个Object类型的参数值,在比较时会先通过instanceof判断是否为String类型,如果不是的话则会直接返回false,当判断参数为String类型之后,会循环对比两个字符串中的每个字符,当都一样时返回true,否则返回false。
还有一个比较类似的方法equalslgnoreCase(),他是用来忽略字符串大小写之后进行对比的。
3.compareTo比较两个字符串
我们看源码:
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
可以看出,compareTo()方法会循环对比所有的字符,当两个字符中有任意一个字符不同时,则return char1-char2。
比如两个字符串分别存储的是1和2,返回值是-1,如果存储是1和1,则返回0,如果是2和1,则返回1。
还有一个类似的方法是compareTolgnoreCase(),用于忽略大小写比较。
小结:
可以看出上面两个方法都用于比较字符串,但他们的不同点:
- equals()可以接收一个Object类型的参数,而compareTo()只能接收String的参数;
- equals()返回值为Boolean,而compareTo返回int;
他们都用于字符串比较,当equals返回true或者compareTo返回0时,则表示字符串完全相同。
4.其他重要方法
- indexOf():查询字符串首次出现的下标位置
- lasIndexOf():查询字符串最后出现的下标位置
- contains():查询字符串中是否包含另一个字符串
- toLowerCase():把字符串全部转换为小写
- toUpperCase():把字符串全部转换为大写
- length():查询字符串长度
- trim():去掉字符串首尾空格
- replace():替换字符串中某些字符
- split():把字符串分割并且返回数组
- join():把字符串数组转换为字符串
总结:String源码属于Java源码中最基础最基本的源码,你对Java源码的理解,侧面可以反应了你是否热爱和喜欢专研程序,也反应了你的Java功底,String的问题如果在延伸一下,会有更多的细节,通常关联一下问题:
- 为什么String用final修饰
- ==和equals的区别
- String,StringBuffer,StringBuilder的区别
- String的intern()的真正含义
- String类型在JVM(Java虚拟机)中如何存储,编译器对String做了哪些优化
带着这些问题,我们下期再烂看看这些知识点的真正答案,我们,下期再会!