一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
String源码解析-String的使用注意
String的相等判断(==与equals())
看这个小标题应该勾起了大家的回忆,相信很多都会遇到一个面试题或者笔试题:==与equals()有什么区别?
此分析也基本上是围绕这道题展开的,首先贴上String中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;
}
- 首先方法中第一步this == anObject判断了两个对象的内存地址是否相同
- if (anObject instanceof String)对两个对象是否类型一致进行了判断(是否同为String类型)
- if (n == anotherString.value.length)对两个对象中value的长度是否相等做了判断
- 最后的while对value指向的byte数组进行循环比较,判断每个byte是否一致
以上4点也完全解释了equals()方法内部做的事情有哪些,==其实就只是对内存地址的简单比较。到这里其实此道题目也就迎刃而解了。
String的字符替换
此点在实际写代码的时候比较容易碰到,比如:replace()、repalceAll()、repalceFirst(),一个是替换字符/字符串、一个是替换所有字符串、一个是替换匹配到的第一个字符串。
代码说明:
public class Demo {
public static void main(String[] args) {
String s = "where are you";
System.out.println(s.replace('e', 'a'));
System.out.println(s.replaceAll("e", "a"));
System.out.println(s.replaceFirst("e", "a"));
}
}
运行结果:
whara ara you
whara ara you
whare are you
- replace其实替换的是所有匹配到的字符
- repalceFirst只会替换匹配到的第一个字符
- 要删除某个字符,使用replace进行替换即可
- 其中内部的实现基本都是使用正则表达式实现的,但是replaceAll使用的字符串的正则表达式,所以一些特殊符号需要进行转义,分别是:
( [ { / ^ - $ ** } ] ) ? * + .