当前位置: 首页 > 面试题库 >

字符串形成字符串的结果不同

赵志
2023-03-14
问题内容

为什么当我使用以下操作对字符求和时,它返回数字而不是字符?它不应该给出相同的结果吗?

ret += ... ; // returns numbers

ret = ret + ...; // returns chars

下面的代码复制了字符:

doubleChar(“ The”)→“ TThhee”

public String doubleChar(String str) {

    String ret = "";
    for(int i = 0; i < str.length(); i++) {
        ret = ret + str.charAt(i) + str.charAt(i); // it concatenates the letters correctly
        //ret += str.charAt(i) + str.charAt(i); // it concatenates numbers
    }
    return ret;
}

问题答案:

以下表达式的结果

ret + str.charAt(i) + str.charAt(i);

是String连接的结果。Java语言规范说明

字符串串联的结果是对String对象的引用,该对象是两个操作数字符串的串联。在新创建的字符串中,左侧操作数的字符位于右侧操作数的字符之前。

的结果

str.charAt(i) + str.charAt(i);

是将加法运算符应用于两个数字类型的结果。Java语言规范说明

当应用于两个数字类型的操作数时,binary +运算符将执行加法运算,从而得出这些操作数的总和。[…]数字操作数上加法表达式的 类型是其操作数的
提升 类型。

在这种情况下

str.charAt(i) + str.charAt(i);

成为int两个char值的和。然后将其连接到ret

您可能还想了解有关复合赋值表达式的信息 +=

形式的复合赋值表达式E1 op= E2等效于E1 = (T) ((E1) op (E2)),其中T是的类型E1,不同之处在于该表达式E1 仅被评估一次。

换一种说法

ret += str.charAt(i) + str.charAt(i);

相当于

ret = (String) ((ret) + (str.charAt(i) + str.charAt(i)));
                      |                ^ integer addition
                      |
                      ^ string concatenation


 类似资料:
  • 问题内容: String[] letters = {“A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “L”}; 为什么是 Fk呀! 输入AL字母之一绝对不会发生? 问题答案: 字符串是对象。所述通过引用,而不是由它们的内部值进行比较的对象。 有两种解决方案: 使用method来比较两个对象的值。 使用代替。这是原始的,因此可以使用。

  • 对性能是否有影响? 不同Java版本的行为是否有差异?

  • 问题内容: 我有一个要求,如果字符串的末尾存在分号(仅在末尾),则需要删除分号。我尝试了以下代码。但是仍然没有被替换。谁能在行号中告诉我以下代码中需要更改的内容 (我从这里引用了代码。如何从Java中的特定String中删除特定字符?) 问题答案: text.replaceAll(“;”, “”); 由于Java中的字符串是不可变的,因此method不会进行就地替换,而是会返回新的修改后的字符串。

  • 因此,我为用户输入创建了一个reg ex模式和匹配器,并使用串联来产生将用于Pattern.compile()的字符串。我不能匹配模式,但是当我打印连接的结果并把它放入Pattern.compile时,它匹配模式。我尝试了不同的连接方式,但还是不匹配。 奇怪的是,它在以下情况下起作用: 但是打印inputPattern会产生和 产生不同的结果

  • 问题内容: 我正在解决一个简单的问题: 在Java中删除字符数组中的某些字符,想法很简单: 我想输入一个信号,表示当我们想要使用例如生成一个字符串时,不必考虑数组的其余部分 Java中是否有这样的字符?(我想是,但我不确定) 例如,当我们调用: 这将被打印: 虽然我想得到,但我不想使用新的数组来做到这一点 问题答案: Java不会像C那样“标记”字符串的结尾。它跟踪长度和值,因此字符串中可以包含零

  • 问题内容: 以下语句, 产生输出。 但是,以下内容 产生。 区别在哪里? 问题答案: 您会因为操作符优先级和字符串转换的结合而看到此行为。 JLS 15.18.1 指出: 如果只有一个操作数表达式的类型为String,则对另一操作数执行字符串转换(第5.1.11节),以在运行时生成字符串。 因此,第一个表达式中的右侧操作数将隐式转换为字符串: 但是对于第二个表达式,必须将复合赋值运算符与一起考虑。