我试图通过在字符串的每一端使用两个指针变量来实现字符串反转算法,其中i指向开头,j指向结尾。交换这些位置处的元素,然后分别递增和递减i和j,直到i小于j并且i不等于j。我在执行此操作时将字符串存储在字符数组中,因为字符串在java中是不可变的。但是,当我尝试使用toString()方法将此字符数组转换回字符串时,它将显示随机值。我知道代码是正确的,因为如果我输出字符数组,它会显示正确的值。
public class switcher {
int i=0,j;
char temp;
public void reverse(String s){
char [] ar = s.toCharArray();
j=ar.length-1;
while(i!=j&&i<j){
temp = ar[i];
ar[i]=ar[j];
ar[j]=temp;
i++;
j--;
}
String b=ar.toString();
System.out.println(b);
System.out.println(ar);
}
两个打印语句的输出如下:
阿米斯特德 [C @ 22a79c31 datsima
正如您所看到的,字符串输出不正确。但是,阵列输出是完美的。 请告诉我我做错了什么。
答案 0 :(得分:1)
如果要打印应该基于字符数组的String,那么应该使用新的String对象包装此数组。而不是
String b = ar.toString();
使用
String b = new String(ar);
您需要知道数组从Object继承toString()
方法,因此其代码返回
getClass().getName() + "@" + Integer.toHexString(hashCode());
这意味着您会看到[C
作为getClass().getName()
的结果,它代表char
acters的一维数组,@
令牌和十六进制形式的数组hexcode {{1} }。
如果您想要打印的数据类型与22a79c31
不同的数据类型,您将无法将其包装在String中。相反,您将不得不迭代每个元素并打印它们。为了避免为这个Java编写自己的方法,为char
类提供了java.util.Arrays
方法,该方法将遍历数组的每个元素并生成表单中的String
toString(yourArray)
答案 1 :(得分:0)
ar.toString()
不会返回字符数组的字符串表示形式。它将返回内存中数组的索引。如果您希望b
正确打印出来,请将ar
作为构造函数传递给它,如下所示:
String b = new String(ar);
答案 2 :(得分:0)
正如其他人所说,这是正确的。
大多数Java对象不会在其tostring中进行值转换。相反,他们会在VM内部打印已知类型的标记化名称。
要将字符数组转换为字符串以进行打印,您需要执行与将字符串转换为字符串相反的操作。
最简单的方法就是使用带有字符数组的字符串构造函数
而不是说:
System.out.println(ar);
你可以说
System.out.println(new String(ar));