目录
1.字符串的比较 (==和equal)
- == 比较基本数据类型:比较的是具体的值
- == 比较引用数据类型:比较的是对象地址值
- String类 : public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写,这是String方法重写了equals的方法,超类object的equals的底层原理就是==。注意注意比较的是两个字符串,StringBuilder不是字符串!!!!!
2. ==案例
test1:常量池共享
package com.itheima.stringmethod;
public class Demo1Equals {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
}
}
结果:
true
解析:常量池共享
test2:常量池和堆内存
package com.itheima.stringmethod;
public class Demo1Equals {
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);
}
}
结果:
false
解析:s1在常量池中,s2在堆内存中
tips:String s2 = new String(“abc”);极其浪费内存,创建了两个对象
test3:字符串加号拼接
package com.itheima.stringmethod;
public class Demo1Equals {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 +"c";
System.out.println(s1 == s3);
}
}
结果:
false
解析:字符串加号拼接时,系统底层是创建StringBuilder对象然后调用append()拼接再通过toString()转换为String类型最后存于堆内存
test4:常量优化机制
package com.itheima.stringmethod;
public class Demo1Equals {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "a"+"b"+"c";
System.out.println(s1 == s2);
}
}
结果:
true
解析:常量优化机制,三个字符串常量相加在编译时拼接为"abc"
3. equals案例
String类 : public boolean equalsIgnoreCase(String s) 比较两个字符串内容是否相同、忽略大小写
代码 :
3.1 test1:equalsIgnoreCase和equals
package com.itheima.stringmethod;
public class Demo1Equals {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ABC";
String s3 = "abc";
// equals : 比较字符串内容, 区分大小写
System.out.println(s1.equals(s2));//flase
System.out.println(s1.equals(s3));//true
// equalsIgnoreCase : 比较字符串内容, 忽略大小写
System.out.println(s1.equalsIgnoreCase(s2));//true
}
}
结果:
false
true
true
3.2 test2:String和StringBuilder之间的equals()
- StringBuilder没有重写equals,StringBuffer同理
public class InterviewTest {
public static void main(String[] args) {
String s1 = "abc";
StringBuilder sb = new StringBuilder("abc");
//1.此时调用的是String类中的equals方法.
//保证参数也是字符串,否则不会比较属性值而直接返回false
System.out.println(s1.equals(sb)); // false
//StringBuilder类中是没有重写equals方法,用的就是Object类中的本质是==.
System.out.println(sb.equals(s1)); // false
}
}