对比 Vector、ArrayList、LinkedList 有何区别?

《Java核心技术面试精讲–杨晓峰》学习笔记目录

写这里的时候我是很迷茫的,下面这张图就是我对集合这部分了解的全部了。老师在集合这部分涉及到了许多算法的知识,我算法的程度仅到了解几个简单的排序算法。几乎每章都会对线程安全问题进行分析,线程我就记了一个锁机制。还有 jdk 源码的一些分析,我根本看不下去。JVM 的内容,我也没学过。导致我看集合这部分的文章几乎什么都没学到,我尽量整理一些我能理解的内容。理解不了的就暂时放着了。大家想了解这部分的内容的话,先去看其他人写的吧。

容器

在这里插入图片描述

三者的区别

  • Vector‘Vector的所有方法都是同步的,可以由两个线程安全的访问一个Vector对象。因此在不需要保证线程安全的情况下,不建议使用。底层是数组实现
  • ArrayList:不保证线程安全,因此效率比Vector高很多。底层是数组实现。
  • LinkedList:底层是双向链表实现,因此新增和删除的效率会比ArrayList高很多。

集合

我们可以看到 Java 的集合框架,Collection 接口是所有集合的根,然后扩展开提供了三大类集合,分别是:

  • List,也就是我们前面介绍最多的有序集合,它提供了方便的访问、插入、删除等操作。
  • Set,Set 是不允许重复元素的,这是和 List 最明显的区别,也就是不存在两个对象 equals 返回 true。我们在日常开发中有很多需要保证元素唯一性的场合。
  • Queue/Deque,则是 Java 提供的标准队列结构的实现,除了集合的基本功能,它还支持类似先入先出(FIFO, First-in-First-Out)或者后入先出(LIFO,Last-In-First-Out)等特定行为。这里不包括 BlockingQueue,因为通常是并发编程场合,所以被放置在并发包里。

Java 提供的默认排序算法,具体是什么排序方式以及设计思路。

需要区分是Arrays.sort()还是Collections.sort()(底层是调用Arrays.sort());什么数据类型;多大的数据集(太小的数据集,复杂排序是没必要的,Java会直接进行二分插入排序)等

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

Java 8引入了并行排序算法(直接使用parallelSort方法),这是为了充分利用现代多核处理器的计算能力,底层实现基于fork-join框架(专栏后面会对fork-join进行相对详细的介绍),当处理的数据集比较小的时候,差距不明显,甚至还表现差一点;但是,当数据集增长到数万或百万以上时,提高就非常大了,具体还是取决于处理器和系统环境。

集合框架的演进和发展

Java8

在 Java 8 之中,Java 平台支持了 LambdaStream,以支持类似为集合创建相应 stream 或者 parallelStream 的方法实现,我们可以非常方便的实现函数式代码。这些 API是以默认方法的形式实现在 Collection 这样的接口里!这是 Java 8 在语言层面的新特性,允许接口实现默认方法

Java9

Java 标准类库提供了一系列的静态工厂方法,比如,List.of()、Set.of(),大大简化了构建小的容器实例的代码量。
例:List<String> simpleList = List.of("Hello","world");

补充

Java默认排序算法

双轴快速排序
TimSort
并行排序算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章