程序中s2 + = s1.charAt(i)的含义是什么

Tod*_*ned 0 java

我有这个程序

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)

在粗体标记的代码中到底发生了什么.

Bor*_*der 5

让我们来看看代码:

分配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必须:

  1. 创造一个新char[]的大小left.length + right.length
  2. 将原文String的内容复制到char[]
  3. 将rhs内容复制到char[] 4中返回char[]包装中new String

这是非常昂贵的 -为一个字符添加到String了整个原始String必须被复制.这是因为String是不可改变的.

不要相信我 - 阅读这篇优秀的文章.然后再也不要String +=在循环中使用了.