在声明期间在 bean 中创建新字符串的目的?

Purpose of creating new Strings in a bean during declaration?

继承了现有的代码库,无法联系到原始开发者。

我知道对于一个普通的 Java bean,你有变量声明、getter 和 setter。

public class FooBean{
    private String foo;
    private String bar;

    // getters and setters
}

但是在这段代码中,我注意到所有的字符串都被初始化了。

public class FooBean{
    private String foo = new String();
    private String bar = new String();

    // getters and setters
}

处理这个 bean 的代码没有任何特殊的特殊情况,它似乎与删除的初始化完全相同。

这样创作有理由吗?它有某种我没有意识到的副作用吗?

它不会阻止将字段设置为 null,因此在任何一种情况下都需要进行相同类型的值检查。

考虑到没有理由使用 new String(); 而不是 ""(在这种情况下,可能会有一些极端情况,您需要不同的空字符串),这可能只是一个坏习惯他在某个地方学到了东西。

它只是给出了一个初始的非空值。

不过最好写成

private String foo = "";
private String bar = "";

由于不需要创建新的String对象,最好重用字符串池中的空字符串实例。

创建字符串对象有哪些不同的方法?

我们可以像任何普通的 java class 一样使用新运算符 创建字符串对象 或者我们可以使用双引号(文字赋值)创建一个字符串对象。

String class 中可用的构造函数太多,无法从 char 数组、字节数组、StringBuffer 和 StringBuilder 等中获取 String

你的问题:

当我们使用双引号创建一个字符串时,JVM 会在字符串池中查找是否有任何其他字符串存储有相同的值。如果找到,它只是 return 对该 String 对象的引用,否则它会创建一个具有给定值的新 String 对象并将其存储在 String 池中。

当我们使用new运算符时,JVM会创建String对象但不会将其存储到String Pool中。我们可以使用 intern() 方法将 String 对象存储到 String 池中,或者 return 如果池中已经存在具有相同值的 String 则引用。

所以当你这样做时

String s1 = "abc";
String s2 = "abc";

那些在 StringPool 中被检查并且由于 s1 已经存在,s2 将采用相同的引用,因此,s1 ==s2 是正确的。

但是当你这样做时:

String s3 = new String("abc");
String s4 = new String("abc"); 

您正在使用 new 运算符,因此 JVM 不会检查堆中是否已有字符串,它只会分配一个 new space 对于 s4,s3==s4 也是如此???当然没有。

请查看下图以获得更说明性的示例。

不,这真的没有意义。在简单文字 "" 上使用 String 构造函数通常是不好的做法。 foo = new String()foo = "" 之间有一个小但重要的区别:

String foo1 = new String();
String bar1 = new String();
System.out.println(foo1 == bar1);

String foo2 = "";
String bar2 = "";
System.out.println(foo2 == bar2);

这个输出将是

false
true

foo2bar2 将指向相同的文字,因此将是 'equal'(在 == 的意义上)。有关详细信息,请参阅 here

不过,您永远不应该依赖它。始终在字符串

上使用 equals