没有合适的资源?快使用搜索试试~ 我知道了~
面试题完整套题.docx
需积分: 9 0 下载量 192 浏览量
2021-05-18
07:59:28
上传
评论
收藏 226KB DOCX 举报
温馨提示
试读
62页
java面试题
资源详情
资源评论
资源推荐
一:基础篇
集合篇
ArrayList 和 LinkedList 的区别是什么(面试)?
答案:①是否保证线程安全:ArrayList 和LinkedList 都是不同步的,也就是不保证线程安全;
② 底层数据结构:Arraylist 底层使用的是 Object 数组;LinkedList 底层使用的是双向循环链表数
据结构;
③ 插入和删除是否受元素位置的影响:①ArrayList 采用数组存储,所以插入和删除元素的时间复
杂度受元素位置的影响。比如:执行 add(E e)方法的时候,ArrayList 会默认在将指定的元素追加到此
列表的末尾,这种情况时间复杂度就是 O(1)。但是如果要在指定位置i 插入和删除元素的话(add(int
index, E element))时间复杂度就为O(n-i)。因为在进行上述操作的时候集合中第i 和第i 个元素之后
的(n-i)个元素都要执行向后位/向前移一位的操作。②LinkedList 采用链表存储,所以插入,删除元素
时间复杂度不受元素位置的影响,都是近似O(1)而数组为近似O(n)。
④ 是否 支 持 快速 随机 访问 : LinkedList 不 支 持高 效的 随机 元素 访问 ,而 ArrayList 实 现 了
RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对
应于 get(int index)方法)。
⑤ 内存空间占用:ArrayList 的空间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而
LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后
继和直接前驱以及数据)。
什么是 接口
答:①是元素有序并且可以重复的集合,被称为序列,
②List 可以精准的控制每个元素的插入位置,或者删除某个位置元素
③List 接口的常用子类有 ArrayList,LinkedList,Vector(已经过时)
3.什么是 HashMap(重点)
答案:① HashMap 和 Hashtable 类似,不同之处在于 HashMap 是非同步的,并且允许 null,即 null
value 和 null key
② 本质为无序散列,Hash 算法来决定存储位置.
③HashMap 的数据结构和底层实现(面试重点)
JDk1.8 之前的 HashMap 由数组+链表组成的,即”链表散列”,数组是 HashMap 的主题,链表则是主
要是为了解决哈希冲突而存在的(“拉链法”),如果定位到的数组位置不含链表(entry 的 next 指向 null),那
么对于查找,添加等操作很快,仅需要一次就能寻找到地址;如果定位到数组包含链表,对于添加操作,其时间
复杂度依然为 O(1),因为最新的 Entry 会插入链表头部,急需要简单改变引用链即可,而对于查找操作来讲,
此时就需要遍历链表,然后通过 key 对象的 equals 方法逐一对比.
④HashMap 不 是 线 程 安 全 的 , 当 迭 代 其 中 有 其 他 的 线 程 改 变 了 HashMap 中 的 值 将 会 抛 出
ConcurrentModifcationException.
关于 HashMap 的扩容机制
【Threshold(开始扩容的临界点)=Size(HashMap 的容量)*Load_Factor(负载因子);】
4.什么时候开始扩容?
答 : 当 HashMap 中 的 元 素 个 数 超 过 数 组 大 小 ( 数 组 总 大 小 length, 不 是 数 组 中 个 数
size)*loadFactor 时,就会进行数组扩容,loadFactor 的默认值为 0.75,这是一个折中的取值。也就是
说,默认情况下,数组大小为 16,那么当 HashMap 中元素个数超过 16*0.75=12(这个值就是代码中
的 threshold 值,也叫做临界值)的时候,就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计
算每个元素在数组中的位置。
为什么是 0.75,大量实验得出的结果
如果取 0.5,超过一般就扩容,造成资源的浪费.
如果取 1,到临界值才扩容,会增加哈希碰撞的几率.
5.扩容的方法是?
调用 resize 方法
为什么大小是 的幂次?
答案:为了能让存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀,
每个链表红黑树长度大致相同。这个实现就是把数据存到哪个链表红黑树中的算法。
线程安全问题对应的线程安全 是什么
答:①对应的的是 支持高并发的访问和更新它是线程安全的
在 中和 的底层相同都是散列表红黑树
通过部分锁定 算法来进行实现线程安全的
的 !" 和 #$ 都不能为 $$
8.什么是 算法
答:%& 是一种有名的无锁算法当多个线程尝试使用 ' 同时更新同一
个变量时只有其中一个线程能更新变量的值而其他线程都失败失败的线程并不会被挂起
而是被告知这次竞争中失败并可以再次尝试
总结(先比较是否相等如果相当则替换
1.2 多线程
1.什么是进程
进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应
用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基
本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
什么是线程
线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以
理解为一个进程便相当于一个单)*操作系统,而线程便是这个系统中运行的多个任
务。
并发和并行:
并发:指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得
在宏观上有多个进程同时执行的效果
并行:指在同一时刻,有多条指令在多个处理器上同时执行。
多线程有什么优势?
答:①进程之间不能共享内存,但线程之间共享内存非常容易
系统创建进程时需要为该进程重新分配系统资源,但创建线程则代价小得多,
因此使用多线程来实现多任务并发比多进程的效率高
+ 语言内置了多线程功能支持,从而简化了 + 的多线程编程
和 的区别
实现 ,-$ 接口比继承 .% 类所具有的优势:
):适合多个相同的程序代码的线程去处理同一个资源
):可以避免 /+ 中的单继承的限制
0):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
1):线程池只能放入实现 ,-$ 或 2$$-$ 类线程,不能直接放入继承 .% 的类
多线程的生命周期
答:在线程的生命周期中,它要经过新建 、就绪 、运行! 、阻
塞"#$% 和死亡& 五种状态。
流程:
、新建状态():新创建了一个线程对象。
、就绪状态():线程对象创建后,其他线程调用了该对象的 34方法。
该状态的线程位于可运行线程池中,变得可运行,等待获取 )* 的使用权。
、运行状态(!):就绪状态的线程获取了 )*,执行程序代码。
、阻塞状态("#$%):阻塞状态是线程因为某种原因放弃 '( 使用权,暂时停止
运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行 方法,)*+ 会把该线程放入等待池中。
会释放持有的锁
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占
用,则 )*+ 会把该线程放入锁池中。
(三)、 其 他阻塞 : 运行的线程 执行 , 或 -# 方法,或者 发出了 ./0 请 求
时,)*+ 会把该线程置为阻塞状态。当 , 状态超时、-# 等待线程终止或者超
时、或者 ./0 处理完毕时,线程重新转入就绪状态。(注意1, 是不会释放持有的
锁)
、死亡状态(&):线程会以一下三种方式结束:
534或 2$$34方法执行完成,线程正常结束
线程抛出一个未捕获的 6728 或 6
直接调用该线程的 34方法来结束线程——该方法容易导致死锁
注:当主线程结束时,其他线程不受影响,不会随之结束。
线程睡眠:,#!2 方法,使线程转到阻塞状态。9$$9 参数设定睡眠的
时间,以毫秒为单位。当睡眠结束后,就转为就绪(,-$)状态。$34平台移植性
好。
线程等待:0-$ 类中的 方法(无限等待),导致当前的线程等待,直到其他线程
调用此对象的8:"34方法或8:"$$34唤醒方法。这个两个唤醒方法也是 ;-/2 类中的方
法,行为等价于调用&93<4一样。
线程让步:3 方法,暂停当前正在执行的线程对象,把执行机会让给相同或
者更高优先级的线程。
线程加入:-# 方法,等待其他线程终止。在当前线程中调用另一个线程的 /934方法,
则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。
线程唤醒:0-$ 类中的 #453 方法,唤醒在此对象监视器上等待的单个线程。如果所
有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做
出决定时发生。线程通过调用其中一个&9方法,在对象的监视器上等待。直到当前的
线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在
该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一
个线程方面没有可靠的特权或劣势。类似的方法还有一个 8:"$$34,唤醒在此对象监视器
上等待的所有线程。
6什么是线程安全和线程不安全?
答案:由于系统的线程调度具有一定的随机性,当使用多个线程来访问同一个数据
时,很容易“偶然“出现线程安全问题。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变
量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时
执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
7线程安全问题
什么叫线程安全
答:就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行
保护,其他线程不能进行访问,直到该线程读取完,其他线程才可使用。不会出现数据不
一致或者数据污染。
一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计
算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。 #2是用同步方
法来实现线程安全的而和它相似的 "=9 不是线程安全的。
何为线程不安全
答:线程不安全:就是不提供数据访问保护,有可能出现多个线程先后更改数据造成
所得到的数据是脏数据
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段
代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的
是一样的,就是线程安全的。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变
量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时
剩余61页未读,继续阅读
小象子
- 粉丝: 9
- 资源: 48
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 蓝桥杯2024年第十五届省赛真题-前缀总分
- com.qihoo.appstore_300101305-1.apk
- tensorflow-gpu-2.7.1-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.1-cp39-cp39-manylinux2010-x86-64.whl
- 蓝桥杯2024年第十五届省赛真题-传送阵
- com.qihoo.appstore_300101305.apk
- linux之线程同步一.doc
- keil5配色方案10种
- python烟花代码.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0