简单概括常见的两类
比字符串时 equals比较的是内容,==比较地址
比较数值时 equals无法比较基本数据类型,==比较的是内容
eg.比较数值时
public static void main(String[] args){
int num1=100;
int num2=100;
System.out.println(num1==num2);//ture,比内容都是100
System.out.println(num1.equals(num2));//编译器显示错误,无法运行
}
eg.比较字符串时
public static void main(String[] args){
String s1="abcd";
String s2="abcd";
System.out.println(s1==s2);//true,比地址值,s1和s2都指向栈内的同一个地址值
System.out.println(s1.equals(s2));//true,比内容都是abcd
}
new对象,开辟新的堆
public static void main(String[] args){
String s1="abcd";
String s2="abcd";
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
String s3 = new String("abcd");
String s4 = new String("abcd");
System.out.println(s3 == s4); //false,比地址值:s3和s4在堆内存中的地址值不同
System.out.println(s1 == s3); //false,比较地址值:s1在栈中,s3在堆中,两者的内存中的地址值不同
System.out.println(s3.equals(s4)); //ture,equals比较的是内容,s3和s4的内容相同
}
s1
和s2
的关系:
s1
和s2
都是通过字符串字面值创建的,它们在栈内存中具有相同的引用地址。- 因为它们都具有相同的值 "abcd",Java 字符串常量池会将它们合并为同一个字符串对象,所以它们的内存地址相同。
s3
和s4
的关系:
s3
和s4
都是通过使用new
关键字显式创建的字符串对象,因此它们在堆内存中分别被创建。- 尽管它们具有相同的值 "abcd",但由于使用了
new
关键字,它们在堆内存中有不同的内存地址。总结:
s1
和s2
具有相同的栈内存地址,因为它们共享相同的字符串常量。s3
和s4
分别位于堆内存中,它们具有不同的堆内存地址,因为它们通过new
创建的对象是独立的。