【发布时间】:2020-01-02 23:41:05
【问题描述】:
包存储在数组中。我知道我们可以根据需要更改包的大小等。但是,由于它存储在数组中,它基本上有一个索引号,不是吗?这种情况下,为什么还要说它是无序的呢?
【问题讨论】:
包存储在数组中。我知道我们可以根据需要更改包的大小等。但是,由于它存储在数组中,它基本上有一个索引号,不是吗?这种情况下,为什么还要说它是无序的呢?
【问题讨论】:
包存储在数组中
不,他们不是。
实际上,它们可能是,具体取决于实现,但它们肯定不是必须的。这就像说List 存储在一个数组中。那是例如ArrayList 为真,LinkedList 则不为真。
那么bag、list和set有什么区别呢?
列表是有序的,允许重复
ArrayList 实现使用数组,按位置快速查找。LinkedList 实现使用双向链接节点,在列表开头快速插入/删除。集合是无序的,没有重复
HashSet 实现是无序的。LinkedHashSet 实现是有序的。TreeSet 实现已排序。包是无序的,允许重复
List。是术语的定义,它指定了 有序 与 无序 语义。包的实现可能会保持排序,但通用术语包不需要它。
让我们澄清一下关于 Java 中 bags 的困惑。
Java 运行时库没有任何 Bag 类型。
Apache Commons Collections™ 库有一个实现java.util.Collection 的Bag 接口,尽管它违反了Collection 协定。它有一个HashBag 和一个TreeBag 实现,但没有使用数组实现。
Google Guava 库有一个名为 Multiset 的包接口,它还实现了 java.util.Collection。它有 HashMultiset、LinkedHashMultiset 和 TreeMultiset 实现,但没有使用数组的实现。
Hibernate ORM 有一个Bag 类。
它们都没有指定一个包是一个列表,也没有一个使用数组来实现包。
【讨论】:
Bag 类型。