String的equals() 和 ==

      昨天去面试,笔试题中有一道是 == 的使用,当时我以为的就是判断内存地址是否相同,确实也是,但是没有想到String常量还是蛮特别的。

      以下是摘自网上的解释:

public class StringDemo {

public static void main(String[] args) {
    
    String s1 = "abc";
    String s2 = "abc";
    String s3 = new String("abc");

    System.out.println(s1 == s2);//true
    System.out.println(s1 == s3);//false
    
  }

}

       按照==的语法来看, 首先s1s2s3是三个不同的对象,常理来说,输出都会是false

       然而程序的运行结果确实truefalse

       我们知道一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new 出来的对象和数组。

       然而除此之外还有一块区域叫做常量池。像我们通常想String s1 = "abc"; 这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = "abc"这样一个对象之后,"abc"就存储到了常量池(也可叫做字符串池)中,当我们创建引用String s2 = "abc" 的时候,Java底层会优先在常量池中查找是否存在"abc",如果存在则让s2指向这个值,不会重新创建,如果常量池中没有则创建并添加的池中。

       String的equals()是用来比较字符串内容的。

猜你喜欢

转载自blog.csdn.net/lvdou1120101985/article/details/81062190