java:数据结构面试题

数据结构是面试一定会问的问题。
1.常用的数据结构有哪些?
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<K,V>[] table保存数据,将数组元素作为锁,对每一行数据进行加锁,可减少并发冲突的概率
数据结构由“数组+单向链表”变为“数组+单向链表+红黑树”,使得查询的时间复杂度可以降低到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节点)。
每个红色节点的两个子节点都是黑色。
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

2.各个数据结构的底层实现原理?
二叉树遍历等?
插入,删除,查找效率的比较?
线程安全?
你用过哪些?

3.手写代码
链表排序,反转?
map排序?

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Java数据结构面试题通常涉及到数组和ArrayList的使用,以及对数组的操作和判断。以下是一些常见的Java数据结构面试题及答案: 1. 如何判断数组是null还是为空? 可以使用数组的length属性来判断。如果数组为null,那么length属性会抛出NullPointerException异常;如果数组为空,即长度为0,那么length属性的值为0。 2. 如何打印数组? 可以使用Arrays类的toString()方法来打印数组。例如,使用System.out.println(Arrays.toString(array))可以打印出数组的内容。 3. 如何打印数组中的重复元素? 可以使用两层循环来遍历数组,比较每个元素与其他元素是否相等。如果相等,则表示有重复元素。 4. Array和ArrayList有什么区别?什么时候应该使用Array而不是ArrayList? Array是一个固定长度的数据结构,一旦创建后长度不可改变。ArrayList是一个可变长度的数据结构,可以动态添加和删除元素。当需要一个固定长度的数据结构时,可以使用Array;当需要一个可变长度的数据结构时,可以使用ArrayList。 5. 数组和链表数据结构描述,各自的时间复杂度? 数组是一种线性数据结构,元素在内存中是连续存储的。访问元素的时间复杂度为O(1),插入和删除元素的时间复杂度为O(n)。 链表是一种非连续的数据结构,元素在内存中是通过指针连接的。访问元素的时间复杂度为O(n),插入和删除元素的时间复杂度为O(1)。 6. 数组有没有length()这个方法? String有没有length()这个方法? 数组没有length()方法,而是使用length属性来获取数组的长度。 String有length()方法,可以返回字符串的长度。 希望以上回答对您的面试准备有所帮助。如果您需要更详细的答案和更多面试题,可以参考引用[1]和引用[2]中提到的文档和视频资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值