起因是今天在刷下面这个力扣题时的一个报错
541. 反转字符串 II - 力扣(LeetCode)
这个题目本身是比较简单的,所以就不讲具体思路了。问题出在最后方法的返回值处,要将字符数组转化为字符串,第一次写的时候也没思考直接就是return charArray.toString()
class Solution {
public String reverseStr(String s, int k) {
int len=s.length();
char[] charArray = s.toCharArray();
for (int i = 0; i < s.length()-1; i+=2*k) {
int start=i;
//这里是判断尾数够不够k个来取决end指针的位置
int end=Math.min(charArray.length-1,start+k-1);
while (start<end){
char temp=charArray[start];
charArray[start]=charArray[end];
charArray[end]=temp;
start++;
end--;
}
}
return charArray.toString();
}
}
然后就出现了以下报错:
发现输出竟然是一坨看不懂的东西
后面思考了一下,原因如下:
toString()是顶级父类object中的方法,数组类中并没有对此方法重写(override),仅仅是重载(overload)为类的静态方法。所以,数组直接使用toString(),会去调用object类里面的toString方法,结果是[类型@哈希值]。
于是后面我又用了return Arrays.toString(charArray)还是不行。
class Solution {
public String reverseStr(String s, int k) {
int len=s.length();
char[] charArray = s.toCharArray();
for (int i = 0; i < s.length()-1; i+=2*k) {
int start=i;
//这里是判断尾数够不够k个来取决end指针的位置
int end=Math.min(charArray.length-1,start+k-1);
while (start<end){
char temp=charArray[start];
charArray[start]=charArray[end];
charArray[end]=temp;
start++;
end--;
}
}
return Arrays.toString(charArray);
}
}
原来Arrays.toString(charArray)得到的字符串输出是有格式的而题目要求直接输出字符串。
最后用的是return new String(charArray);终于是通过了。
class Solution {
public String reverseStr(String s, int k) {
int len=s.length();
char[] charArray = s.toCharArray();
for (int i = 0; i < s.length()-1; i+=2*k) {
int start=i;
//这里是判断尾数够不够k个来取决end指针的位置
int end=Math.min(charArray.length-1,start+k-1);
while (start<end){
char temp=charArray[start];
charArray[start]=charArray[end];
charArray[end]=temp;
start++;
end--;
}
}
return new String(charArray);
}
}
通过这次刷题,我也发现了我对Java 数组和字符串的转换这方面非常不熟悉,于是就总结了一下这方面的内容
java中char数组转化为字符串
java中所有的类,不管是java库里面的类,或者是你自己创建的类,全部是从object这个类继承的。object里有一个方法就是toString(),那么所有的类创建的时候,都有一个toString的方法。这个方法是干什么的呢?
首先我们得了解,java输出用的函数print();是不接受对象直接输出的,只接受字符串或者数字之类的输出。
Object类中的toString()方法的源代码如下:
/**
* Returns a string representation of the object. In general, the
* {@code toString} method returns a string that
* "textually represents" this object. The result should
* be a concise but informative representation that is easy for a
* person to read.
* It is recommended that all subclasses override this method.
* <p>
* The {@code toString} method for class {@code Object}
* returns a string consisting of the name of the class of which the
* object is an instance, the at-sign character `{@code @}', and
* the unsigned hexadecimal representation of the hash code of the
* object. In other words, this method returns a string equal to the
* value of:
* <blockquote>
* <pre>
* getClass().getName() + '@' + Integer.toHexString(hashCode())
* </pre></blockquote>
*
* @return a string representation of the object.
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
char[] data = {'a', 'b', 'c'};
System.out.println(data.toString()); //输出结果为[C@79fc7299
输出会去调用object类里面的toString 方法,根据源码可知,输出结果为[类型@哈希值]。
而数组类中并没有对此方法重写(override),仅仅是重载(overload)为类的静态方法(参见java.util.Arrays)。
所以,数组直接使用toString(),会去调用object类里面的toString方法,结果是[类型@哈希值]。
数组转字符串可以使用Arrays类中的toString方法Arrays.toString(data)。附上Arrays类的toString方法源码。但是由源码可知,这种方法的toString()是带格式的,也就是说输出的是[a, b, c]。
/**
* Returns a string representation of the contents of the specified array.
* The string representation consists of a list of the array's elements,
* enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
* separated by the characters <tt>", "</tt> (a comma followed by a
* space). Elements are converted to strings as by
* <tt>String.valueOf(char)</tt>. Returns <tt>"null"</tt> if <tt>a</tt>
* is <tt>null</tt>.
*
* @param a the array whose string representation to return
* @return a string representation of <tt>a</tt>
* @since 1.5
*/
public static String toString(char[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
如果仅仅想输出abc则需用以下两种方法:
直接在构造String时转换。
代码示例:
char[] data = {'a', 'b', 'c'};
String str = new String(data);
调用String类的方法转换
代码示例:
String.valueOf(data)
String类valueOf方法的源码如下,由源码可知,valueOf实际也是new String对象,和方法1一样。
/**
* Returns the string representation of the <code>char</code> array
* argument. The contents of the character array are copied; subsequent
* modification of the character array does not affect the newly
* created string.
*
* @param data a <code>char</code> array.
* @return a newly allocated string representing the same sequence of
* characters contained in the character array argument.
*/
public static String valueOf(char data[]) {
return new String(data);
}
java中字符串转化为char数组
toCharArray()
方法
示例如下:
String str = "Hello, world!";
char[] charArray = str.toCharArray();
System.out.println(Arrays.toString(charArray));