【问题标题】:Java: convert a char[] to a CharSequenceJava:将 char[] 转换为 CharSequence
【发布时间】:2010-09-22 21:53:18
【问题描述】:

char[] 转换为CharSequence 的最直接和/或有效的方法是什么?

【问题讨论】:

  • 只是好奇!为什么需要 CharSequence?
  • 因为我正在写一个 Appendable。

标签: java string


【解决方案1】:

StringCharSequence。所以你可以根据你的char[]创建一个新的String

CharSequence seq = new String(arr);

【讨论】:

    【解决方案2】:

    没有副本:

    CharSequence seq = java.nio.CharBuffer.wrap(array);
    

    但是,new String(array) 方法可能更容易编写、更容易阅读和更快。

    【讨论】:

    • 我选择了最直接的方式。你的可能是最有效率的,我猜你不能两者兼得
    • 直接?更直接不要复制,确定吗?但是 CharBuffer 子类代码可能没有很好地执行,所以最终可能会变慢。
    • 我不知道你为什么认为 CharBuffer.wrap 会更慢?仅仅因为代码不够成熟?当然,如果我在一个紧密的循环中这样做,我应该更喜欢无副本版本?
    • 在处理恰好包含密码的 char[] 时,不制作副本且不使用字符串非常重要。因此,您的 CharBuffer.wrap 解决方案在这种情况下效果很好。沿着这条路径查看源代码时,我也没有看到任何速度问题。
    • @tackline -- 这个答案现在已经 10 岁了。我想知道您是否仍然认为 CharBuffer 可能比将数组复制到 String 中要慢?
    【解决方案3】:

    上下文:

    char[] 代替 String 的最常见用法之一是“临时”存储机密/密码。将它传递给一些服务/客户端的初始化......在这样的初始化之后不需要 sercrets。但是在java中字符串是不可能从内存中清除的(手动也不是垃圾回收)......所以,基本上禁止在字符串中存储秘密。

    推荐方式:将secrets加载到char[],传递给init进程,然后手动清除(设置forEach char[i] = '0';)。 在专门的博客上阅读有关此问题的信息...

    问题/答案:

    • 如果 service/cliets API 只接受 pass/secret 作为字符串 - 不要使用它(并报告错误)
    • 如果 service/cliets API 接受 char 数组,使用它并清除它
    • 如果 service/cliets API 接受 CharSequence,java.nio.CharBuffer.wrap(array) 可以使用并在之后清除

    注意:不幸的是,甚至必须检查 3rd 方服务/客户端初始化源代码,碰巧他们将 char 数组转换为代码中某个深处的字符串...)-: 明智地选择您的依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 2011-01-26
      相关资源
      最近更新 更多