【问题标题】:How to convert StringBuilder[] to String[]如何将 StringBuilder[] 转换为 String[]
【发布时间】:2021-12-22 01:52:30
【问题描述】:

我有一个 StringBuilder 对象数组,如下所示。

StringBuilder[] sbCmd = new StringBuilder[5];
int cntr = 0;
sbCmd[cntr++].append("add");
sbCmd[cntr++].append("sub");
sbCmd[cntr++].append("mul");
sbCmd[cntr++].append("div");
sbCmd[cntr++].append("mod");

现在我有一个函数,它接受一个字符串数组作为输入,如下所示。

ConfigureMathOperation(String[] array)
{
  //Do some work
}

我怎么称呼它?我在这里尽量避免使用 String[],因为它是不可变的(我有一些敏感数据需要在函数调用后清除)。

我必须为存储在数组中的每个 StringBuilder 对象调用 toString 吗?示例代码 sn-p 真的很有帮助,因为我是 Java 新手。

例如我想如下调用,但它不起作用,因为我不知道如何调用每个 StringBuilder 对象。

ConfigureMathOperation(sbCmd.toString());

【问题讨论】:

  • “我必须为存储在数组中的每个 StringBuilder 对象调用 toString 吗?” => 差不多,一种或另一种。顺便说一句:您的.append 调用将按原样引发NullPointerExceptions。
  • 是的,您必须致电toString()。这意味着您也无法从内存中清除数据,而必须依靠垃圾收集器来完成这项工作。请注意,理论上您可以修改(或覆盖)ConfigureMathOperations 以也接受 CharSequence 对象并避免使用 toString() 来解决此问题。
  • "How to convert StringBuilder[] to String[]" 和 "I'm trying to Avoid String[] here" 是矛盾的。
  • @ernest_k 你能帮我看看它是如何抛出 NullPointerException 的吗,抱歉我是 Java 新手。
  • @JoachimSauer 不幸的是,我无法覆盖 ConfigureMathOperations,因为它是一个库函数,它执行最终任务

标签: java string stringbuilder


【解决方案1】:

要直接回答问题,您可以使用流将 StringBuilder[] 轻松转换为 String[]:

String[] arr = Arrays.stream(sbCmd).map(StringBuilder::toString).toArray(String[]::new);

...但是:

我在这里尽量避免使用 String[],因为它是不可变的(我有一些敏感数据需要在函数调用后清除)。

你无法避免。如果你有一个库函数需要一个字符串数组,那么你必须提供一个字符串数组——这显然需要使用字符串。

您唯一的其他选择是分叉库并删除字符串的使用。请注意,这可能是一个耗时且乏味的操作 - 它并不像确保没有传入字符串 parameters 那样简单(因为库函数可以轻松调用 sb.toString()并获得一个字符串。)

更实用的方法是不用担心字符串会留在内存中,而是在安全、隔离的环境中运行代码,并让环境发挥作用。

【讨论】:

  • 谢谢你,我会尝试重新审视这个方法
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2014-07-13
  • 2021-07-26
相关资源
最近更新 更多