阿里p8架构师分享:Java经典基础与高级面试36题和答案(下)_阿里p8面试题和答案-程序员宅基地

技术标签: 程序员  java  互联网  it  

19.为什么集合类没有实现Cloneable和Serializable接口?

克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。

20.什么是迭代器(Iterator)?

Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的

迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的

remove(Object

Obj)删除,可以通过迭代器的remove()方法删除。

21.Iterator和ListIterator的区别是什么?

下面列出了他们的区别:

Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。

Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

22.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

一:快速失败(fail—fast)

在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的结构进行了修改(增加、删除),则会抛出Concurrent

Modification

Exception。

原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount 变量。集合在被遍历期间如果结构发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。

场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。

二:安全失败(fail—safe)

采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent

Modification

Exception。

缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

23.Java中的HashMap的工作原理是什么?

Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

24.hashCode()和equals()方法的重要性体现在什么地方?

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

25.HashMap和Hashtable有什么区别?

HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:

HashMap允许键和值是null,而Hashtable不允许键或者值是null。

Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。

HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。

一般认为Hashtable是一个遗留的类。

26.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

下面列出了Array和ArrayList的不同点:

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

Array大小是固定的,ArrayList的大小是动态变化的。

ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

27.ArrayList和LinkedList有什么区别?

ArrayList和LinkedList都实现了List接口,他们有以下的不同点:

ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

也可以参考ArrayList

vs. LinkedList。

28.Comparable和Comparator接口是干什么的?列出它们的区别?

Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象。

Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

29.什么是Java优先级队列(Priority Queue)?

PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。

30.你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?

大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是一个渐进上界 。

大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。

31.如何权衡是使用无序的数组还是有序的数组?

有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。

32.Java集合类框架的最佳实践有哪些?

根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固 定的,而且能事先知道,我们就应该用Array而不是ArrayList。

有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置 初始容量来避免重新计算hash值或者是扩容。

33.HashSet和TreeSet有什么区别?

HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()

方法的时间复杂度是O(1)。

另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(), remove(),contains()方法的时间复杂度是O(logn)。

34.Java中垃圾回收有什么目的?什么时候进行垃圾回收?

垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。

35.System.gc()和Runtime.gc()会做什么事情?

这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决

于JVM的。

36.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法 但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize() 可能永远不被执行,显然指望它做收尾工作是靠不住的。 那么finalize()究竟是做什么的呢?

它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内

存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-­Java程序(C或C++), finalize()的工作就是回收这部分的内存。

如果有想要学习java的程序员,可加入我们的java学习群:723403928,领取java视频教程!而且每天晚上都有技术大牛在里面直播Java公开课,从零基础到进阶,欢迎各位加入。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43030648/article/details/84834784

智能推荐

pycharm 离线安装插件-程序员宅基地

文章浏览阅读2.2k次。插件离线下载地址:http://plugins.jetbrains.com/1、下载插件:http://plugins.jetbrains.com/2、安装插件:settings -> plugins -> install plugin from disk,然后重启IDEA即可。

高精度处理BigDecimal<Java算法>_防止js计算出现0.8999999999999-程序员宅基地

文章浏览阅读126次。Java数据类型的陷阱public class test{ public static void main(String[] args){ System.out.printfln(2.0-1.1); }}上述代码的结果是多少呢?按理讲应该是0.9,但实际上结果并不是那样,运行结果等于0.8999999999999,这时候怎么处理这个问题?我们需要使用到高精度处理函数BigDecimal,处理结果如下:import java.math.BigDecimal;public class t_防止js计算出现0.8999999999999

PyQt5入门(七)常用控件_pyqt5控件-程序员宅基地

文章浏览阅读5k次,点赞12次,收藏31次。按钮控件(QpushButton)QAbstractButton(所有按钮控件的父类)QPushButton(普通按钮)AToolButton(工具条按钮)QRadioButton(单选框按钮)QCheckBox(复选框按钮)代码:import sysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *class QPushButtonDemo(QDialo._pyqt5控件

算法衡量auc_人工智能中的概率值大小如何测试?AUC指标帮您完美解决-程序员宅基地

文章浏览阅读271次。很多人都在玩抖音,并且越玩越嗨,究其根源就是抖音根据个人爱好进行的精准视频推荐,那么问题来了,精准度怎么测试呢? 其实精准度就是一个概率值,并且像抖音这样的推荐系统通常是使用人工智能分类算法实现的,而分类算法有个AUC指标可以很好的衡量概率值的大小评测是否合适。本文就通过两步来介绍怎样通过分类算法的AUC指标来评测类似抖音推荐系统的推荐精准度。一、第一步------------了解TPR与FPR指..._得出auc如何预测数据的大小

关于汉诺塔问题(递归)_编程实现顺序栈/链栈的基本操作,实现: a) 编写递归函数,求解汉诺塔问题。(必做)-程序员宅基地

文章浏览阅读381次。新入c++坑的和我一样的小白,可能也对函数递归感到懵,接下来就说一下我对递归函数的理解(课本上的话改了改而已 ,嘿嘿),等我有更深的理解时一定回来补充的。构成递归函数有两个基本要素: 1、描述问题规模逐步缩小的递归算法; 2、描述基本情况的递归终止条件。注:在程序中,递归算法和递归条件通常用条件语句表达式。递归调用可以出现在执行语句中,也可以出现在判断表达式中。上..._编程实现顺序栈/链栈的基本操作,实现: a) 编写递归函数,求解汉诺塔问题。(必做)

BPM产品选型攻略_bpm产品选择-程序员宅基地

文章浏览阅读1.4k次。在阅读之前需要明白OA产品和BPM产品的分别,再根据需要选择合适的产品_bpm产品选择

随便推点

python中定义私有变量的方法是,Python中的私有变量和方法-程序员宅基地

文章浏览阅读51次。Which should I use _foo (an underscore) or __bar (double underscore) for private members and methods in Python?解决方案Please note that there is no such thing as "private method" in Python. Double undersc..._python 私有变量 __dict__

postfix疯狂外发垃圾邮件之分析与解决_postfix/clearup-程序员宅基地

文章浏览阅读5.2k次。postfix疯狂外发垃圾邮件之分析与解决本周二上班有人反应公司邮箱无法外发邮件,后来登录到服务器查看原因,不看不知道,一看吓一跳,服务器日志疯狂滚动!一看全是被其它邮件服务器拒绝的信息!由于这台服务器以前不是我管,连配置文件都find了好久,最终从十多个main.cf中找到了真正的配置文件...... 下面开始分析问题与解决问题!分析localhost# find_postfix/clearup

Unity之移动设备之IOS调整输入框位置_unity ios重写输入框-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏3次。1,需求:当玩家点击输入框的,会弹出虚拟键盘,如果我们的输入框靠下,那么便会被挡住,这个时候如果想要调整输入框位置。2,思路:这边上移移动的是所有UI的父物体(偷懒了),如果想要移动较小的物体,则可以自行代码调整,就需要判断一下当前输入框所在位置,会不会被虚拟键盘挡住,如果会,则需要上移,上移高度应该上移多少。3,实现:3.1 实现的辅佐工具:1,DOTween插件;2,事件管理器(自行封装)。3.2 虚拟键盘各类信息using UnityEngine;using UnityEngine.Eve_unity ios重写输入框

ue4材质节点怎么用_UE4材质节点-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏21次。材质输入引脚材质中最为关键的是作为最终输出结果的引脚,根据情况的不同有的会使用,有的并不会被使用。基础颜色(Base Color)定义材质的颜色,接受参数为Vector3(RGB)。颜色采用float形式,任何超出范围的输入数值都将被clamp到0~1的范围内。相当于在摄影中使用偏光镜滤除由反射引起的杂光之后的物体的颜色。偏光镜的效果可参照以下对比图。右边为加了偏光镜后的效果。金属(Metalli..._ue4 材质append节点怎么变成append3

PHP加速软件-程序员宅基地

文章浏览阅读8.4k次。PHP加速软件是一种将PHP代码编译之后所产生的bytecode暂存在共享存储器内供重复使用,以提升运行效率的插件软件。目录1 PHP加速软件列表1.1 Alternative PHP Cache1.2 Turck MMCache1.3 eAccelerator1.4 XCache1.5 Zend Optimizer1.6 Zend Platform1.7 ionCube PHP..._php加速软件

python交集和补集的符号_python数组并集交集补集-程序员宅基地

文章浏览阅读2.2k次。并集a = ["a", "b", "c", "d"]b = ["b", "e"]c = ["a", "b", "c", "d", "e"]# 并# 合并数组a.extend(b)# 去重array = list(set(a))print(array)# 第二种方法array = list(set(a)|set(b))print(array)打印结果:['c', 'a', 'b', 'd', 'e'..._python中补集的符号