在声明期间在 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
foo2
和 bar2
将指向相同的文字,因此将是 'equal'(在 ==
的意义上)。有关详细信息,请参阅 here。
不过,您永远不应该依赖它。始终在字符串
上使用 equals
继承了现有的代码库,无法联系到原始开发者。
我知道对于一个普通的 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
foo2
和 bar2
将指向相同的文字,因此将是 'equal'(在 ==
的意义上)。有关详细信息,请参阅 here。
不过,您永远不应该依赖它。始终在字符串
上使用equals