【问题标题】:How can I get byteSize of String Array other than traversing the Array除了遍历数组之外,如何获取字符串数组的字节大小
【发布时间】:2015-01-27 14:37:04
【问题描述】:

我想通过使用 ByteBuffer 代替 String 来优化我的代码。我得到的是字符串 []。我正在对它的每个元素进行格式化。

例如String strAry[] = {"Help", "I", "am", "trapped", "in", "a", "fortune", "cookie", "factory"};

是我的字符串数组,我正在将它的内容写入 .csv 文件 格式 "StrArray[0]";"StrArray[1]";"StrArray2";"StrArray[3]";等等……

它在内部创建多个字符串,并且这段代码在一段时间内循环运行了数十万次。

我想实现ByteBuffer。在创建时

ByteBuffer bbuf = ByteBuffer.allocate(bufferSize);我需要在这里指定缓冲区大小。

我不想遍历 String [] 的每个元素来计算它的 byteSize。

感谢任何帮助。

【问题讨论】:

  • 而且你不能使用StringBuffer来完成这项工作?
  • 是的,我可以,但是当这个过程运行多次时。创建了 n 个 StringBuffers,最后我需要将其转换为 String,因此在单次运行中,一个 StringBuffer 和一个 String 被创建,这是内存消耗过程。
  • 由于对象内存的性质,某处的东西需要遍历字符串数组以获得每个字符串的字节大小,因为这不是已知的信息在数组的级别;使用 StringBuffer 可能是最好的,但如果您专门使用 ByteBuffer,则需要遍历所有字符串并求和它们的字节大小。
  • 目前还不清楚为什么使用 ByteBuffer,甚至 StringBuffer 或 StringBuilder BTW,对创建 CSV 文件很有用。这肯定看起来像是不必要的过早优化。写入文件比处理内存中的字符串慢几个数量级。所以优化字符串处理可能不会导致任何显着差异。
  • @JBNizet 我需要写入 csv 文件的数据还没有准备好转储到文件中。我正在使用不同的参数逐行创建文件的内容,其中包括很多字符串操作。此过程重复数千行。我正在尝试优化我的程序以使用更少的内存并最小化垃圾收集过程。

标签: java arrays string bytebuffer


【解决方案1】:

几个笔记:

  1. 数据结构使用
    • 我认为您应该使用 CharBuffer 而不是 ByteBufferCharBuffer 需要字符数而不是字节数。
      • Java NIO 中的缓冲区始终用作缓冲区,这意味着您可能需要多次读取它们。
      • 如果您需要将全部内容保存在内存中,则缓冲区不是此用例的数据结构。
      • 您不必知道缓冲区的确切大小,分配的大小是缓冲区的最大容量。
    • StringBuilder 是用于字符串处理的可变数据结构。您可以考虑改用它。
      • 您不必知道确切的尺寸。
  2. 最终尺寸的计算
    • 可以使用 Stream API (Java 8) 或类似的实用方法来完成。

【讨论】:

  • 是的,我将在内部使用 CharBuffer 进行字符串操作,但 Charbuffer 的初始化也采用与 ByteBuffer 相同的输入大小。例如CharBuffer chbuff = CharBuffer.allocate(buffer_size); CharBuffer 或 ByteBuffer 的 Size 是否可以动态增加。我当前的实现确实使用了 StringBuffer。
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 2017-04-28
  • 2014-06-16
  • 2017-04-22
  • 2015-11-27
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多