- package basic;
- public class StringTest {
- private static void test3() {
- String s1 = new String("Hello");
- String s2 = new String("Hello");
- String s3 = "Hello";
- String s4 = "Hello"; //1
- System.out.println(s1 == s2);
- System.out.println(s3 == s4);
- System.out.println(s1 == s3);
- }
- public static void main(String[] args) {
- test3();
- }
- }
输出为:
false
true
false
理由如下:
如果通过直接指定字符串值的方法来创建String对象,它将保存在内存的一个“字符串池”中,而如果“池”中已经存在同样内容的字符串,则将不生成新的字符串,而是直接使用这个已经存在的字符串对象。所以,在行//1中,只是将s4这个变量指向已经存在的对象,也就是s3所指向的对象。因此,在这个时候s3和s4指向的是同一个对象,表达式"s3 == s4"也就等于true了。
对于使用new操作符创建String对象,无论内存中是否已经存在相同内容的对象,它都会在内存中新建一个新的对象。
因此:除非必须,不要使用new操作符来创建字符串对象。在进行字符串内容值比较的时候,应该使用.equals()方法而应该避免使用“==”运算符。