Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在声明期间在bean中创建新字符串的目的是什么?_Java_Javabeans - Fatal编程技术网

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

Java 在声明期间在bean中创建新字符串的目的是什么?,java,javabeans,Java,Javabeans,继承了现有代码库,无法联系原始开发人员 我知道对于普通的Javabean,您有变量声明、getter和setter public class FooBean{ private String foo; private String bar; // getters and setters } 但是在这段代码中,我注意到所有字符串都是初始化的 public class FooBean{ private String foo = new String(); p

继承了现有代码库,无法联系原始开发人员

我知道对于普通的Javabean,您有变量声明、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,因此在任何情况下都需要进行相同的值检查。

考虑到没有理由使用新字符串;在这种情况下,可能会出现一些边缘情况,您需要不同的空字符串,这可能只是他在某个地方学到的一个坏习惯。

考虑到没有理由使用新字符串;而不是在这种情况下,在某些边缘情况下,您需要不同的空字符串,这可能只是他在某个地方学到的一个坏习惯。

它只给出一个初始非空值

但最好还是写下来

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

因为不需要创建新的字符串对象,所以最好重用字符串池中的空字符串实例。

它只给出一个初始非空值

但最好还是写下来

private String foo = "";
private String bar = "";
由于不需要创建新的字符串对象,因此最好重用字符串池中的空字符串实例。

创建字符串对象的不同方法有哪些? 我们可以像任何普通java类一样使用新操作符创建String对象,也可以使用双引号文本赋值来创建String对象

String类中有太多的构造函数,无法从char数组、byte数组、StringBuffer和StringBuilderetc等获取字符串

关于你的问题: 当我们使用双引号创建一个字符串时,JVM在字符串池中查找是否有其他字符串以相同的值存储。如果找到,它只返回对该字符串对象的引用,否则它将创建一个具有给定值的新字符串对象,并将其存储在字符串池中

当我们使用新操作符时,JVM创建字符串对象,但不将其存储到字符串池中。我们可以使用intern方法将字符串对象存储到字符串池中,或者如果池中已经存在一个值相等的字符串,则返回引用

所以当你这么做的时候

String s1 = "abc";
String s2 = "abc";
这些都是在StringPool中检查的,由于s1已经存在,s2将采用相同的引用,因此s1==s2为真

但当你这样做的时候:

String s3 = new String("abc");
String s4 = new String("abc"); 
您使用的是new操作符,因此JVM不会检查堆中是否已经存在字符串,它只会为s4分配一个新空间,那么s3==s4???当然不是

请看下图,了解更多说明性示例

创建字符串对象的不同方法有哪些? 我们可以像任何普通java类一样使用新操作符创建String对象,也可以使用双引号文本赋值来创建String对象

String类中有太多的构造函数,无法从char数组、byte数组、StringBuffer和StringBuilderetc等获取字符串

关于你的问题: 当我们使用双引号创建一个字符串时,JVM在字符串池中查找是否有其他字符串以相同的值存储。如果找到,它只返回对该字符串对象的引用,否则它将创建一个具有给定值的新字符串对象,并将其存储在字符串池中

当我们使用新操作符时,JVM创建字符串对象,但不将其存储到字符串池中。我们可以使用intern方法将字符串对象存储到字符串池中,或者如果池中已经存在一个值相等的字符串,则返回引用

所以当你这么做的时候

String s1 = "abc";
String s2 = "abc";
这些都是在StringPool中检查的,由于s1已经存在,s2将采用相同的引用,因此s1==s2为真

但当你这样做的时候:

String s3 = new String("abc");
String s4 = new String("abc"); 
您使用的是new操作符,因此JVM不会检查堆中是否已经存在字符串,它只会为s4分配一个新空间,那么s3==s4???当然不是

请看下图,了解更多说明性示例


不,这没有什么意义。在简单的文本上使用字符串构造函数通常是不好的做法。 foo=新字符串和foo=尽管之间有一个很小但很重要的区别:

这个的输出将是

false
true
foo2和bar2将指向相同的文本,因此在==的意义上是“相等的”。有关详细信息,请参阅


不过,你永远不应该依赖这个。总是在字符串上使用equals

不,这没有什么意义。在简单的文本上使用字符串构造函数通常是不好的做法。 foo=新字符串和foo=尽管之间有一个很小但很重要的区别:

这个的输出将是

false
true
foo2和bar2将指向相同的灯光 因此,在==的意义上是“相等的”。有关详细信息,请参阅


不过,你永远不应该依赖这个。始终在字符串上使用equals

不需要使用new关键字创建字符串对象。我认为这很荒谬。不需要使用new关键字创建字符串对象。我认为这是荒谬的。所有的答案都很有价值,但我觉得这对未来的人们来说是最有用的。请不要在多个答案上复制和粘贴相同的答案。如果所有问题的答案都相同,则将其标记为重复问题。如果他们没有,请根据手头的具体问题写一个答案。tnsk对于评论,我知道这个主题,所有的答案都是有价值的,但我觉得这对未来的人来说是最有用的。请不要在多个答案中复制和粘贴同一个答案。如果所有问题的答案都相同,则将其标记为重复问题。如果他们没有回答,请根据手头的具体问题写一个答案。我知道这个话题,