首先要了解一下Java中的存储机制(栈,堆,常量池)
public class TestDemo_01 {
//执行main()方法,在栈中分配一块内存空间
public static void main(String[] args) {
/**
声明基本数据类型
在栈中分配一块内存,直接存放值
*/
int num = 10;
/**
字符串特殊理解
首先也是在栈中分配一块内存
然后,会先去看常量池中有没有"Test"
如果有就直接将地址存入str变量的栈内存
如果没有就在常量池中新建,再将地址存入str变量的栈内存
注:常量池中的数据是唯一的,不可重复的
*/
String str = "Test";
/**
首先仍然是在栈中分配一块内存
出现new关键字时,在堆中分配一块内存,同时将堆的地址存入栈中
然后,查看常量池中是否存在"Test"
存在则将地址存入堆内存中
否则,新建再存入堆内存
注:这里的String换成其他引用类型也是类似
字符串特别处理,基本数据类型直接存值
*/
String strObj = new String("Test");
}
1、 == 比较的是两个变量或者实例是不是指向同一片内存空间;
equals()比较的是两个变量或者实例指向的内存空间的值是不是相同
2、 == 值引用是否相同;equals()指值是否相同
3、 == 一般用于比较基本数据类型;equals()一般用于比较引用数据类型
上个面试题
String str1 ="我爱中国china";
String str2 ="我爱中国china";
String str3 ="我爱中国CHINA";
String str4 =new String("我爱中国china");
String str5 =new String("我爱中国china");
System.out.println(str1==str2);//true
System.out.println(str4==str5);//false
System.out.println(str1==str4);//false
System.out.println("----------------");
System.out.println(str1.equals(str2));//内容true
System.out.println(str4.equals(str5));//内容true
System.out.println(str1.equals(str4));//内容true
System.out.println(str1.equals(str3));//false
System.out.println(str1.equalsIgnoreCase(str3));//true
System.out.println(str1.compareTo(str2));//0
System.out.println(str1.compareTo(str3));//32
System.out.println(str3.compareTo(str1));//-32
System.out.println(str1.compareToIgnoreCase(str3));//0