【问题标题】:Fastest way to gather the unique data from a List in Java从 Java 列表中收集唯一数据的最快方法
【发布时间】:2012-02-21 19:53:34
【问题描述】:

我的问题的基础是 在 Java 中给定一个 List 对象,返回唯一数据集合的最快方法是什么?

更具体的版本是,我有一个 2d ArrayList(把它想象成一个表),我想遍历给定的列索引并返回唯一数据。

这是我目前的设置:

public Set<Object> getDistinctColumnData( int colIndex ) { 

    //dataByIndex = List<List<Object>>

    Set<Object> colDistinctData = new HashSet<Object>( dataByIndex.size() + 1, 1f ) ;

    for( List<Object> row : dataByIndex ) { 
        colDistinctData.add( row.get( colIndex ) ) ;
    }

    return colDistinctData ; 

}

当我将初始容量设置为非不同集的大小加一并将负载因子设置为 1 时,我获得了小的性能提升(我的想法是在达到 100% 之前它不需要增长,并且即使原始集合已经 100% 不同也不应该发生(或者我错了吗?))。

有没有更快的方法?

【问题讨论】:

  • 投反对票的人愿意给出理由吗?
  • 我会使用 (dataByIndex.size() *3/2) 作为初始大小并保留负载因子,除非您预计会有很多重复。
  • 您的代码看起来不错。做点别的事情。
  • 我假设您在确定这是麻烦的部分之前对您的代码进行了一些分析(例如使用 jvisualvm)。
  • 您的列表的大小可能是多少?

标签: java performance hashset


【解决方案1】:

我认为,如果您只有两个独特的集合,它会更快。维护你的dataByIndex 列表,还要维护一个dataSet 集合(Set)。当您插入 dataByIndex 列表时,也放入您的 dataSet 集。然后只需在需要的地方使用您的数据集。集合作为集合的性质将保持唯一性。

【讨论】:

  • 我已经考虑过了。将处理移至添加行时。但是添加数据的性能损失(这比获取不同的数据更频繁地发生)并不值得获得不同的数据。
  • 您是否对差异进行了基准测试?这应该是一个相对简单的代码更改,我想你可能会对它的影响感到惊讶......
  • 如果,正如 OP 所说,插入比不同的查询更频繁(这是不寻常的,但我们没有理由怀疑它),那么确实维护一个单独的不同集可能会影响性能改进它。
  • 如果没有删除,为什么增量而不是批处理会影响性能?
【解决方案2】:

我认为将容量和负载系数设置为您指定的值没有多大意义。你用什么散列函数?会不会降级为链表?

【讨论】:

    【解决方案3】:

    如果您进一步增加 HashSet 的初始容量,您可能会获得进一步的性能提升(平均而言)。这是因为列表中对象的哈希值分布可能更容易发生冲突。

    例如,给定以下列表,尽管没有重复值,但除了第一次插入之外的所有内容都将导致冲突。 (整数的 Java 哈希函数是整数本身的值,HashSet 使用开放寻址和线性探测以防发生冲突)。

    [0,10,1,2,3,4,5,6,7]
    

    甚至更糟,因为每次插入都必须在插入之前检查每个非空闲空间。

    [0, 5, 25, 125]
    

    在最后一个示例中,0 被放入索引 0。5 最初进入索引 0,因为 5 % 大小(即 5)等于 0,然后进入索引 1。125 将进入索引 0,但 0 位于索引 0、5 在索引 1 和 25 在索引 2。这意味着经过三次检查后,125 最终可以插入到索引 3。

    如果您增加初始容量,则会降低碰撞概率(平均而言),并减少发生碰撞时所需的检查次数(平均而言也是如此)。默认情况下,java 使用 0.75 的负载因子作为性能和内存使用之间的良好平衡。所以除以 0.75 的负载因子并加 1 应该会给你一个很好的初始容量。

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      相关资源
      最近更新 更多