String obj = null;
obj= new String("Samuel");
//vs
String obj = null;
obj="Samuel";
这两种初始化String的方法有什么区别吗?
答案 0 :(得分:7)
是。并且总是喜欢第二种选择。
第一个创建一个不必要的字符串实例。字符串文字(字符串周围的两个引号)自己创建一个字符串对象。然后,如果您使用第一个选项,则会创建另一个不必要的实例。
当您仅使用字符串文字(第二个选项)时,jvm使用一个表来存储规范字符串对象。因此,对于使用"Samuel"
声明的所有字符串,JVM中只有一个实例。但是如果使用String(str)
构造函数,则会有更多实例,这意味着更多内存。
在评论中回答后续问题:这仅对字符串有效。所有其他对象都是通过构造函数创建的,因为它们没有指定的文字
例如,您需要Car car = new Car("honda", "civic")
。简单地让("honda, "civic")
不是一个有效的语法 - 不知道你在创建什么类型。
答案 1 :(得分:4)
String obj = new String("Samuel");
String obj1 = new String("Samuel");
// VS
String obj = "Samuel";
String obj1 = "Samuel";
在第一种情况下obj==obj1
返回false
在第二种情况下obj==obj1
返回true。
原因是在第一种情况下,您有两个对两个不同对象的引用。在第二种情况下,你有一个对象,因为字符串是不可变的,它们是interned并从同一个池中提取。
答案 2 :(得分:0)
因此,s1 == s2
将为false,s1.equals(s2)
将为true。区别在于第一种类型的声明字符串称为“字符串文字”,第二种类型的声明字符串称为“字符串对象”。字符串文字用于优化内存的使用并有效地管理内存。