当比较 2 个字符串时,实际上会发生什么?我们如何确定字符串A中的内容等于字符串B?我们是否在 unicode 字符表中查找两个字符串的元素之间的比较?如果是,那么 equals() 如何知道像“ABC”这样的字符串中的元素,equal() 如何将 A 与 BC 分开以将其与其他字符串的第一个元素进行比较?
最佳答案
字符串基本上是 char[]
的不可变包装器,具有许多有用的实用方法。
因此,要检查两个字符串是否相等,您只需检查它们是否都有相同大小和内容的 char
数组。
使用Arrays
类,它具有处理数组的有用方法,简化的 String
实现可能如下所示:
public final class String {
private char[] value;
public String(char[] value) {
this.value = value.clone();
}
@Override
public boolean equals(Object obj) {
if (! (obj instanceof String))
return false;
String other = (String) obj;
return Arrays.equals(this.value, other.value);
}
@Override
public int hashCode() {
return Arrays.hashCode(this.value);
}
public char[] toCharArray() {
return this.value.clone();
}
public String substring(int beginIndex, int endIndex) {
return new String(Arrays.copyOfRange(this.value, beginIndex, endIndex));
}
// more utility methods
}
真正的String
类更复杂,具体取决于Java版本。
例如在早期版本中,char[]
可以由多个 String
对象共享,因此例如substring()
不需要复制数组。
在更高版本中,优化已更改为在可能的情况下将字符存储在 byte
( LATIN1 ) 数组中,而不是 char
( UTF-16 ) 数组,以节省空间。
这些不同的优化当然会使 String
实用方法的内部代码变得复杂,这可能是您在查看 JDK 源代码时感到困惑的地方。
关于java - 如何比较字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52322493/