我试图连接两个字符串,一个字符串有一些值,另一个字符串有空。
示例:
String string1="Great"
String string2="";
并用concat函数和运算符连接这两个字符串
示例:
String cat=string1.concat(string2)
String operator=string1+string2
根据我的理解,当在concat函数中使用空字符串时,因为string2是空的,所以不会创建新的引用。但在使用运算符时,将在字符串池常量中创建一个新引用。但在下面的代码中,当使用运算符时,不会创建新的引用。
public class Main {
public static void main(String[] args) {
String string1="Great",string2="";
String cat=string1.concat(string2);
if(string1==cat)
{
System.out.println("Same");
}
else
{
System.out.println("Not same");
}
String operator=string1+string2;
if(operator==string1)
System.out.println("Same");
else
System.out.println("Not same");
}
}
输出:
字符串1:69066349
类别:69066349
相同的
第1列:69066349
操作员:69066349
不一样
从上面的代码中,当它使用操作符时,变量的引用:操作符应该引用新内存,但它指向string1引用。请解释上述代码。
这些都在文档中。
对于<代码>字符串。javadoc声明:
如果参数字符串的长度为0,则返回此字符串对象。
对于操作员,JLS 15.8.1规定:
字符串连接的结果是对String
对象的引用,该对象是两个操作数字符串的连接。在新创建的字符串中,左侧操作数的字符在右侧操作数的字符之前。
字符串是新创建的(§12.5),除非表达式是常量表达式(§15.29)。
如您所见,对于第二个字符串长度为零并且这不是常量表达式的情况,结果会有所不同。
这就是您的示例中发生的情况。
你还说:
但在使用运算符时,将在字符串池常量中创建一个新引用。
这与你的问题没有直接关系,但。。。事实上,不会在那里创建。它将创建对堆中常规(非内部)字符串对象的引用。(如果它是一个常量表达式,它将仅位于类文件的常量池中,因此也将位于字符串池中;请参阅JLS 15.29)
请注意,字符串池和类文件常量池是不同的。
我可以补充几点吗:
>
您可能不应该使用String.concat
。运算符更简洁,即时编译器应该知道如何优化不必要的中间字符串的创建......在少数情况下,您可能会考虑出于性能原因使用
concat
。
利用没有创建新对象的事实,以便可以使用而不是使用等于(对象),这是一个坏主意。您的代码将很脆弱。只需始终使用equals来比较字符串和基本包装类型。它更简单、更安全。
简而言之,你甚至问这个问题的事实表明你正在走一条死胡同。了解conat
和之间的这种边缘情况差异是...毫无意义...除非您打算参加Java极客的智力竞赛节目。
我知道这可能是非常基本的,也可能是非常直接的,但我无法清楚地理解在这种情况下会发生什么,所以,就这样吧。 在以下代码中: 我知道str1和str2将在字符串常量池中分别创建一个对象“Hello”和“World”。而对于str3,将在字符串常量池外部创建一个新对象,该对象指向在字符串常量池内部创建的“HelloWorld”。 我的问题是,如果我concat 2个或更多字符串(使用“”或concat(
返回前用调试器运行程序时,指针的值为0x0000000009DFAA90,但的值变为0x0000000009DFAA98。 这种情况只发生在字符串类型中。我试着对我的一个类的“int[10]”、“string*[10]”和对象做同样的操作,但问题只发生在处理string和代码时: 工作非常好。 有没有人能解释一下为什么会发生这种情况,以及如何使它正常工作? PS:我们正在使用Visual Stud
问题内容: 我在玩python,我意识到我们不需要使用’+’运算符来连接字符串,除非它与值一起使用。 例如: 现在我有两个问题: 为什么语句3无效,而语句1无效? 陈述1和2之间是否存在技术上的差异,例如计算速度等? 问题答案: 从文档: 允许使用可能使用不同的引用约定的多个相邻字符串文字(由空格分隔),其含义与它们的串联相同。因此,“ hello”“世界”等同于“ helloworld”。 语句
您创建的MovieDBContext类负责处理连接到数据库,并将Movie对象映射到数据库记录的任务中。你可能会问一个问题,如何指定它将连接到数据库? 实际上,确实没有指定要使用的数据库,Entity Framework将预设值使用的LocalDB。 在本节中,我们将显式地在Web.config文件中,添加应用程序的连接字符串(connection string)。 SQL Server Expr
问题内容: Python中常见的反模式是在循环中使用串联字符串序列。这很不好,因为Python解释器必须为每次迭代创建一个新的字符串对象,并且最终要花费二次时间。(在某些情况下,最新版本的CPython显然可以优化此功能,而其他实现则不能,因此建议程序员不要依赖此功能。)是执行此操作的正确方法。 但是,我听说它说过),您 _永远都不_要将它用于字符串连接,而应该始终使用或格式字符串。我不明白为什么
问题内容: 想知道有没有比如下计算给定字符串的字符数更简单的方法? 问题答案: 具有完全的Unicode支持(Java 11+)1的最简单的方法来计算字符串中每个字符的出现次数: 1)答案的结尾是具有完整Unicode支持的Java 8版本。 输出量 更新: 对于Java 8+(不支持补充平面中的字符,例如emoji): 更新2: 同样适用于Java 8+。 我误会了,以为它是在Java 9之前才