我们都知道,在Java中字符串的内容是不可以改变的,但数组的内容是可以进行改变的。在使用时经常需要进行两者的相互转换(特别是在刷题过程中),因此在这里做一下简单总结:
一、字符串转化为数组
这是我们经常遇到的需求,例如,题目中给出一个字符串,需要改变其顺序,我们就需要将其转化为数组进行操作。字符串可以转化为多种数组,下面分别进行介绍:
(1)字符串转化为字符数组(常用):
- 使用String类中的toCharArray()方法;
String s = "abc123";
char[] chars = s.toCharArray();
(2)字符串转化为字节数组(不常用):
- 使用String类中的getBytes()
- 得到的字节数组内容对应的是每一个字符的ASCII码
String s = "abc123";
byte[] bytes = s.getBytes();
System.out.println(bytes[0]); //bytes[0]-->97
二、数组转化为字符串
将数组转换为字符串时,相信很多人首先想到的是toString()方法,但最常用的却是其他的方法,因为toString()方法有它的特别之处,下面分别进行介绍:
(1)首先,最常用的方法是
String s = new String(arr)
,其中arr可以是字符数组或字节数组,其中字节数组转化为字符串时会解码为字符。该方法中只能对字符数组和字节数组进行转化,有一定的局限性。
char[] arr1 = {'a','b','1'};
byte[] arr2 = {97,98,99};
String s1 = new String(arr1);
String s2 = new String(arr2);
System.out.println(s1); //s1=ab1
System.out.println(s2); //s2=abc
(2)第二种方法是使用Arrays.toString(arr),该方法中的arr可以是各种类型的数组,但是该方法转化为字符串后会默认加上’ [ ] ‘与’, ‘,且转化字节数组时不会解码为字符;
char[] arr1 = {'a','b','1'};
byte[] arr2 = {97,98,99};
String s1 = Arrays.toString(arr1);
String s2 = Arrays.toString(arr2);
System.out.println(s1); //s1=[a, b, 1]
System.out.println(s2); //s2=[97, 98, 99]
(3)最后说一下toString()方法,先说结论:在Java中,不能使用arr.toString()将数组转化为字符串,原因如下:
toString()方法是Object类中的方法,在Java中,所有的类都默认继承了Object类,也就是说所有的对象(不管是系统的还是自己创建的)都会含有一个成员方法toString(),若在类中未重写toString()方法,我们使用【对象.toString()】就会调用Object类中的toString()方法;
下面是Object类中的toString()方法的源码,该方法返回的是对象的十六进制的地址值,这也就是为什么很多时候我们直接打印对象名会出来一些奇怪的东西(如:[C@1540e19d)。
由于Java中的数组类未重写toString()方法,因此不能使用arr.toString()将数组转化为字符串。再多说一句,自己创建的对象想要通过打印对象名称直接打印出想要的结果,需要在类中重写toString()方法。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
char[] arr1 = {'a','b','1'};
byte[] arr2 = {97,98,99};
String s1 = arr1.toString();
String s2 = arr2.toString();
System.out.println(s1); //s1=[C@1540e19d
System.out.println(s2); //s2=[B@677327b6