如何在不复制对象的情况下将字符串转换为char []?

时间:2016-05-25 16:52:57

标签: java string char java-8

我有一个字符串,我需要将其作为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 []。我的目的是节省内存空间。如果不可能,有这样的理由吗?

提前致谢!

3 个答案:

答案 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)

由于您期望返回数组,因此无法在不创建新数组的情况下获取数组。

这是最干净的方式。即使您创建自己的函数并做一些技巧,您最终也会创建新数组。

使用您当前的代码。