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

时间:2019-07-10 19:51:37

标签: 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;
}

预期:

  

doubleChar(“ The”)→“ TThhee”

     

doubleChar(“ AAbb”)→“ AAAAbbbb”

输出:

  

doubleChar(“ The”)→“ 168208202”

     

doubleChar(“ AAbb”)→“ 130130196196”

5 个答案:

答案 0 :(得分:48)

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

要解决此问题,您可以像这样使用Character.toString(char) method

s += Character.toString(str.charAt(i)) + Character.toString(str.charAt(i))

但这都是相当低效的,因为您是在循环中执行此操作,因此字符串连接会不必要地生成许多String对象。更有效的方法是使用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();

答案 1 :(得分:19)

为什么输出整数?

Java中的+运算符已重载,仅对String而不是char执行String连接。

来自Java Spec

  

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

     

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

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

相反,请使用StringBuilder.append(char)将它们串联为String

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

char c = 'A';
String s = "" + c + c;

s += "" + c + c;

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

  

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

     

1 + 2 + " fiddlers""3 fiddlers"

     

但结果:

     

"fiddlers " + 1 + 2"fiddlers 12"

答案 2 :(得分: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;
}

更有效的方法是:

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();
}

答案 3 :(得分:2)

您要将两个字符的加在一起。从以下位置更改dsComponentes.Tables["Queue"].Columns["Tamanho_Fila"].DataType = typeof(int); 的串联:

String

收件人:

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

这将确保字符转换为s += str.charAt(i) + "" + str.charAt(i);

注意:这是一个快速解决方案,当String在循环内部串联时,应使用StringBuilder。有关其他操作方法,请参见其他答案。

答案 4 :(得分:2)

String.charAt()返回一个charhttps://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt(int)),因此您要处理一个字符。使用一个char,您可以像这样对它执行操作(它将显示“ 65”,即“ A”字符的ASCII值):

System.out.println('A' + 0);

您可以通过向'A'加1来打印下一个字符(“ B”)的ASCII值,如下所示:

System.out.println('A' + 1);

要使代码正常工作(使每个字符加倍),有很多选项。您可以一次附加每个字符:

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

或将操作强制转换为字符串的各种方式:

s += "" + str.charAt(i) + str.charAt(i);