我有一个字符串,我需要将其作为char数组遍历。
当然,通常的方法是使用toCharArray()
String str = "Hello";
char[] charArr = str.toCharArray();
现在,toCharArray()的源代码如下。
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
因此,Java在char []类型的内存中创建一个新对象,并将字符串对象复制到新对象。
我的问题是,是否可以在不复制数组的情况下将字符串用作char []。我的目的是节省内存空间。如果不可能,有这样的理由吗?
提前致谢!
答案 0 :(得分:13)
不,不是。不是没有反思,你应该避免。通过反射与字符串中的基础char[]
混淆是微妙错误的处方。您可以使用charAt
访问字符串中的单个字符,但如果您确实需要char[]
,则只需拨打toCharArray
。
如果不可能,有这样的理由吗?
第一个原因:封装。该数组是一个私有实现细节。
第二个原因:不变性。字符串是不可变的,但数组从不。所以你可以修改底层的char数组,并且字符串会发生变异,这对任何依赖于正常不变性的开发人员来说都是惊喜。
答案 1 :(得分:3)
以下是如何在不使用String
的情况下以char
某种方式遍历toCharArray()
数组:
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
}
答案 2 :(得分:3)
由于您期望返回数组,因此无法在不创建新数组的情况下获取数组。
这是最干净的方式。即使您创建自己的函数并做一些技巧,您最终也会创建新数组。
使用您当前的代码。