上几次我们已经深入了解过了java中数据结构及特点,现在就来看一些面试题来巩固一下。
一、什么是数据结构?
简单地说,数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的,而对于其他操作则是低效的。首先我们需要理解各种数据结构,才能在处理实际问题时选取最合适的数据结构。
为什么我们需要数据结构?
数据是计算机科学当中最关键的实体,而数据结构则可以将数据以某种组织形式存储,因此,数据结构的价值不言而喻。
无论你以何种方式解决何种问题,你都需要处理数据——无论是涉及员工薪水、股票价格、购物清单,还是只是简单的电话簿问题。
数据需要根据不同的场景,按照特定的格式进行存储。有很多数据结构能够满足以不同格式存储数据的需求。
二、java常见的数据结构有哪些?
set,list,map,Quene.二叉树
set子类:
HashSet:HashSet不能保证元素的排列顺序;使用Hash算法来存储集合中的元素,有良好的存取和查找性能;通过equal()判断两个元素是否相等,并两个元素的hashCode()返回值也相等。
TreeSet是SortedSet接口的实现类,根据元素实际值的大小进行排序;采用红黑树的数据结构来存储集合元素;支持两种排序方法:自然排序(默认情况)和定制排序。前者通过实现Comparable接口中的compareTo()比较两个元素之间大小关系,然后按升序排列;后者通过实现Comparator接口中的compare()比较两个元素之间大小关系,实现定制排列。
list子类:
ArrayList:
底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。 空间不足时,增加原来空间的50%。
Vector:
底层数据结构是数组,查询快,增删慢。 线程安全,效率低。 空间不足时,增加原来空间的一倍。 Vector相对ArrayList查询慢(线程安全的) ,Vector相对LinkedList增删慢(数组结构)
LinkedList: 底层数据结构是链表,查询慢,增删快。 线程不安全,效率高。
Map子类:HashMap、Hashtable、 ConcurrentHashMap,LinkedHashMap、TreeMap
HashMap基于AbstractMap类,实现了Map、Cloneable(能被克隆)、Serializable(支持序列化)接口; 非线程安全;允许存在一个为null的key和任意个为null的value;采用链表散列的数据结构,即数组和链表的结合;初始容量为16,填充因子默认为0.75,扩容时是当前容量翻倍,即2capacity,hashmap采用拉链法解决冲突。
三、怎么保证HashMap线程安全?
ConcurrentHashMap是线程安全的HashMap,它采取锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。在JDK1.8中对ConcurrentHashmap做了两个改进:
取消segments字段,直接采用transient volatile HashEntry
数据结构由“数组+单向链表”变为“数组+单向链表+红黑树”,使得查询的时间复杂度可以降低到O(logN),改进一定的性能。
四、HashMap如何实现有序?
HashMap是无序的,而LinkedHashMap是有序的HashMap,默认为插入顺序,还可以是访问顺序,基本原理是其内部通过Entry维护了一个双向链表,负责维护Map的迭代顺序。
五、HashMap在put、get元素的过程?体现了什么数据结构?
向Hashmap中put元素时,首先判断key是否为空,为空则直接调用putForNullKey(),不为空则计算key的hash值得到该元素在数组中的下标值;如果数组在该位置处没有元素,就直接保存;如果有,还要比较是否存在相同的key,存在的话就覆盖原来key的value,否则将该元素保存在链头,先保存的在链尾。
从Hashmap中get元素时,计算key的hash值找到在数组中的对应的下标值,返回该key对应的value即可,如果有冲突就遍历该位置链表寻找key相同的元素并返回对应的value
由此可看出HashMap采用链表散列的数据结构,即数组和链表的结合,在Java8后又结合了红黑树,当链表元素超过8个将链表转换为红黑树。
二叉树:
B+树:
平衡二叉树(AVL树):各个结点左右子树深度差的绝对值不超过1。
哈夫曼树:带权路径长度最小的二叉树称为最优二叉树。哈夫曼树构造不唯一,但所有叶子结点的带权路径长度之和都是最小的。
红黑树:一种自平衡二叉查找树,它的性质有:
节点是红色或黑色。
根节点是黑色。
每个叶子节点都是黑色的空节点(NIL节点)。
每个红色节点的两个子节点都是黑色。
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
扩展内容:
一般除了基于数据结构的问题外,大多数的编程工作访谈还会询问算法,设计,位操作及基于逻辑的一般问题,这些概念的练习十分重要,因为在实际面试中有时解决它们会很棘手。
1. 如何实现冒泡排序算法?
2. 如何实现迭代快速排序算法?
3. 你如何实现插入排序算法?
4. 如何实现合并排序算法?
5. 如何实现桶排序算法?
6. 你如何实现计数排序算法?
7. 如何实现基数排序算法?
8. 如何在不使用第三个变量的情况下交换两个数字?
9. 如何检查两个矩形是否相互重叠?
10. 你如何设计自动售货机?
以上就是本篇文章的所有内容,更多java面试题内容,敬请关注奇Q工具网了解详情。
推荐阅读: