【问题标题】:How can I convert a string to char[] without copying the object?如何在不复制对象的情况下将字符串转换为 char[]?
【发布时间】:2016-09-23 10:08:50
【问题描述】:

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

提前致谢!

【问题讨论】:

  • 传递对一个应该是不可变对象的可变char[]数组的直接引用将是一个非常糟糕的主意,特别是如果所讨论的不可变对象是String类型,它必须履行与安全相关的角色。
  • 如果你想节省内存空间,不要问char[]数组。你没有解释为什么你认为你需要它。
  • 我需要一个数组,以便可以按索引遍历它。但是,我没有意识到并且 Nicolas Filotto 指出的是 Strings 只是一个将字符串存储在 char[] 数组中的类。多伊!初学者错误:)

标签: java string char java-8


【解决方案1】:

以下是如何在不使用toCharArray() 的情况下以某种方式将String 作为char 数组遍历:

for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
}

【讨论】:

  • 好吧,不是 OP 所询问的“它”......如果 OP 只有一个接受 char[] 的方法,他们无法修改,例如,这不会发生完全可以提供帮助。
  • 你在哪里存储这些生成的字符?
  • “我有一个字符串,我需要将其作为 char 数组进行遍历”这是 OP 的主要要求,如果不是 OP 所期望的,我建议帮助遍历字符串他需要修改问题
  • 这实际上正是我想要的!这指出了我没有意识到的一点,即 String 类只是将其内容存储在一个名为 value[] 的 char 数组中。使用 str.charAt(int index) 只需返回 value[index]
【解决方案2】:

由于您期望返回数组,因此如果不创建新数组,就无法获取数组。

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

使用您当前的代码。

【讨论】:

    【解决方案3】:

    不,不是。不是没有反思,你应该避免。通过反射与字符串中的底层char[] 混淆是产生微妙错误的秘诀。您可以使用charAt 访问字符串中的单个字符,但如果您真的需要char[],您应该调用toCharArray

    如果这不可能,有什么原因吗?

    第一个原因:封装。该数组是私有的实现细节。

    第二个原因:不变性。字符串是不可变的,但数组从不是。所以你可以修改底层的 char 数组,字符串会发生变异,这让任何依赖正常不变性的开发人员感到惊讶。

    【讨论】:

    • 另外,字符串池中对同一字符串的其他引用也会有相同的变异字符串,导致更大的混乱。
    • @Pokechu22:更糟糕的是,安全策略(权限、代码源、用户名)存储为字符串,因此允许更改它们会破坏整个安全模型。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2013-03-31
    • 2021-03-18
    • 2013-01-03
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多