当前位置: 首页 > 知识库问答 >
问题:

将番石榴集转换为列表的最快方法

子车俊材
2023-03-14

我甚至不确定这是否可能,但我正在执行一个集合操作,如联合交集,我需要将其转换为列表以便洗牌列表并将其传递给接受列表而不是的其他方法。因此,我将结果转换为列表并且一切都很好。但是从探查器中,我看到操作在负载下花费了很长时间,这是因为Guava设置.size()的方式。它不像普通java集那样是一个常量操作。

下面是代码示例

    @Test
    void testSet() {
        Set<Character> first = ImmutableSet.of('a', 'b', 'c');
        Set<Character> second = ImmutableSet.of('b', 'c', 'd');

        Set<Character> union = Sets.union(first, second);

        List<Character> characters = new ArrayList<>(union);
    }

我正在尝试找到将番石榴转换为列表的最快方法。通过挖掘代码,这就是Guava Sets所做的工作https://github.com/google/Guava/blob/master/Guava/src/common/collect/Sets.java#L694。这不是一个恒定的操作,它损害了高负载下的性能。我猜.size调用是从Java想要将一个新集合复制到一个新列表时开始的,它必须知道创建列表的大小。

共有1个答案

闻人举
2023-03-14

抛开“高负载下的性能”这一论点不谈(如果它在您的用例中确实相关的话,我建议使用适当的JMH微基准测试),sets操作是内存优化的,因此如果您要立即复制数据,您可能希望尝试完全不调用大小的不同方法。

首先,sets.union返回setview ,该视图具有immutablecopy(),然后您可以在该视图上调用.aslist()视图,返回一个不可变的列表(可以将所有操作链接在一起):

@Test
public void testSetCopy() {
    Set<Character> first = ImmutableSet.of('a', 'b', 'c');
    Set<Character> second = ImmutableSet.of('b', 'c', 'd');

    Sets.SetView<Character> union = Sets.union(first, second);
    List<Character> characters = union.immutableCopy().asList();

    assertThat(characters).containsOnly('a', 'b', 'c', 'd');
}

第二,您也可以考虑在第一时间使用set,正如Louis提到的:

@Test
public void testMultiset() {
    Set<Character> first = ImmutableSet.of('a', 'b', 'c');
    Set<Character> second = ImmutableSet.of('b', 'c', 'd');

    // here it's ugly but maybe you can collect to set in the first place
    ImmutableMultiset<Character> set = ImmutableSet.<Character>builder()
             .addAll(first)
             .addAll(second)
             .build(); // [a, b, c, d]

    List<Character> characters = set.asList();

    assertThat(characters).containsOnly('a', 'b', 'c', 'd');
}

尽管如此,YMMV,我再次鼓励您在选择任何可读性较差的选项之前先进行微基准测试。

 类似资料:
  • 我想为番石榴设个坑(http://pitest.org/)进行突变熟练度测试,但我在尝试运行时出现以下错误。这是我得到的错误: 基本上,要么PIT没有检测到测试,要么测试在PIT中运行不正常,所有测试都失败了。我读了这篇文章:JUnit测试通过,但PIT说套件不是绿色的,我认为“您的代码库是否包含可变静态状态?(例如在单例中)”是问题所在,但我不知道如何修复它。如果测试套件有一些隐藏的顺序依赖关系

  • 问题内容: 我已经由我的用户组成。在数据库查询之后,我正在检索。我想根据第一个ID列表订购此列表。可能不包括某些ID。番石榴对列表进行排序的方式是什么? 问题答案: 使用番石榴的完全“功能性”方式将与 您可以内联声明一个匿名函数,但是我想在一个单独的类中将我的函数声明为静态工厂方法,以获取更简洁的代码(Java的函数声明的详细信息隐藏在实用程序类中): 正如@Arne在评论中提到的那样,可以在Ja

  • 问题内容: 我想对列表中的元素进行分组。我目前正在这样做: 是否有更好的方法来做到这一点,最好使用番石榴? 问题答案: 当然可以,并且使用Guava甚至更容易:)使用: 如果给出具体的用例,将更容易展示它的实际作用。 来自文档的示例: 版画 在您的情况下,如果GroupFunction定义为: 那么它将转换为: 这是Guava示例中可能使用的实现。 最后,在Java 8中,整个片段甚至可以变得更加

  • 问题内容: 刚刚发现了Guava库项目。 这些与GWT兼容吗? 问题答案: 从该页面的介绍性PDF中, 您可以在…上使用这些库。 在JDK 6上 在Android上, 我们认为。需要志愿者来帮助我们进行测试。 在Google App Engine上, 我们认为。需要志愿者来帮助我们进行测试。 在GWT上-参差不齐! 由于GWT的JDK库支持 可能参差不齐,也许是2/3,所以到目前为止,这些库中的东

  • 问题内容: 有一个对象,是否有比列表理解更快,更好或更正确的方法来获取迭代器返回的对象的列表? 问题答案:

  • 问题内容: 我有一个带有参数的方法,该参数可以为NULL。我想将输入的本地副本作为结束。现在,我的代码如下所示: 有没有更清洁的方法可以做到这一点?如果是一个简单的参数,我可以做类似的事情,但是我不确定是否有类似处理集合的事情。 问题答案: 我不明白为什么您不能使用: 您可以使用静态导入保存某些类型的输入,如果您要这样做的话: