Java 在声明期间在bean中创建新字符串的目的是什么?
继承了现有代码库,无法联系原始开发人员 我知道对于普通的Javabean,您有变量声明、getter和setterJava 在声明期间在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
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对于评论,我知道这个主题,所有的答案都是有价值的,但我觉得这对未来的人来说是最有用的。请不要在多个答案中复制和粘贴同一个答案。如果所有问题的答案都相同,则将其标记为重复问题。如果他们没有回答,请根据手头的具体问题写一个答案。我知道这个话题,