我有这个程序
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);
Run Code Online (Sandbox Code Playgroud)
在粗体标记的代码中到底发生了什么.
让我们来看看代码:
分配s1给String"java"并分配s2给String"".
String s1="java";
String s2="";
Run Code Online (Sandbox Code Playgroud)
从下i = s1.length() - 1到i >= 0 下循环.
for (int i=s1.length()-1;i>=0;i--) {
s2+=s1.charAt(i);
}
Run Code Online (Sandbox Code Playgroud)
让我们来看看:
迭代1,i = s1.length() - 1 = 3代码变为:
s2 += s1.charAt(3);
Run Code Online (Sandbox Code Playgroud)
这是什么意思?好吧,+=是一个复合连接运算符,所以让我们替换它:
s2 = s2 + s1.chartAt(3);
Run Code Online (Sandbox Code Playgroud)
charAt(n)给出a的第n个字符String,零索引 - 让我们也替换它:
s2 = s2 + "a"
Run Code Online (Sandbox Code Playgroud)
所以,我们采取s2这是"",并与Concat的是"一",我们分配结果回至s2.
迭代2,i = 2代码变为:
s2 += s1.charAt(2);
Run Code Online (Sandbox Code Playgroud)
现在,我们知道那s1.charAt(2)是"v"而且s2是"a"所以:
s2 = "a" + "v" = "av"
Run Code Online (Sandbox Code Playgroud)
迭代3,i = 1代码变为:
s2 += s1.charAt(1);
Run Code Online (Sandbox Code Playgroud)
现在,我们知道这s1.charAt(1)是"a"而且s2是"av"所以:
s2 = "av" + "a" = "ava"
Run Code Online (Sandbox Code Playgroud)
迭代4,i = 0代码变为:
s2 += s1.charAt(0);
Run Code Online (Sandbox Code Playgroud)
现在,我们知道这s1.charAt(0)是"j"并且s2是"ava"所以:
s2 = "ava" + "j" = "avaj"
Run Code Online (Sandbox Code Playgroud)
然后循环终止i <= 0.
那么该线s2+=s1.charAt(i)做什么?它采用i的个字符(零索引)s1,并追加其到s2.
应该注意的是,这个代码可以更有效地编写为:
String s1 = "java";
String s2 = new StringBuilder(s1).reverse().toString();
Run Code Online (Sandbox Code Playgroud)
这有两个好处:
它更短,更易读.
它要快得多,连接操作符String必须:
char[]的大小left.length + right.lengthString的内容复制到char[]char[]
4中返回char[]包装中new String这是非常昂贵的 -为一个字符添加到String了整个原始String必须被复制.这是因为String是不可改变的.
不要相信我 - 阅读这篇优秀的文章.然后再也不要String +=在循环中使用了.
| 归档时间: |
|
| 查看次数: |
1375 次 |
| 最近记录: |