当变量是字符串时,为什么程序打印数字?

时间:2016-03-23 00:57:20

标签: java string

我试图编写一个方法,它将采用类似" abcd"的字符串。然后打印出每个字符两次,以便输出为" aabbccdd"。到目前为止,这是我的代码:

String abcd = "abcd";
    String t = "";

    for (int i = 0; i < abcd.length(); i++){
        t = t + (abcd.charAt(i) + abcd.charAt(i));
    }
    for (int j = 0; j < abcd.length(); j++){
        System.out.printf("%s\n",t);
    }

上面的代码打印出数字,我不明白为什么。由于所有变量都是字符串,所以不打印字母吗?

7 个答案:

答案 0 :(得分:4)

变量是字符串,但charAt会返回一个char,这是一种数字,然后您将这些数字加在一起,这会留下{{1} }。请改为使用StringBuilder并将结果追加int两次。

答案 1 :(得分:1)

请参阅Binary Numeric Promotion中的Java Language Specification

  

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:

     
      
  1. 如果任何操作数属于引用类型,则会进行拆箱转换。

  2.   
  3. 应用扩展基元转换来转换以下规则指定的一个或两个操作数:

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

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

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

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

    •   
  4.   
class Test {
    public static void main(String[] args) {
        int i = 0;
        float f = 1.0f;
        double d = 2.0;
        // First int*float is promoted to float*float, then
        // float==double is promoted to double==double:
        if (i * f == d) System.out.println("oops");

        // A char&byte is promoted to int&int:
        byte b = 0x1f;
        char c = 'G';
        int control = c & b;
        System.out.println(Integer.toHexString(control));

        // Here int:float is promoted to float:float:
        f = (b == 0) ? i : 4.0f;
        System.out.println(1.0 / f);
    }
}

对于您的特定用例,删除括号应该足够了。通过使用它们,您可以先强制添加char。

答案 2 :(得分:0)

只需删除这样的括号:

t = t + abcd.charAt(i) + abcd.charAt(i);

否则,使用char检索时,charAt(i)值会根据其ASCII值以数字方式添加。

答案 3 :(得分:0)

您可以将该行更改为

t += abcd.charAt(i) + (abcd.charAt(i) + "");

这样你就可以得到它的字符串值。

答案 4 :(得分:0)

公共课测试{

public static void main(String[] args) {
    String s = "abcd";
    String t ="";

    for (int i = 0; i < s.length(); i++){
        t = t + s.charAt(i) + s.charAt(i);
    }
    for (int j = 0; j < s.length(); j++){
        System.out.printf("%s\n",t);
    }
}

}

答案 5 :(得分:0)

好的,直接到代码:

String txt = "abcd";
StringBuilder sb = new StringBuilder();

char c;
for (int i = 0; i < txt.length(); i++){
    c = txt.charAt(i);
    sb.append(c).append(c);
}
System.out.printf("%s\n", sb.toString());
  

char:char数据类型是一个16位Unicode字符。它有   最小值'\ u0000'(或0)和最大值'\ uffff'(或   65,535(含))。

其中说明了因添加而收到的内容。

答案 6 :(得分:0)

String charDouble(String str){

   StringBuilder sb = new StringBuilder();
   for(int i=0; i< str.length(); i++){
     sb.append(str.chatAt(i));
     sb.append(str.charAt(i));
   }
   return sb.toString();

   //Alternatively you could just print it here.
   //System.out.println(sb.toString());

}