一个程序员的自我成长之路。
equals() 方法和 == 运算符之间的主要区别在于,一个是方法,另一个是运算符。
如果类没有重写equals()将会使用最终父类的Object的equals()方法
牢记上面几点,看过很多博客文章关于此方面的描述,大部分都是举String对象为例,但是java中有字符串池这个概念。
例如:
String constantString1 = "Baeldung";
String constantString2 = "Baeldung";
String newString = new String("Baeldung");
字符串变量
由于Java中字符串的不变性,JVM 可以通过在池中**仅存储每个文字*字符串的*一个副本**来优化为其分配的内存量。
当我们创建一个String变量并为其赋值时,JVM 会在池中搜索一个等值的String。
如果找到,Java 编译器将简单地返回对其内存地址的引用,而不分配额外的内存。
如果没有找到,它将被添加到池中(实习)并返回其引用。
字符串对象
当我们 通过 new 运算符创建 String 时,Java 编译器会创建一个新对象并将其存储在为 JVM 保留的堆空间中。
像这样创建的每个 字符串都将指向具有自己地址的不同内存区域。
Object类和string都有equals()方法
// Object类
public boolean equals(Object obj) {
return (this == obj);
}
方法的本质就是 == 方法,也就是比较引用地址是否相同
// String类
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;
}
其实就是将 两个字符串的每个字符进行比较
在 Java 7 之前,JVM将 Java String Pool 放置在*PermGen*空间中,该空间具有固定大小——它不能在运行时扩展并且不符合垃圾收集条件。
在PermGen(而不是Heap)中实习Strings的风险是,如果我们实习太多Strings,我们可能会从 JVM 中得到*OutOfMemory***错误**。
从 Java 7 开始,Java String Pool存储在*Heap*空间中,由 JVM 进行垃圾回收*。这种方法的优点是降低了*OutOfMemory*错误的风险,因为未引用的字符串*将从池中删除,从而释放内存。
在java7中,可以通过某些指令来控制这个池的大小
-XX:StringTableSize=4901
参考:
全部评论