String比较字符串方法
==
比较两个字符串的地址值
如果两个字符串都是通过new操作(存入堆内存),即使内容一样,地址值不同,返回false;
String s = new String("字符串");
String sc = new String("字符串");
System.out.println(sc == s); // false
如果两个字符串都只是常量池设置的字符串,内容一样,地址值相同,返回true;
String s = "字符串";
String sc = "字符串";
System.out.println(sc == s); // true
如果两个字符串,一个是new操作的,一个是常量池,即使内容一样,地址值不同,返回false;(堆内存和常量池)
String s = "字符串";
String sc = new String("字符串");
System.out.println(sc == s); // false
如果常量字符串引用new操作字符串,内容一样,地址值相同,返回true;()
String sc = new String("字符串");
String s = sc; // 常量池引用new操作的字符串
System.out.println(sc == s); // true
如果常量字符串引用常量字符串,内容一样,地址值相同,返回true;(都在常量池)
String sc = "字符串";
String s = sc; // 常量池引用常量
System.out.println(sc == s); // true
如果new操作字符串引用另一个new操作的字符串值,即使内容一样,地址值不同,返回false;(本质都在堆内存,同第一个案例)
String sc = new String("字符串");
String s = new String(sc); // new操作字符串引用另一个new操作的字符串
System.out.println(sc == s); // false
如果new操作字符串引用常量字符串,即使内容一样,地址值不同,返回false;(同第三个案例)
String sc = "字符串";
String s = new String(sc); // new操作字符串引用常量字符串
System.out.println(sc == s); // false
equlse
底层也是地址值,重写该方法比较两个字符串内容是否相同
equalsIgnoreCase
在equlse基础上忽略大小写
contentEquals
直接比较字符串内容是否相同