String类常见题目:
1.判断定义为String类型的s1和s2是否相等
String s1="abc";
String s2="abc";
System.out.println(s1==s2); true
//mian方法进栈,mian方法下有String s1和String s2,常量池有s1(“abc”),s2指向常量池同一个值(“abc”),所以s1==s2
//常量池的特点:常量池中没有这个对象,就创建一个;有这个对象,就直接使用
System.out.println(s1.equals(s2)); true,因为equals只比较对象的序列,都是abc所以一样。==号比较的是地址值。
2.下面这句话在内存中创建了几个对象?
String s1=new String("abc"); 2个
2个,一个在常量池,一个在堆内存,两个地址值不一样
3.判断定义为String类型的s1和s2是否相等
String s1=new String("abc");
String s2="abc";
System.out.println(s1==s2); false,因为s1是堆内存的地址值,s2是常量池的地址值
System.out.println(s1.equals(s2)); true
4.判断定义为String类型的s1和s2是否相等
String s1="a"+"b"+"c";
String s2="abc";
System.out.println(s1==s2); true。,在编译时就变成了"abc",java中有常量优化机制
System.out.println(s1.equals(s2)); true
5.判断定义为String类型的s1和s2是否相等
String s1="ab";
String s2="abc";
String s3=s1+"c";
System.out.println(s1==s2); false
System.out.println(s1.equals(s2)); true
延伸:
"=="和equal()的区别:
相同点:都可以做比较,返回值都是boolean
区别:
a.==是比较运算符,既可以比较引用数据类型,也可以比较基本数据类型。基本数据类型比较的是值,引用数据类型比较的是地址值(hashcode)。
b.equal()未重写,依赖==,比较的是hashcode。重写后的equal比较的是对象的属性值。
c.equal()只能比较引用数据类型(因为equal()是方法,需要对象调用)