当前位置: 首页 > 面试题库 >

避免在Java中使用重复的字符串

康照
2023-03-14
问题内容

我想问一个有关在Java中避免字符串重复的问题。

情境 是:以标签和属性像这样的一个XML:

<product id="PROD" name="My Product"...></product>

使用JibX,此XML将在如下所示的类中进行编组/解组:

public class Product{
private String id;
private String name;
// constructor, getters, setters, methods  and so on
}

该程序是长时间的批处理,因此将创建,使用,复制产品对象。

好吧, 问题 是:当我使用 Eclipse内存分析器(MAT)之 类的软件分析执行时,我发现了几个重复的String。例如,在id属性中,
PROD 值在2000个实例左右重复, 以此类推

如何避免这种情况?Product类中的其他属性可能会在执行过程中更改其值,但 idname 等属性不会经常更改。

我已经读过一些有关 String.intern()
方法的信息,但是我还没有使用过,所以我不确定这是否是解决方案。我可以在这些属性中定义最频繁的值,例如类中的 静态最终 常量吗?

我希望我以正确的方式表达了我的问题。任何帮助或建议,我们将不胜感激。提前致谢。


问题答案:

__如果您确实有问题,那么 实习 是正确的解决方案。Java将String文字和许多其他String存储在内部池中,并且每当
创建新的String时,JVM都会首先检查该String是否已在池中。如果是,它将不会创建新实例,而是将引用传递给 被嵌入的 String对象。

有两种方法可以控制此行为:

String interned = String.intern(aString); // returns a reference to an interned String
String notInterned = new String(aString); // creates a new String instance (guaranteed)

因此, 也许 这些库确实为所有xml属性值创建了新实例。这是可能的,您将无法更改。

实习生 具有全球影响力。可以立即对“任何对象”使用一个Interned String(此视图实际上没有任何意义,但可能有助于理解它)。

因此,假设我们在class Foo,method中有一行foolish

String s = "ABCD";

字符串文字立即被插入。JVM检查池中是否已经有“ ABCD”,如果没有,则将“ ABCD”存储在池中。JVM将对内部字符串的引用分配给s

现在,也许在另一个类Bar的方法中barbar

String t = "AB"+"CD";

然后,JVM将像上面那样实习“ AB”和“ CD”,创建串联的String,看一下(如果已经被嵌入),嘿,是的,并将对嵌入的字符串“
ABCD”的引用分配给t

呼叫"PROD".intern()可能成功或失败。是的,它
实习生字符串"PROD"。但是,jibx确实有可能使用以下命令为属性值创建新的字符串:

String value = new String(getAttributeValue(attribute));

在这种情况下, value 不会引用内部String(即使"PROD"在池中),而是引用堆上的新String实例。

而且,对于命令中的另一个问题:这仅在运行时发生。编译仅创建类文件,字符串池是对象堆上的数据结构,并且由JVM使用,执行应用程序。



 类似资料:
  • 我正在尝试转义字符串中的XML特殊字符。转义由静态方法处理,如下所示。 现在,这种实现的问题是,我得到了一段字符串,它可能被解析,也可能不被解析。这导致输出不规则。 例如: 现在,为了得到正确的响应,我计划在静态方法中引入一个检查。通过使用if条件,如下所示。 这是一种正确的实施方式吗?如果不是,请提出建议?

  • 问题内容: 我有以下(也许是常见的)问题,此刻绝对使我感到困惑: 有几个生成的事件对象扩展了抽象类,我想将它们划分为Session Bean,例如 但是将来可能会有两种以上的事件类型,因此if- else将会很长,甚至可能无法读取。另外,在这种情况下,我认为这并不是真正的“最佳实践”。 我可以在类型中添加一个抽象方法,并让它们自行划分,但随后我必须在每个实体中注入特定的Session Bean。

  • 问题内容: 具有“ instanceof”操作链被认为是“代码异味”。标准答案是“使用多态性”。在这种情况下我该怎么办? 基类有许多子类。他们都不在我的控制之下。类似的情况是Java类Integer,Double,BigDecimal等。 我确实可以控制等。 我不想使用几行代码就能完成的代码。(有时,我制作了一个HashMap将映射到的实例,将映射到的实例,等等。但是今天我想要一些更简单的方法。)

  • 本文向大家介绍避免在MongoDB中重复输入?,包括了避免在MongoDB中重复输入?的使用技巧和注意事项,需要的朋友参考一下 为了避免在MongoDB中重复输入,可以使用。语法如下- 让我们实现以上语法。避免在MongoDB中重复条目的查询如下- 现在在上面的集合中插入一些记录。插入记录的查询如下- 每当您尝试再次插入相同记录时,都会出现此错误- 让我们插入另一条记录。查询如下- 在method

  • 你好,我有一个简单的mysql查询,我需要显示唯一的文件名,现在查询显示重复的文件名,我想避免这种情况

  • 我试图创建一个名为“回文”的方法,该方法接收一个字符串,如果该字符串是回文,则返回布尔值true,否则返回false。如果一个单词向前和向后读都一样,那么它就是一个回文。比如level这个词就是一个回文。 例如,通过考虑通过删除所有空格和标点符号并将所有字母转换为小写形式获得的文本,将其转换为回文: 女士,我是亚当== 一个人,一个计划,一条运河:巴拿马== 我尝试处理我使用并输出作为替换all的