【问题标题】:Java String Masking using concatenation使用连接的 Java 字符串掩码
【发布时间】:2018-10-17 04:00:05
【问题描述】:

使用串联屏蔽这样的数据有什么问题?

linkedNumber = linkedNumber.substring(0,3)+"XXXXXXXX"+ linkedNumber.substring(linkedNumber.length-4);

这会导致什么性能问题? StringBuilder 怎么帮到这里?

【问题讨论】:

  • 您能否包含一些您想要屏蔽的示例字符串?很难回答你上面写的内容。
  • 您知道String 连接是实现StringBuilder 的吗?为什么您认为这会导致性能问题?
  • 仅供参考:如果将缺少的 () 添加到 length 方法调用中,代码可能会更好地工作,即编译。

标签: java string string-concatenation


【解决方案1】:

当我们进行像 concat、substring 等字符串操作时,它会为操作函数的结果创建新的字符串对象,并使符合条件的旧字符串用于垃圾回收。因此,这些操作很繁重,会在堆内存中生成新对象和大量垃圾。

StringBufferStringBuilder 是 java 中的可变对象,并为字符串操作提供 append()、insert()、delete() 和 substring() 方法。

StringBuffer 提供线程安全,但由于其方法是同步的,因此会降低性能,但 StringBuilder 不是线程安全的。因此,如果您不关心线程安全(单线程环境),请使用 StringBuilder 以获得更好的性能。

【讨论】:

  • 有人否决了我的回答。我可以知道上面的答案有什么问题吗?
【解决方案2】:

使用串联屏蔽这样的数据有什么问题?

没什么,只要您确保 linkedNumber 至少有 4 个字符长,但代码只有在超过 7 个字符长时才有意义。

这会导致什么性能问题?

无。

StringBuilder 在这里如何提供帮助?

通过不为 2 个子字符串创建中间 String 对象,以下代码可能会在微观上更快,但我怀疑你会注意到它,因为它们太小(分别为 3 个和 4 个字符)。

linkedNumber = new StringBuilder()
        .append(linkedNumber, 0, 3)
        .append("XXXXXXXX")
        .append(linkedNumber, linkedNumber.length() - 4, linkedNumber.length())
        .toString();

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2013-08-29
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多