栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Java中维护唯一列表?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Java中维护唯一列表?

您可以使用Set实现:

来自JAVADoc的一些信息:

一个不包含 重复元素的集合
。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)最多包含一个空元素。顾名思义,此接口对数学集合抽象进行建模。

注意:
如果将可变对象用作集合元素,则必须格外小心。如果对象的值以影响相等比较的方式更改,而对象是集合中的元素,则不指定集合的​​行为。此禁止的一种特殊情况是,不允许集合将自身包含为元素。

这些是实现:

  • 哈希集

该类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设哈希函数将元素正确地分散在存储桶中。遍历此集合需要的时间与HashSet实例的大小(元素的数量)加上后备HashMap实例的“容量”(存储桶的数量)之和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得过高(或负载因子过低),这一点非常重要。

迭代

HashSet
时,产生的元素的顺序是不确定的。

  • 链接哈希集

Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双向链接列表。此链表定义了迭代顺序,即将元素插入到集合中的顺序(插入顺序)。请注意,如果将元素重新插入到集合中,则插入顺序不会受到影响。(如果在调用之前s.contains(e)将返回true的情况下调用s.add(e),则将元素e重新插入到set
s中。)

因此,上面代码的输出…

     Set<Integer> linkedHashSet = new linkedHashSet<>(); linkedHashSet.add(3); linkedHashSet.add(1); linkedHashSet.add(2); for (int i : linkedHashSet) {     System.out.println(i); }

…一定是

    312
  • 树集

此实现为基本操作(添加,删除和包含)提供了保证的log(n)时间成本。默认情况下,他在迭代中返回的元素按其“
自然顺序 ”
排序,因此上面的代码…

     Set<Integer> treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(1); treeSet.add(2); for (int i : treeSet) {     System.out.println(i); }

…将输出以下内容:

    123

(您还可以将

Comparator
实例传递给
TreeSet
构造函数,使其以不同的顺序对元素进行排序。)

请注意,如果要正确实现Set接口,则由集合(无论是否提供显式比较器)维护的顺序必须等于equals。(有关与equals一致的精确定义,请参见Comparable或Comparator。)之所以如此,是因为Set接口是根据equals操作定义的,但是TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此两个从集合的角度来看,此方法认为相等的元素是相等的。即使集合的顺序与equals不一致,它的行为也是明确定义的;它只是不遵守Set接口的一般约定。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483376.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号