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

关于 “ ” 运算符及其 StringBuilder 实现

朱通
2023-03-14

据我所知,Java中的String concatenation""运算符是使用Stringbuilder实现的,例如:

String s = "foo" + "bar" 

内部编译为:

String s = new StringBuilder().append("foo").append("bar").toString();

所以我尝试了这样的东西:

String foo1 = "foobar";
String foo2  = new String("foobar");
String foo3 = "foo" + "bar"; 
char[] fooarray = {'f','o','o','b','a','r'};
String foo4 = new String(fooarray);

接下来,我使用==运算符相互测试了这些。结果主要是我所期望的:foo2和foo4没有为任何其他字符串返回“==”。

但是,fo3==fo1返回true。这是什么原因?StringBuilder类的toString方法内部调用“new String”,所以fo3不应该是一个唯一的对象吗,就像fo2一样?

共有1个答案

彭洲
2023-03-14

foo3 == foo1 返回 true 的原因是因为字符串池。

当您连接字符串文字(甚至最终不是文字的字符串)时,连接会在编译时发生,因此当程序执行String fo1="fobar"时;String fo3="fobar";

字符串池或字符串表是堆中存储字符串引用的特殊区域。

现在,当您创建字符串foo1时,如果没有其他值为foobar,它将保留在池中。但是,如果<code>foo3

当使用new关键字创建字符串时,对象驻留在堆上,但在字符串池之外。

如果您希望使用new关键字创建的字符串位于字符串池中,如果相同的值已经存在于该池中,则必须调用string<code>intern()

有关详细信息-什么是Java字符串池,以及“s”与新字符串(“s”)有何不同?

 类似资料:
  • 问题内容: 我正在阅读“ 更好,更快,更轻便的Java ”(作者Bruce Tate和Justin Gehtland),并且熟悉敏捷类型团队的可读性要求,例如Robert Martin在其干净的编码书中讨论的内容。在我现在所在的团队中,已明确告知我不要使用运算符,因为它会在运行时创建额外的(和不必要的)字符串对象。 但是,这篇写于‘04的文章讨论了对象分配如何与10条机器指令相关。(基本上免费)

  • 假设: 2的补码形式的32位有符号整数 true和false是值为1和0的整数 java运算符 你能实现像<代码>

  • 主要内容:示例关系运算符允许对象比较。以下是在 Erlang 可用的关系运算符。 操作符 描述 示例 == 测试两个对象是否相等 2 = 2 结果为 true /= 测试两个对象是否为不相等 3 /= 2 结果为 true < 测试左边对象是否小于右边操作对象 2 < 3 结果为 true =< 测试左边对象是否小于或等于右边操作对象 2 =<3 结果为 true > 测试左边对象是否大于右边操作对象 3 >

  • void 运算符 void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 void 0 // undefined void(0) // undefined 上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用圆括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7。

  • 本文向大家介绍浅谈JS运算符&&和|| 及其优先级,包括了浅谈JS运算符&&和|| 及其优先级的使用技巧和注意事项,需要的朋友参考一下 今天看了一段YUI compressor压缩的js代码: userNum && (ind += index,ind >= userNum && (ind -= userNum),ind < 0 && (ind === -2 && (ind = -1),ind +=

  • 你好,我刚刚开始学习贪婪算法,我首先看了经典的硬币变化问题。我可以理解算法中的贪婪(即,选择局部最优解以实现全局最优),因为我选择硬币的最高价值,使得总和{所选硬币的价值} 贪婪算法是解决特定范围问题的唯一方法吗?或者它们是解决问题的一种更有效的方式? 你能给我同样问题的伪代码吗?