java基础总结--equals与==

java

equals 与 ==

先上一段经典代码

public static void main(String[] args) {

// TODO Auto-generated method stub

int n=3;

int m=3;

System.out.println(n==m);

String str = new String("hello");

String str1 = new String("hello");

String str2 = new String("hello");

System.out.println(str1==str2);

str1 = str;

str2 = str;

System.out.println(str1==str2);

}

输出结果为true,false,true

==比较的是变量本身的值,而equal比较的是变量所指的内容

怎么理解这句话呢?

对于八种基本数据类型变量,本身的值就是内容,存储在栈中;而引用类型变量在栈中存储的是变量所指的地址,对象实例存储在堆中。str1和str2是指向两个字符串变量,所以值不同。

再来看看equals方法是如何比较所指向对象的内容。

equals方法是Object基类中定义的方法,它本身是用来比较对象的内存地址是否相同,一些子类重写它以后,就可以用来比较对象的内容,比如String类就重写了这个方法。

Object类中equals方法

public boolean equals(Object obj) {  

return (this == obj);

}

String类中equals方法

public boolean equals(Object anObject) {  

if (this == anObject) {

return true;

}

if (anObject instanceof String) {

//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;

}

其中value是String类定义的,用于存放字符串的字符数组
private final char value[];

再来看一个特殊情况

public static void main(String[] args){    

String s1="hello";

String s2="hello";

String s3 = new String("hello");

System.out.println(s1==s3);

System.out.println(s1==s2);

}

输出false,true

输出true是因为java的字符串缓冲区,类似于常量池的东西,这样创建的String不是一个新的对象,因为java发现已经有一个"hello",就会将s2直接指向它,而不会创建一个新的对象。

以上是 java基础总结--equals与== 的全部内容, 来源链接: utcz.com/z/391587.html

回到顶部