Java数据结构

Interface List

该接口存在两个最常用的实现,即ArrayList和LinkedList。 让我们更深入地了解每个

ArrayList

从该结构的名称,我们知道内部使用简单数组。 但是此结构具有动态大小。 被允许sureCapacity()增加使用的简单数组的方法。 当此方法调用时-它检查已用阵列的加载,并在需要时创建一个新阵列,其容量等于当前+当前的60%。 通过调用系统数组复制方法,我们将所有元素从旧数组复制到新数组。 获取和删除元素需要O(1)-恒定的时间,因为我们有一个简单的数组。 按索引查找操作需要O(n)操作,因为我们必须遍历所有数组。

LinkedList

This structure based on object which have links to the next and previous objects in the list. This structure have only one benefits from ArrayList, inserting at the begin execute faster than it execute at the ArrayList. So, this structure may be good for some tasks, but I have not faced with this tasks.
ArrayList vs LinkedList

Stack

这种结构为我们提供了下一个方法-推,弹出,轮询。 此外,它还实施了LIFO,这意味着后进先出。 例如,如果我们将堆栈元素10、2、123-调用pop或roll,我们得到123。但是pop从堆栈中删除123。 轮询不会从堆栈中删除元素。 在内部,它使用一个简单的数组。

Interface Set

Set
This data structures created for store only unique elements. How to check that element is not contained at the collection. For this we have a few implementation. Let's talk about it. First HashSet implementation will be compare elements by calling equals from the object. Second TreeSet may store only elements which implements Comparable interface, or you must be provide an comparator through constructor implementation for your TreeSet.

HashSet

在其内部使用HashMap,它可能仅存储唯一键。 这种结构不能保证插入顺序,这意味着试图遍历此集合,我们会从插入顺序中以其他顺序获得元素。 此实现的基本操作时间恒定-添加,删除,包含,大小。 它由执行恒定时间的哈希函数提供。

TreeSet

如果HashSet基于HashMap,则TreeSet基于TreeMap。 该数据结构保证了诸如添加,删除和包含之类的操作的时间O(log(n))。 提供此信息是因为在TreeMap中使用Tree。 此集合保证自然排序。 例如:

Set numbers = new TreeSet<>();

numbers.add(2);

numbers.add(1);

for(Integer number : numbers) { System.out.println(number);} 

在控制台上将打印

1
2

LinkedHashSet

此集合下一个很有名-与以前的实现不同,它保证插入顺序。 因此,通过遍历此数据结构,您将看到其插入顺序中的元素。 像以前的set实现一样,在内部使用LinkedHashMap。 当我们尝试添加元素时,已添加到集合中-此操作不会影响元素的顺序。 对于基本操作,它提供了一个持续时间O(n)用于添加,删除和包含操作。 允许包含空元素。 为了实现此集合的性能,请使用两个变量-initialCapacity和loadFactor。 首先描述内部使用地图的初始容量,其次声明何时必须增加地图上存储桶使用次数。

EnumSet

此实现是专门为Enum类型创建的。 如果传递给此方法EnumSet实例,则每个大容量操作(例如containsAll,retainAll)将更快地执行。 遍历此集合时,您将看到元素的自然顺序。 返回的迭代器不会引发ConcurrenctModificationException。 同样,迭代器可能会显示修改,而可能不会显示修改。 所有基本操作同时执行。

NavigableSet

这个实现有很好的选择,例如在集合上导航。 这意味着我们可能会获得比提供的尺寸更低或更大的元素。 同样,我们可能会得到我们提供的更大或更小的元素集。 同样,我们可以通过调用DescendingSet方法来逆转此集合

Interface Queue

该集合使用FIFO机制,即先进先出。 我们可能会在对其进行一些操作之前将其存储在此collection元素上。 存在所有基本操作,例如添加,删除。 但是,此方法存在于两个版本中。 如果操作失败,则第一个版本引发异常;如果另一个版本未引发异常,则返回一个特殊值,例如空值。 允许添加空值这个结构。 但是,实现此接口的LinkedList允许我们插入空值元素。 此方法未提供用于并发访问它的方法。 对于并发环境中的使用队列,请使用BlockingQueue,它提供了阻塞方法。

Deque

此实现使我们可以同时处理队列的两端-开始和结束。 DE是双头的缩写。 可以创建严格的大小队列,也可以创建动态的大小队列。 作为Queue,还存在用于基本操作的两种方法版本。 如果操作失败,则一个版本会引发异常,而另一个版本会返回特殊值,这会向我们发出操作失败的信号。 索引访问不存在。

ArrayQueue

从名称中我们可以清楚地了解到,此队列基于简单数组。 不限制大小,并在需要时确保阵列的容量。 在摊销时间内执行了更多操作。

PriorityDeque

Main principle work of this queue implementation is when we add new element to the collection will be call sort method for correct order at the collection. What is priority at this context? Simple, as TreeSet you element must be comparable by some attribute which you must choosed or you must be provide comparator for correct order of your elements at this collection. When you call methods poll(not remove from this collection) you got element which have a greatest priority at the current moment. This collection provided logariphm speed for operations such as add/offer, remove/pull and linear time for operations such as contains.
Stack Queue

Interface Map

Map

HashMap

从名字上我们就清楚这个结构里面使用了哈希函数。 同样,这种结构允许我们将空元素用作键或值。 对此进行迭代时,您会看到元素不按插入顺序排列。 为了实现此结构的性能,请使用通过构造函数传递给它的两个参数。 它是负载系数和初始容量。 初始容量确定存储桶的数量。 负载因子确定何时调用方法以确保存储桶数。

ConcurrentHashMap

此地图实现需要并发使用。 而是使用哈希映射,这是该映射的线程安全实现。 该映射的实体标记为volatile,这意味着所有线程都必须具有该实体的实际版本。

NavigableMap

此接口扩展了SortMap界面,并添加了在地图元素之间导航的方法-lowerEntry,floorEntry,ceilingEntry,higherEntry。 此方法可能会返回空值。 可以通过调用DescendingMap遍历直线和反向顺序。 还具有导航方法,该方法提供了提取地图等部分地图的方法。 (sub / head / tail)Map方法的上下边界包括在内。 它具有用于获取last和first元素的方法,因为在Queue处存在此方法的两个版本。

TreeMap

它是基于可导航地图的红黑树。 元素以自然顺序或由必须在构造函数中提供的比较器进行排序。

Common

所有这些结构,排除ConcurentHashMap不是线程安全的。 这意味着如果您想拥有一些必须具有共享资源的线程。 所有这些都不适合您的任务。

当您尝试在遍历操作中修改集合时,也会注意到ConcurrentModificationException您将在遍历操作中尝试更改收集的信号。 不允许! 对于此操作,我们必须使用位于Java特殊包中的并发数据结构。

UPD: 在评论中也注意到ConcurrentModificationException当您在循环中尝试删除元素时将被抛出。 如果您想在迭代时从集合中删除一些元素。 应该使用迭代器:

while(iterator.hasNext()) {
    if (iterator.next() == 1) {
        iterator.remove();
    }
}

Thank for you!

在推特上关注我:@VoronyanskyE

from: https://dev.to//vrnsky/java-data-structures-417e

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值