为什么用+添加字符后,我的字符串变成整数而不是字母?

ste*_*lol 35 java string

这就是任务:给定一个字符串,返回一个字符串,其中原始字符中的每个字符都有两个字符。

而且我不明白为什么它的输出是数字而不是字母,我试过不起作用?

public String doubleChar(String str) {
  String s = "";
  for(int i=0; i<str.length(); i++){
  s +=  str.charAt(i) + str.charAt(i);

  }
    return s;
}
Run Code Online (Sandbox Code Playgroud)

预期:

doubleChar(“ The”)吗?“ Tthhee”

doubleChar(“ AAbb”)吗?“ AAAAbbbb”

输出:

doubleChar(“ The”)吗?“ 168208202”

doubleChar(“ AAbb”)吗?“ 130130196196”

Bob*_*ous 54

在Java中,char基本类型基本上只是一个映射到字符的数字值,因此,如果将两个char值加在一起,它们将产生一个数字,而不是另一个char(而不是a String),因此最终得到的int是a。

要解决此问题,您可以使用如下Character.toString(char)方法

s += Character.toString(str.charAt(i)) + Character.toString(str.charAt(i))
Run Code Online (Sandbox Code Playgroud)

但这都是相当低效的,因为您是在循环中执行此操作,因此字符串连接会String不必要地生成许多对象。更有效的方法是使用a StringBuilder及其append(char)方法如下:

StringBuilder sb = new StringBuilder(str.length() * 2);
for (int i = 0; i < str.length(); ++i) {
    char c = str.charAt(i);
    sb.append(c).append(c);
}
return sb.toString();
Run Code Online (Sandbox Code Playgroud)

  • @marstato是正确的,但在这种情况下不适用。Java编译器确实会将字符串连接的序列转换为StringBuilder.append的序列。这将覆盖for块内的s + = s1 + s2语句,但是将对其进行编译,以使该语句的每次执行都创建自己的StringBuilder。在循环外部手动创建它不会出现此问题。 (4认同)
  • 这应该是正确的答案。每次循环迭代都创建新的String对象不是一个好习惯。使用StringBuilder更有效。在这里寻找exaplanation /sf/answers/1291743981/ (3认同)

Edw*_*ard 22

为什么输出整数?

Java中的+运算符已重载,仅对Strings而不是chars 执行字符串连接。

Java规范

如果+运算符的任何一个操作数的类型为String,则该操作为字符串连接。

否则,+运算符的每个操作数的类型必须是可转换(第5.1.8节)为原始数字类型的类型,否则会发生编译时错误。

在您的情况下,将char转换为其原始值(int),然后添加。

而是使用StringBuilder.append(char)将它们串联到中String

如果不关心性能,您甚至可以:

char c = 'A';
String s = "" + c + c;
Run Code Online (Sandbox Code Playgroud)

s += "" + c + c;

这将强制+ String串联运算符,因为它以String(“”)开头。上面的Java Spec给出了示例说明:

+运算符在语法上是左联想的,无论是通过类型分析确定是表示字符串串联还是数字加法。在某些情况下,需要小心以获得期望的结果。例如 [...]

1 + 2 + " fiddlers""3 fiddlers"

但结果是:

"fiddlers " + 1 + 2"fiddlers 12"


Lef*_*une 12

在将结果(现在为整数)连接到字符串之前,首先要添加char的数值。尝试使用打印语句进行调试:

public static String doubleChar(String str) {
  String s = "";
  for (int i = 0; i < str.length(); i++) {
    System.out.println(str.charAt(i));
    System.out.println(str.charAt(i) + str.charAt(i));
    s += str.charAt(i) + str.charAt(i);
  }
  return s;
}
Run Code Online (Sandbox Code Playgroud)

做您想要的事的更有效方法是:

public static String doubleChar(String str) {
  StringBuilder sb = new StringBuilder(str.length() * 2);
  for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
    sb.append(c).append(c);
  }
  return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意他应该使用`StringBuilder`,因为他是在一个循环内连接一个`String`,但是简要解释为什么它更好会有所帮助。 (3认同)

Nex*_*vis 2

您正在将两个字符的值相加。将串联更改String为:

s +=  str.charAt(i) + str.charAt(i);
Run Code Online (Sandbox Code Playgroud)

到:

s +=  str.charAt(i) + "" + str.charAt(i);
Run Code Online (Sandbox Code Playgroud)

这将确保字符转换为String.

注意:这是一个快速修复方法,您应该在循环内部连接StringBuilder时使用。String请参阅其他答案以了解如何完成此操作。