【问题标题】:How to avoid duplicate strings in Java?如何避免Java中的重复字符串?
【发布时间】:2013-08-28 14:25:10
【问题描述】:

我希望能够将文本中的特定单词添加到向量中。现在的问题是我想避免添加重复的字符串。我想到的第一件事是在添加之前比较所有字符串,随着条目数量的增长,这变得非常低效。我能想到的唯一“节省时间”的解决方案是 C++11 中包含的 unordered_multimap 容器。我找不到与之等效的Java。我正在考虑将字符串添加到地图中,最后只是将所有条目复制到向量中,这样它会比第一个解决方案更有效。现在我想知道是否有任何 Java 库可以满足我的要求?如果没有,在 Java 中是否有任何我找不到的 C++ unordered_multimap 容器等价物?

【问题讨论】:

  • 你考虑过使用 Set 吗?
  • 如答案中所述,避免使用Vector;它高度同步,因此速度很慢。更喜欢List,或者在你的情况下,只是Set

标签: java string map containers


【解决方案1】:

您可以使用Set<String> 集合。它不允许重复。您可以选择 then 作为实现:

1) HashSet 如果您不关心元素(字符串)的顺序。

2) LinkedHashSet 如果你想保持元素的插入顺序。

3) TreeSet 如果要对元素进行排序。

例如:

Set<String> mySet = new TreeSet<String>();
mySet.add("a_String");
...

Vector 在 Java 中是“老式的”。你最好避免它。

【讨论】:

【解决方案2】:

你可以使用一个集合(java.util.Set):

Set<String> i_dont_allow_duplicates = new HashSet<String>();
i_dont_allow_duplicates.add(my_string);
i_dont_allow_duplicates.add(my_string); // wont add 'my_string' this time.

HashSet 会最高效完成这项工作,如果您想保持插入顺序,则可以使用LinkedHashSet

【讨论】:

    【解决方案3】:

    使用Set。如果您不需要保留订单,HashSet 就可以了。如果您需要,LinkedHashSet 可以使用。

    【讨论】:

      【解决方案4】:

      您应该考虑使用Set

      不包含重复元素的集合。更正式地说,集合 不包含元素对 e1 和 e2 使得 e1.equals(e2),并且在 最多一个空元素。正如它的名字所暗示的,这个接口模型 数学集合抽象。

      HashSet 应该适合你使用:

      HashSet 类实现了 Set 接口,由哈希表支持 (实际上是一个 HashMap 实例)。它不保证 集合的迭代顺序;特别是,它不保证 随着时间的推移,订单将保持不变。此类允许 null 元素。

      所以只需像这样定义一个 Set 并适当地使用它:

      Set<String> myStringSet = new HashSet<String>();
      

      【讨论】:

        【解决方案5】:
        Set<String> set = new HashSet<String>();
        

        hashCode的通用合约是:

        在 Java 应用程序执行期间,只要在同一个对象上多次调用它,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。

        这个整数不需要从一个应用程序的一次执行到同一应用程序的另一次执行保持一致。

        如果两个对象根据equals(Object)方法相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。

        如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

        【讨论】:

          猜你喜欢
          • 2011-07-01
          • 2021-08-11
          • 1970-01-01
          • 1970-01-01
          • 2019-03-07
          • 1970-01-01
          • 2020-06-27
          • 2011-08-02
          • 2018-07-19
          相关资源
          最近更新 更多