「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战
在所有的一个java面试过程当中,一个必考的题就是它的一个数据结构。我们纵观全局的来看一下Java 的一个基础数据结构所能提供给我们的一些分类和能力。
JDK 相关的提供给我们了各种基础的数据结构类有很多种,但是无外乎从 JDK6 开始到目前为止,基础的一些数据结构主要就包含以下的这张图。
那在这张图内我们可以看到,所有的 Java 的数据结构都继承自对应的一个interest迭代器这样的一个类当中。在这个迭代器类当中,它主要会区分开来两种虚的数据类型。第一种是集合类,我们把它叫做Collection 类。第二种是带映射关系的,我们把它叫做 Map 类。
我们首先来看一下集合类相关的一些分解方法。
集合类主要会分为两类,第一类是指它是有序可重复的,我们把它定义为 list。第二种是无序不可重复的,我们把它定义为 set。
那在无序不可重复的当中,我们仍然可以分为对应的无序和使对应的 set,强制的做有序的排序的一个set,分别是 Hashset 和 TreeSet。
那在无序的对应的这样的一个 set 当中,我们又可以使它保持对应的一个插入的顺序,我们把它叫做 LinkedHashSet。HashSet、LinkedHashSet 和 TreeSet 的区别虽然都是有序的,但是它的一个排序公式是不一样的。
保持顺序的一个 LinkedHashSet 的排序方式,主要是依照对 HashSet 的一个插入顺序去做排序的。
而 TreeSet 主要是使用我们插入的对象的 object 的 component 方法去做 component 的比较,才能够获得前后的一个顺序。因此 TreeSet 的有序和插入顺序无关,而是和被插入的对象所实现的 component 方法有比较大小的方法有关,而 LinkedHashSet 主要是和插入的顺序有关。
那接下来我们再来看一下有序可重复的一个List。有序可重复的 List往往是我们最熟悉,也是最常用的两种结构,分别是内部以数组方式去存储的 ArrayList,以及内部以链表方式是存储的 linkedList。
我们来看一下带映射关系的一个 Map 类。带映射关系的 Ma p类主要也是以无序和有序两种方式去区分的。
针对有序的,我们把它叫做 TreeMap。针对无序的,我们把它使用哈希槽的方式所填出来比较常用的一个 HashMap 。
然后仍然一样,HashMap 在添加了保持顺序的对应的一个 link 的指针之后,可以通过插入顺序去迭代访问的一个 LinkedHashMap 结构。
那我们再来总结一下,整个的我们所有的一个 Java的 数据结构都会继承自 Iterator 类可以用来做迭代便利,那主要分为带映射关系的 Map,以及不带映射关系的 Collection。
在带映射关系和不带映射关系,都需要去解决无序和有序的问题。因此会有set list、hashmap以及 treemap 的延伸。自然也会根据对应的不同的实现的子类去做能力的拓展。
我们来看一下面试官经常会考的问题。
arraylist和linkedlist的区别。针对 list来说,它能够区分出来说以数组方式去做实现的一个 arraylist,以及以链表方式去做对应实现的一个linkedList,arraylist 内部是使用数组的方式去做实现的,它内部是以一块完整的内存的一个连续结构去做 arraylist的实现。因此,它对应的查找的顺序是非常快,只需要通过查找,根据数组的一个下标去做内存偏移的寻址即可。而针对 linkedlist来说,它的查找顺序是需要通过头结点依次往后遍历,寻找到我们要跳过多少元素之后,去找到对应索引下标的一个元素。因此 arraylist 相比于 linkedlist来说,它的查找速度是比较快的。但是一旦要发生元素变更的时候,比如说我要去在数组的中间去插入对应的一个数据,由于整个的一个数组是处于连续的一个空间范围内,因此它必须得要在中间插入完成之后,将后面所有的一个元素往后面去做对应的移动。
删除也是一样的道理,需要将删除的元素节点的内容做对应的一个挖空之后,将后面所有的元素填充到对应的元素当中做一个前移的操作。
但是对于链表来说,它只需要去做指针节点的一个改变就可以满足要求。
因此针对查找操作来说,我们数组的一个O 时间复杂度是 O(1),但是针对插入或者删除这样的操作,可能在最坏情况下会退化成为 O(n)这样的一个时间效率。
而对于链表来说,恰好相反,它的插入和对应的删除操作只需要通过改变对应的一个指针位置,可以达到 O(1)级别的一个操作的时间。而对于查找来说,若非常不巧的,我们要移动所有的对应的一个链表的一个查询才可以找到节点,那它的查找效率就是O(n)的。