哪一个是正确的,为什么:
String dynamic = new String();
dynamic = " where id='" + unitId + "'";
Or
String dynamic = " where id='" + unitId + "'";
请说明以上2个字符串初始化有什么不同。
答案 0 :(得分:4)
String dynamic = new String(); //created an String object
dynamic = " where id='" + unitId + "'"; //overriding reference with new value
由于字符串是不可变的,现在dynamic
将存储在公共池中。
并且
String dynamic = " where id='" + unitId + "'";
再次是文字并存储在公共池中。
因此,String
可以通过直接分配在公共池中共享的String
文字来创建。
这种情况并不常见,不建议使用 new 运算符在堆中构建String
对象。
所以行
String dynamic = new String();
冗余并在堆中分配不必要的内存。
不要这样做。
了解两种情况都会发生什么,然后你就会知道。
最后,不要使用多少串联“+”,不会在较少量的连接中造成太大的伤害。如果您处理的金额较大,则希望StringBuilder
使用追加方法。
答案 1 :(得分:1)
简短回答:
String str = new String();
在堆上创建一个新的String对象。之后你做的事情:
str = "Hello, String Pool";
您只需用另一个引用覆盖对第一个对象的引用。因此,第一个对象丢失了。记住这一点:字符串是不可变的。
答案 2 :(得分:1)
我们知道String类是不可变的,所以
的 String str="Hello String";
强>
是使用String类的最佳方法,因此我们可以避免内存浪费。当创建相同值的字符串时。
答案 3 :(得分:1)
String str = new String(); //因为有新的运算符所以你创建了一个字符串对象。这将在内存中创造额外的空间。因此浪费了内存和冗余。在你不创建一些复杂的对象之前,不建议使用它。
但是 String str =“qwerty”意味着你将它分配给str。由于机器人存储在公共池中。所以最好使用这种表示法。
答案 4 :(得分:0)
我建议你这样做
String dynamic = " where id='" + unitId + "'";
String dynamic = new String();// DON'T DO THIS!
dynamic = " where id='" + unitId + "'";
该语句在每次执行时都会创建一个新的String实例,并且这些对象创建都不是必需的。 String构造函数的参数(“where id ='”+ unitId +“'”)本身就是一个String实例,在功能上与构造函数创建的所有对象相同。如果在循环或频繁调用的方法中发生此用法,则可以不必要地创建数百万个String实例。改进版只是以下内容:
String dynamic = " where id='" + unitId + "'";
答案 5 :(得分:0)
String dynamic = new String();
dynamic = " where id='" + unitId + "'";
创建一个空字符串的绑定,然后通过重新初始化它来完全转储它。
String dynamic = " where id='" + unitId + "'";
创建绑定并离开它。
第一个是不必要的。请使用直接字符串文字。
答案 6 :(得分:0)
你可以这样使用。
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("where id='");
stringBuilder.append(unitId);
stringBuilder.append("'");
String dynamic = stringBuilder.toString();
答案 7 :(得分:0)
我猜以下会很好
String str; // Just declares the variable and the default will be null. This can be done in global scope or outer scope
str = "where id" + unitID + "'"; // Initializing string with value when needed. This will be done in the inner scope.
如果声明和初始化在初始化包含动态文本(在您的情况下为unitID)的行中完成,则无法全局执行。如果变量的范围不是问题,那么你可以继续。干杯!!