我的长字符串不适合屏幕的宽度。例如。
String longString = "This string is very long. It does not fit the width of the screen. So you have to scroll horizontally to read the whole string. This is very inconvenient indeed.";
为了使阅读更容易,我想到了用这种方式编写它-
String longString = "This string is very long." +
"It does not fit the width of the screen." +
"So you have to scroll horizontally" +
"to read the whole string." +
"This is very inconvenient indeed.";
但是,我意识到第二种方法使用字符串连接,并会在内存中创建5个新字符串,这可能会导致性能下降。是这样吗
还是编译器足够聪明,以至于我只需要一个字符串就可以了?我如何避免这样做?
我意识到第二种方法使用字符串连接,并将在内存中创建5个新字符串,这可能会导致性能下降。
不,不会。由于这些是字符串文字,因此将在编译时对其进行求值,并且 只会 创建 一个字符串
。这是在Java语言规范#3.10.5中定义的:
可以使用字符串连接运算符+
[…] 将长字符串文字始终分解成较短的片段并写为(可能带有括号)表达式,
而且,字符串文字始终始终引用String类的相同实例。
- 由常量表达式(第15.28节)计算出的字符串在编译时进行计算,然后将其视为文字。
- 在运行时通过串联计算的字符串是新创建的,因此是不同的。
测试:
public static void main(String[] args) throws Exception {
String longString = "This string is very long.";
String other = "This string" + " is " + "very long.";
System.out.println(longString == other); //prints true
}
但是,下面的情况有所不同,因为它使用了一个变量-现在有一个串联并创建了多个字符串:
public static void main(String[] args) throws Exception {
String longString = "This string is very long.";
String is = " is ";
String other = "This string" + is + "very long.";
System.out.println(longString == other); //prints false
}
当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?
根据Java, 字符串存储在两个地方。字符串字面池和堆内存根据其创建。我需要知道,当字符串赋值到另一个字符串时,新创建的字符串将存储在哪里? 我对堆和字符串池中的字符串类型都进行了赋值操作。我得到了这样的结果。 但是当, 如果我这么做 同样地, 现在 以上是我在IDE上得到的输出。根据该输出,strNew的一个新引用对象在字符串池中创建,strNew的一个新引用对象在堆中创建。对吗?
问题内容: 如何检查是否是那里的? 我想分配给是否有结果,否则。 我当前的代码是: 问题答案:
使用此代码创建了多少个对象?-我知道3个字符串文本在字符串常量池中,StringBuilder对象在堆中,但当我调用reverse()、insert()或append()时,它会在池中创建一个新字符串吗?
考虑以下键(under_score)和字段(lowerCamel): 我正在Java中寻找一种有效的方法来检查是否在中,我希望以下返回: 我的代码: 我可以用下划线替换所有小写,但我正在寻找更有效的方法。
问题内容: 为什么下面的工作?我希望会被抛出。 问题答案: 为什么必须起作用? 在JLS 5,第15.18.1.1节 JLS 8§15.18.1 “字符串连接运算符+” ,导致JLS 8,§5.1.11 “字符串转换”,要求该操作无故障成功: …现在只需要考虑参考值。如果引用为null,则将其转换为字符串“ null”(四个ASCII字符n,u,l,l)。否则,转换的执行就好像是通过调用不带参数的