java string ==和equals的使用

Posted gc65

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java string ==和equals的使用相关的知识,希望对你有一定的参考价值。

 

 1 package com.example.base.string;
 2 
 3 public class MyStringTest 
 4 
 5     public static void main(String args[]) 
 6         testString();
 7     
 8     
 9     private static void testString() 
10         String hello = "Hello";
11         String hello2 = new String("Hello");
12         String lo = "lo";
13         //false. ==比较的是引用.hello是一个字符串常量表达式,并实现为调用interned,以共享不同的示例(string pool)
14         //hello2是一个对象,指向的是堆上的一个地址
15         System.out.println(hello == hello2);            //false
16         //true. equals比较的是两个对象的值
17         System.out.println(hello.equals(hello2));       //true
18         //true. intern()会检查当前字符串池是否包含这个字符串。包含则返回池中的字符串,否则将字符串对象添加到池中,并返回该字符串对象的引用
19         //(最终结果就是返回一个指向常量池字符串的引用)
20         System.out.println(hello == hello2.intern());   //true
21         //true. 两个都是常量表达式(编译时确定的),都是指向字符串池的引用
22         System.out.println(hello == "Hello");           //true
23         //true. 不同类下的两个常量表达式,依然是指向同一个字符串池的引用
24         System.out.println(Other.hello == hello);       //true
25         //true. 不同包下的两个常量表达式,依然是指向同一个字符串池的引用
26         //System.out.println(com.example.base.string.other.Other.hello == hello);     //true
27         //true. 两个都是常量表达式,都是指向字符串池的引用
28         System.out.println(hello == ("Hel" + "lo"));    //true
29         //false.  后者不是常量表达式,是运行时通过串联计算的字符串(lo是一个对象,不是常亮"xxx"),会新建对象
30         System.out.println(hello == ("Hel" + lo));      //false
31         //true. 将新对象intern()会返回指向字符串池的引用
32         System.out.println(hello == ("Hel" + lo).intern());     //true
33     
34 
35 class Other 
36     static String hello = "Hello";
37 

 

以上是关于java string ==和equals的使用的主要内容,如果未能解决你的问题,请参考以下文章

java:String使用equals和==比较的区别

java中String的equals()和 ==

关于java中equals方法的疑惑

java中equals和equalsignorecase的区别

java中equals和equalsignorecase的区别

强烈推荐浅谈Java中String.equals()和==的区别