企业真题(泛型、数据结构与集合源码)

二、企业真题

1. Java 的泛型是什么?有什么好处和优点?JDK 不同版本的泛型有什么区别?(软*动力)

泛型,是程序中出现的不确定的类型。

以集合来举例:把一个集合中的内容限制为一个特定的数据类型,这就是generic背后的核心思想。

jdk7.0新特性:

ArrayList<String> list = new ArrayList<>(); //类型推断

后续版本的新特性:

Comparator<Employee> comparator = new Comparator<>(){} //类型推断
2. 说说你对泛型的了解(*软国际)

集合中是可以存放任意对象的,只要把对象丢进集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。

二、企业真题

2.1 数据结构相关

1. 链表和数组有什么区别?(腾*)

所谓数组,就是相同数据类型的元素按一定顺序排列的集合

所谓链表,链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

2. 栈是如何运行的?(西*信息技术)

先进后出。属于ADT(abstract data type),可以使用数组、链表实现栈结构

2.2 List集合源码相关

1. ArrayList的默认大小是多少,以及扩容机制(顺*、凡*科技)
类似问题:
> 说说ArrayList的扩容机制吧(国*电网)
> 讲一下ArrayList的扩容机制(*实在)
> ArrayList的扩容机制,为什么是10,为什么是1.5倍(*软国际)

ArrayList是一个动态数组,在使用的过程中它会去根据情况动态的改变集合的大小。

  • ArrayList的默认初始容量为10,注意,当我们刚创建一个ArrayList的时候,它的容量大小为0,只有在执行第一次add操作时,才会扩容到10;
2. ArrayList的底层是怎么实现的?(腾*)
类似问题:
集合类的ArrayList底层(安全不安全,扩容,初始大小,添加删除查询是怎么操作的,底层是什么组成的)
(湖**利软件、汇*云通、猎*、苏州***动、上海*进天下、北京博*软件、*科软、大连*点科技、中*亿达、德*物流、天*伟业、猫*娱乐)

ArrayList的底层主体就是一个Object数组,对ArrayList的所有底层操作就是基于数组实现的

建议:ArrayList(int capacity){}

3. 在ArrayList中remove后面几个元素该怎么做?(惠*、中*亿达)

前移。

4. ArrayList1.7和1.8的区别(拓*思)

类似于饿汉式、懒汉式

5. 数组和 ArrayList 的区别(阿*、*科软)

ArrayList看做是对数组的常见操作的封装。

6. 什么是线程安全的List?(平*金服)

Vector:线程安全的。

ArrayList:线程不安全。----> 使用同步机制处理。

HashMap:线程不安全。 ----> 使用同步机制处理。
                   -----> JUC:ConcurrentHashMap

2.3 HashMap集合源码相关

1. 说说HahMap底层实现(新*股份、顺*、猫*娱乐)
类似问题:
> HashMap的实现讲一下?(腾*,上海**网络)
> 说说HashMap的底层执行原理?(滴*,纬*软件,上海*想,*昂,*蝶**云,宇*科技,*东数科,猎*网)
> 详细说一下 HashMap 的 put 过程(*度)
> Java中的HashMap的工作原理是什么?(北京中**译咨询)
> 集合类的HashMap底层(安全不安全,扩容,初始大小,添加删除查询是怎么操作的,底层是什么组成的)(湖**利软件)
> HashMap 的存储过程(爱*信、杭州*智)
> Hashmap底层实现及构造(汇**通、猎*、苏州博*讯动、上海*进天下、北京博*软件、*科软、大连*点科技、中*亿达、德*物流、天*伟业、猫*娱乐)
> HashMap的实现原理(腾*、阿*)
> HaspMap底层讲一讲(*米)
> 说一下HashMap的实现,扩容机制?(*节)
> 讲一下 HashMap 中 put 方法过程?(阿*)

略。建议以JDK8为主说明。

2. HashMap初始值16,临界值12是怎么算的(软**力)

16从底层源码的构造器中看到的。

12:threshold,使用数组的长度*加载因子(loadFactor)

3. HashMap长度为什么是2的幂次方(国*时代)

为了方便计算要添加的元素的底层的索引i。

4. HashMap怎么计算哈希值和索引?扩容机制?怎么解决hash冲突?(*软国际、中软*腾)
类似问题:
> HashMap key的哈希冲突了怎么做(新*股份)
> HashMap的默认大小是多少,以及扩容机制(顺*、凡*科技)
> 讲一下HashMap的扩容机制?(好实*)

Hash 表又叫做“散列表”,它是通过 key 直接访问在内存存储位置的数据结构, 在具体实现上,我们通过 hash 函数把 key 映射到表中的某个位置,来获取这个位置的数据,从而加快查找速度

  1. 链式寻址法。是一种非常常见的方法,简单理解就是把存在 hash 冲突的 key, 以单向链表的方式来存储,比如 HashMap 就是采用链式寻址法来实现的。
  2. 开放寻址法,也称为线性探测法。就是直接从冲突的数组位置向下去寻找一个空的数组下标,进行数据的存储,在ThredLocal里面有使用到这个线性探测法。
5. HashMap底层是数组+链表,有数组很快了,为什么加链表?(润*软件)

因为产生了哈希冲突。解决方案,使用链表的方式。保证要添加的元素仍然在索引i的位置上。

6. HashMap为什么长度达到一定的长度要转化为红黑树(*度)
类似问题:
> HashMap为什么用红黑树(*软国际)

红黑树的常用操作的时间复杂度O(logn),比单向链表的O(n)效率高。

7. HashMap什么时候扩充为红黑树,什么时候又返回到链表?(汉*)
类似问题:
> HashMap什么时候转换为红黑树(杭州*智公司)
> 当HashMap中相同hashcode值的数据超过多少时会转变成红黑树?(百*云创)
> 什么时候是数据+链表,什么时候是红黑树(*软国际)

索引i的位置的链表长度超过8且数组长度达到64,需要索引i位置要变成红黑树。

当索引i的位置元素的个数低于6时,要红黑树结构转为单向链表。为什么?节省空间。

8. 在 JDK1.8中,HashMap的数据结构与1.7相比有什么变化,这些变化的好处在哪里?(海*科)
① 在jdk8中,当我们创建了HashMap实例以后,底层并没有初始化table数组。当首次添加(key,value)时,进行判断,
如果发现table尚未初始化,则对数组进行初始化。
② 在jdk8中,HashMap底层定义了Node内部类,替换jdk7中的Entry内部类。意味着,我们创建的数组是Node[]
③ 在jdk8中,如果当前的(key,value)经过一系列判断之后,可以添加到当前的数组角标i中。如果此时角标i位置上有
   元素。在jdk7中是将新的(key,value)指向已有的旧的元素(头插法),而在jdk8中是旧的元素指向新的
   (key,value)元素(尾插法)。 "七上八下"
④ jdk7:数组+单向链表
   jk8:数组+单向链表 + 红黑树
   什么时候会使用单向链表变为红黑树:如果数组索引i位置上的元素的个数达到8,并且数组的长度达到64时,我们就将此索引i位置上
                               的多个元素改为使用红黑树的结构进行存储。(为什么修改呢?红黑树进行put()/get()/remove()
                               操作的时间复杂度为O(logn),比单向链表的时间复杂度O(n)的好。性能更高。
   什么时候会使用红黑树变为单向链表:当使用红黑树的索引i位置上的元素的个数低于6的时候,就会将红黑树结构退化为单向链表。
9. HashMap的get()方法的原理?(顺*)

参考put()

2.4 hashCode和equals

1. hashcode和equals区别?(海*供应链管理)

一、hashCode()和equals()是什么?

hashCode()方法和equals()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致。

二、hashCode()和equals()的区别

下边从两个角度介绍了他们的区别:一个是性能,一个是可靠性。他们之间的主要区别也基本体现在这里。

2. hashCode() 与 equals() 生成算法、方法怎么重写?(阿*校招)

进行equals()判断使用的属性,通常也都会参与到hashCode()的计算中。

尽量保证hashCode()的一致性。(使用IDEA自动生成,hashCode()自动使用相关的算法。

3. 说一下equals和==的区别,然后问equals相等hash值一定相等吗?hash值相等equals一定相等吗?(南*电网、上海*智网络)

equals相等hash值一定相等吗? 是

hash值相等equals一定相等吗?不一定

2.5 Set集合源码相关

1. HashSet存放数据的方式?(拓*软件)

底层使用HashMap。说一下HashMap

2. Set是如何实现元素的唯一性?(湖**利软件)

set保证里面元素的唯一性其实是靠两个方法,一是equals()和hashCode()方法

往set里面添加数据的时候一般会有隐式的操作

先是判断set集合中是否有与新添加数据的hashcode值一致的数据,

如果有,那么将再进行第二步调用equals方法再进行一次判断,

假如集合中没有与新添加数据hashcode值一致的数据,那么将不调用eqauls方法

3. 用哪两种方式来实现集合的排序(凡*科技)
类似问题:
> 集合怎么排序?(北京中**信科技)

自然排序、定制排序。

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值