我正在尝试同时运行这三个线程,但是当我执行system.print时 字符不会出来,计数器“ i”越界。
我以某种方式在Char前面添加了一个字符串,它可以正确打印出来,任何人都可以向我解释为什么会这样?
public class Part2 {
public static void main(String[] args) {
Runnable printA = new PrintChar('a');
Runnable printB = new PrintChar('b');
Runnable printC = new PrintChar('c');
Thread t1 = new Thread(printA);
Thread t2 = new Thread(printB);
Thread t3 = new Thread(printC);
t1.start();
t2.start();
t3.start();
}
private static class PrintChar implements Runnable {
private char c;
public PrintChar(char c) {
this.c = c;
}
public void run()
{
for(int i = 1; i<=100; i++) {
System.out.print(c + i + ", ");
}
}
}
}
/ *这是此代码的输出: 98、100、101、102、103、104、105、99、99,.... 198,* /
/ *如果我像这样在Char之前添加一个字符串 这是我期望的输出; * /
public void run()
{
for(int i = 1; i<=100; i++) {
System.out.print("" + c + i + ", ");
}
}
/ * b1,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,... a1〜a100 b1〜b100 和c1〜c100同时运行并完成* /
答案 0 :(得分:3)
在+
和char
上使用int
运算符时,它将执行算术加法,而不是字符串连接。首先放置"" +
意味着您首先要做的是将"" + c
连接到String
中,然后将该String
添加到int
中,这是另一个连接
答案 1 :(得分:0)
+
运算符在Java中有两个含义。它可以代表:
加法,如果两个操作数都是数字类型,并且char
被认为是数字类型,因为其内部值是表示Unicode表中字符位置的数字,例如{{3 }}为97(十进制为61,十六进制为61)。
串联(如果至少一个操作数是String)。
此外,由于评估是从左到右进行的,c + i + ", "
等同于(c + i) + ", "
。在(c + i)
,c
和i
都是数字类型,因此+
表示加法并计算'a'+1
,其中'a'
为前面提到的被视为97,因此您看到97+1
的结果是98。
在那之后的下一个操作是98 + ", "
,这里的第二个操作数是String,所以这里的+
表示串联。因此98 + ", "
的结果为字符串"98, "
。
对于"" + c + i + ", "
,由于从左到右的评估顺序,我们可以将其表示为(("" + c) + i) + ", "
。
("" + c)
将被“计算”,并且由于第一个操作数是字符串+
表示串联,因此我们以"" +'a'
的结果得出字符串"a"
。"a" + i
,这里的第一个操作数也是String类型的,因此+
还表示连接,这会导致String "a1"
"a1" + ", "
。这里两个操作数都是字符串,因此+
是串联的,其结果是"a1, "
字符串。