我在学习《Java基础》String类是遇到以下的问题,希望能够帮助大家。
大家都知道==和equals()两种方式都能对字符进行比较,他们的区别之处就是:
1.equals()方法用于比较两个字符串中的字符是否相等;
2.==方法用于两个字符串对象的地址是否相同;
以下两种代码会让大家更加清楚了解其中的细节:
代码一:
public class E05{
public static void main(String[] args){
String s1 = "String";
String s2 = "String";
System.out.println("判断两个字符串是否相等"+s1.equals(s2));
System.out.println("判断两个字符串是否相等"+(s1==s2));//此处有疑问
}
}
代码二:
public class D5{
public static void main(String[] args){
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println("判断两个字符串是否相等"+s1.equals(s2));
System.out.println("判断两个字符串是否相等"+(s1==s2));//此处有疑问
}
}
大家就会有疑问,为什么关于(==方法)代码一的运行结果与代码二的运行结果不一样呢?
答案:字符串“abc”和“new String('abc')”其实在内存中存储的形式是不同的。 字符串“abc”存放在常量区,String a ="abc'时,a指向的是常量区中“abc”字符串,String b= “abc”的时候,b指向的也是同一个字符串,所以a,b无论从内容还是内存地址指向的都是同一个,所以为true。 而使用String s1 = new String(“abc”)的时候,s1指向的并不是常量区中的“abc”,而是指向new String这个对象,new 出来的String 再指向 常量区中的“abc”,所以使用equals比较s1和s2的内容也就是值的时候是true,使用==比较s1和s2指向的内存地址的时候是false。