当前位置: 首页 > 知识库问答 >
问题:

java中字符串常量的串联[重复]

陆宾白
2023-03-14

在C语言中,创建我所知道的多行字符串的最佳规范方法是创建相邻的字符串,并让编译器在编译时将它们连接起来,如下所示:

string s = "This is a very long string ...\n"
   " and it keeps on going...";

在Java中,我知道的唯一方法是使用连接:

String s = "This is a very long string ...\n" +
   " and it keeps on going...";

问题是,这是在运行时生成单个字符串,还是java在编译时也会连接?这个问题出现的原因是因为以下行为:

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // this prints true, because the compiler
// generates only one "abc" object
String s3 = "a";
s3 += "bc";
System.out.println(s1 == s3); // false

共有2个答案

终弘厚
2023-03-14

Java为每个字符串创建一个不可变的对象,但将重用文本以提高性能。

这一行创建一个不可变的字符串s1

String s1 = "abc"; 

将引用与s1相同的字符串文字,因为这是一个文字,可以由编译器进行优化。

String s2 = "abc"; 

这是一个身份比较,你要问的是S1和S2是同一个对象,不是同一个字符串。由于编译器通过使两个对象引用相同的不可变字符串进行了优化,因此返回true。

System.out.println(s1 == s2);  

这将创建2个不可变字符串,然后在运行时创建第三个字符串。因为运行时不能保证它能找到一个已经存在的字符串来有效地引用,所以它只需要创建一个新对象并创建一个新的不可变字符串s3

String s3 = "a";
s3 = s3 + "bc";  

这是错误的,因为它们是两个独立的数据对象。

 System.out.println(s1 == s3); 

注意字符串相等返回true,这里是比较字符串对象内容的方式,而不是对象位置。这是第一次比较检查标识,第二次检查相等性。

 System.out.println(s1.equals(s3));

Java知道为字符串连接过程的每个步骤创建一个数据对象是非常不必要的。为了帮助使用java,我们使用了StringBuilderapi,它可以提供更多的性能。

 String s = "a";
 s += "b";
 s += "c";
 s += "d";
 s += "e";

结果'9'字符串对象被创建并写入内存...

 ("a", "b", "ab", "c", "abc", "d", "abcd", "e", "abcde")

字符串生成器帮助

StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
sb.append("c");
sb.append("d");
sb.append("e");

更高效,因为它只执行一次concat,并导致更好的内存使用。

("a", "b", "c", "d", "e", "abcde")
茹正祥
2023-03-14
String s3 = "a";
s3 += "bc";

同:

String s3 = "a";
s3 = new StringBuilder().append(s3).append("bc").toString();

因此它创建了一个新的String实例。

您甚至可以尝试:

String s = null;
s += null;
System.out.println(s); // prints "nullnull"
 类似资料:
  • 问题内容: 在C ++中,创建多行字符串的最佳规范方法是创建相邻字符串,并让编译器在编译时将它们连接起来,如下所示: 在Java中,我唯一知道的方法是串联: 问题是,这是在运行时生成单个字符串,还是Java实际上也在编译时进行连接?出现此问题的原因是由于以下行为: 问题答案: String s3 = “a”; s3 += “bc”; 与: 因此,它创建了一个新实例。 您甚至可以尝试:

  • 问题内容: 在将根据循环被重复。如何将结果另存为新字符串。例如,如果工作“ hello”重复了两次,我现在将如何创建“ hellohello”作为一个全新的字符串。 问题答案:

  • 问题内容: 为什么下面的工作?我希望会被抛出。 问题答案: 为什么必须起作用? 在JLS 5,第15.18.1.1节 JLS 8§15.18.1 “字符串连接运算符+” ,导致JLS 8,§5.1.11 “字符串转换”,要求该操作无故障成功: …现在只需要考虑参考值。如果引用为null,则将其转换为字符串“ null”(四个ASCII字符n,u,l,l)。否则,转换的执行就好像是通过调用不带参数的

  • 当使用关键字 new 创建字符串时,它使用采用 String 文本的构造函数创建新的 String 对象。我想知道在调用 String 构造函数之前,文本是否存储在常量池中。 我这么问的原因是,在《OCA Java SE 7程序员I认证指南》中,Mala Gupta写道: 她在第一行表示,new创建的String对象不会存储在常量池中。这很好,但不清楚的是,第一行构造函数中的字面“Summer”是

  • 本文向大家介绍串联字符串的Java程序。,包括了串联字符串的Java程序。的使用技巧和注意事项,需要的朋友参考一下 String类的 concat() 方法将指定的字符串连接到该字符串的末尾。 示例 输出结果

  • 问题内容: PHP中有没有一种方法可以在字符串中包含常量而不进行串联? 问题答案: 没有。 使用字符串,除了常量标识符外,PHP无法分辨字符串数据。这适用于PHP中的任何字符串格式,包括heredoc。 是获取常量的另一种方法,但是没有连接也不能将函数调用放入字符串中。 PHP中的常量手册