Vector、ArrayList、LinkedList

Vector、ArrayList、LinkedList的区别

一般差别

  • Vector:
    是Java早期提供的线程安全的动态数组。内部使用对象数组来保存数据,可以自动增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。
  • ArrayList:
    由动态数组实现,其本身不是线程安全的,所以性能较高。也可自动扩容。与Vector的区别是 Vector 是增加 1 倍,而ArrayList是增加50%。
    扩容是调用底层 System.arraycopy()方法进行大量的数组复制操作;在删除元素时并不会减少数组的容量(如果需要缩小数组容量,可以调用trimToSize()方法);在查找元素时要遍历数组,对于非null的元素采取equals的方式寻找。
  • LinkedList :
    由双向链表实现,非线程安全的。
    LinkedList在插入元素时,须创建一个新的Entry对象,并更新相应元素的前后元素的引用;在查找元素时,需遍历链表;在删除元素时,要遍历链表,找到要删除的元素,然后从链表上将此元素删除即可。

使用场景上的区别

  • Vector ArrayList作为动态数组,其内部元素有数组形式顺序存储,非常适合需要随机访问的场合。除了尾部的插入或删除操作,其性能会相对较差,如在中间任意插入元素都需移动后续所有元素。
  • LikedList 进行节点的插入或删除操作效率更高,但随即访问性能较低。

一些其它问题

集合框架的设计是怎么样的?
类图:

在这里插入图片描述

Collection 接口是所有集合的根,然后扩展开提供了三大类集合,分别是:

  • List,也就是我们前面介绍最多的有序集合,它提供了方便的访问、插入、删除等操作。

  • Set,Set 是不允许重复元素的,这是和 List 最明显的区别,也就是不存在两个对象 equals 返回 true。我们在日常开发中有很多需要保证元素唯一性的场合。

  • Queue/Deque,则是 Java 提供的标准队列结构的实现,除了集合的基本功能,它还支持类似先入先出(FIFO, First-in-First-Out)或者后入先出(LIFO,Last-In-First-Out)等特定行为。这里不包括 BlockingQueue,因为通常是并发编程场合,所以被放置在并发包里。

Set 相关实现的基本特征和典型使用场景?
  • TreeSet 支持自然顺序访问,但是添加、删除、包含等操作要相对低效(log(n) 时间)。
  • HashSet 则是利用哈希算法,理想情况下,如果哈希散列正常,可以提供常数时间【O(1)】的添加、删除、包含等操作,但是它不保证有序。
  • LinkedHashSet,内部构建了一个记录插入顺序的双向链表,因此提供了按照插入顺序遍历的能力,与此同时,也保证了常数时间的添加、删除、包含等操作,这些操作性能略低于 HashSet,因为需要维护链表的开销。
  • 在遍历元素时,HashSet 性能受自身容量影响,所以初始化时,除非有必要,不然不要将其背后的 HashMap 容量设置过大。而对于 LinkedHashSet,由于其内部链表提供的方便,遍历性能只和元素多少有关系。
Java 提供的默认排序算法,具体是什么排序方式以及设计思路?

这个问题本身就是有点陷阱的意味,因为需要区分是 Arrays.sort() 还是 Collections.sort() (底层是调用 Arrays.sort());什么数据类型;多大的数据集(太小的数据集,复杂排序是没必要的,Java 会直接进行二分插入排序)等。

  • 对于原始数据类型,目前使用的是所谓双轴快速排序(Dual-Pivot QuickSort),是一种改进的快速排序算法,早期版本是相对传统的快速排序。
  • 而对于对象数据类型,目前则是使用TimSort,思想上也是一种归并和二分插入排序(binarySort)结合的优化排序算法。TimSort 并不是 Java 的独创,简单说它的思路是查找数据集中已经排好序的分区(这里叫 run),然后合并这些分区来达到排序的目的。
List.of() 方法?

Java 9 中,Java 标准类库提供了一系列的静态工厂方法,比如,List.of()、Set.of(),大大简化了构建小的容器实例的代码量。

相当一部分集合实例都是容量非常有限的,而且在生命周期中并不会进行修改。但是,在原有的 Java 类库中,我们可能不得不写成:

ArrayList<String>  list = new ArrayList<>();
list.add("Hello");
list.add("World");

而利用新的容器静态工厂方法,一句代码就够了,并且保证了不可变性。

List<String> simpleList = List.of("Hello","world");

优点上它是不可变的,符合我们对线程安全的需求;它因为不需要考虑扩容,所以空间上更加紧凑等。

需要实现一个云计算任务调度系统,希望可以保证 VIP 客户的任务被优先处理,可以利用哪些数据结构或者标准的集合类型呢?

利用PriorityBlockingQueue或Disruptor可实现基于任务优先级为调度策略的执行调度系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值