java ==与equals ()

2021-12-10 16:44
182
0
添加收藏

java ==与equals ()

基本区别

equals() 方法和 == 运算符之间的主要区别在于,一个是方法,另一个是运算符。

== 检查两个对象是否指向相同的内存位置,而 .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;
}
其实就是将 两个字符串的每个字符进行比较

 

GC

在 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

 

参考:

https://www.baeldung.com/java-string-pool

https://www.geeksforgeeks.org/difference-equals-method-java/

全部评论