我有这个程序
String s1="java";
String s2="";
for (int i=s1.length()-1;i>=0;i--)
{
s2+=s1.charAt(i); // Please explain this line.
}
System.out.println("The Reversal of "+s1+" is "+s2);
以粗体标记的代码中究竟发生了什么。
答案 0 :(得分:5)
让我们来看看代码:
将s1
分配给String
“java”并将s2
分配给String
“”。
String s1="java";
String s2="";
从i = s1.length() - 1
循环到i >= 0
向下。
for (int i=s1.length()-1;i>=0;i--) {
s2+=s1.charAt(i);
}
让我们来看看:
迭代1 ,i = s1.length() - 1 = 3
,代码变为:
s2 += s1.charAt(3);
这是什么意思?好吧,+=
是一个复合连接运算符,所以让我们替换它:
s2 = s2 + s1.chartAt(3);
charAt(n)
给出String
的第n个字符,零索引 - 让我们替换它:
s2 = s2 + "a"
因此,我们将s2
取为“”,并将其与“a”相连,我们将结果返回分配给s2
。
迭代2 ,i = 2
,代码变为:
s2 += s1.charAt(2);
现在,我们知道s1.charAt(2)
是“v”而s2
是“a”所以:
s2 = "a" + "v" = "av"
迭代3 ,i = 1
,代码变为:
s2 += s1.charAt(1);
现在,我们知道s1.charAt(1)
是“a”而s2
是“av”所以:
s2 = "av" + "a" = "ava"
迭代4 ,i = 0
,代码变为:
s2 += s1.charAt(0);
现在,我们知道s1.charAt(0)
是“j”而s2
是“ava”所以:
s2 = "ava" + "j" = "avaj"
循环从i <= 0
开始终止。
那么s2+=s1.charAt(i)
行是做什么的?它需要i
s1
个字符(零索引)而将附加到s2
。
应该注意的是,这段代码可以更有效地编写为:
String s1 = "java";
String s2 = new StringBuilder(s1).reverse().toString();
这有两个好处:
它更短,更易读。
更快,String
上的连接运算符必须:
char[]
left.length + right.length
String
的内容复制到char[]
char[]
4返回包含在char[]
new String
醇>
非常昂贵 - 要向String
添加单个字符,必须复制整个原始String
。这是因为String
不可变。
不要相信我 - 请阅读this excellent article。然后再也不要在循环中使用String +=
。
答案 1 :(得分:0)
s2+=s1.charAt(i); // adding ith index char in s1 to current value of s2
例如:
String s1="123456";
String s2="";
for(int i=0;i<s1.length();i++){
s2+=s1.charAt(i);
System.out.println(s2);
}
运行此
1
12
123
1234
12345
123456
您可以看到s2
添加
答案 2 :(得分:0)
s2+=s1.charAt(i)
表示取s2并在字符串s2的索引i处添加char值。
答案 3 :(得分:0)
字符串s1反向附加到字符串s2指的是非常低效的方式。
答案 4 :(得分:0)
表示s2 = s2 + s1.charAt(i)。例如,在第一个循环中,它表示s2 =&#34;&#34; +&#34; a&#34;所以s2 =&#34; a&#34;。
答案 5 :(得分:0)
+ =是加法作业。
a + = b;与a = a + b相同; 对于字符串,+表示连接。
s1.charAt(i)返回s1字符串中位置i的char。因此,
s2+=s1.charAt(i);
将s1中的第i个字符连接到当前的s2字符串。
答案 6 :(得分:0)
以粗体标记的代码会以相反的顺序将变量s1
中获得的每个字符附加到变量s2
。