为什么char连接返回“int”总和?

时间:2014-02-15 01:01:52

标签: java string char sum

问题说明了一切,这是代码:

public class Chars
{

    public static void main(String[] args){
        Chars c = new Chars();
        String res = c.test("abcd");
        System.out.println(res);
    }

    public String test(String str){
        String res = "";
        res += str.charAt(0) + str.charAt(2); 
        return res;
    }
}

返回:“196”,它是ac的ASCII值的总和! 为什么会这样? ,我希望得到“交流”。 如果我修改test()方法中的第二行,如下所示:

res = res + str.charAt(0)+str.charAt(2);

结果确实是“ac”。 请有人帮我解决这个疑问。我无法找到并回答!

5 个答案:

答案 0 :(得分:0)

这是因为charAt()返回char值而不是String。因此+运算符不代表连接,但它只是两个数字的简单相加。

如果+的两个操作数都是数字,则此方法有效。如果其中一个是String+不再执行添加,但两个操作数都转换为String,而是执行连接。因此,如果您在混合中包含res,则

的结果
res + str.charAt(0)

将是String并使用相同的逻辑,整个事情

res += str.charAt(0) + str.charAt(2);

也将评估为String

答案 1 :(得分:0)

区别在于连接的构建方式。

首先:res += str.charAt(0) + str.charAt(2);

此处,首先将两个char值相加。发生二进制数字促销(JLS, Section 5.6.2)。

  

应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:

     
      
  • 如果任一操作数的类型为double,则另一个操作数转换为double。

  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。

  •   
  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。

  •   
  • 否则,两个操作数都将转换为int类型。

  •   

这意味着价值会提升为int,从而创建196。然后将其添加到str,附加"196"

第二:res = res + str.charAt(0) + str.charAt(2);

此处,res + str.charAt(0)首先执行,Stringchar追加char(通过String Conversion, JLS 15.18.1,从而产生新的{{} 1}}。

  

如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。

然后,类似地附加第二个String

如果你要说

char

然后结果与res = res + (str.charAt(0) + str.charAt(2)); 一样(附加196)。

答案 2 :(得分:0)

字符不是字符串。你会期望得到" ac"如果" a"和" c"是弦乐。字符是表示字符的无符号整数,如果添加任何两个字符,结果将转换为int。如果要将其视为char或将其分配给声明为(char)的变量,则必须使用char进行强制转换。

答案 3 :(得分:0)

JLS §15.18.1. String Concatenation Operator +解释了原因:

  

如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。

在您的情况下,您正在执行:char + char。非操作数的类型为String,因此执行经典的数字加法。

答案 4 :(得分:0)

一般情况下,如果您想从字符串中提取字符并获得长度为1的String而不是char,则代替:

str.charAt(i)

你可以这样做:

str.substring(i, i+1)

或者这个:

Character.toString(str.charAt(i))

或:

("" + str.charAt(i))