Java常考面试题整理(二)
21.Iterator和ListIterator的区别是什么?
参考答案:
下面列出了他们的区别:
Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List.
Iterator对集合只能向前遍历,ListIterator既可以向前也可以向后.
ListIterator实现了Iterator接口,并包含其他的功能,比如增加元素,替换元素,获得前一个和后一个元素的所有,等等.
22.快速失败(fail-fast)和安全失败(fail-fast)的区别是什么?
参考答案:
Iterator的安全失败是基于对底层集合做拷贝,因此它不受源集合上修改的影响,java.util包下面的所有集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的.快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常.
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()和equalis()方法的重要性体现在什么地方?
参考答案:
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每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素.
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不允许nul值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器.最后priorityqueue不是线程安全的,入队和出队的时间繁杂度O(log(n)).
30.你了解大O符号(big-O notation)么?你能该处不同数据结构的例子么?
参考答案;
大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是一个渐进上界.
大O符号也可以用来描述其它的行为,比如:内存消耗.因为集合类实际上是数据结构,我们一般用大O符号基于时间,内存和性能来选择最好的实现,大O符号可以对大量数据的性能给出一个很好的说明.
31.如何权衡是使用无序的数组还是有序的数组?
参考答案:
有序数组最大的好处在于查找的时间复杂度P(log n),而无序数组是O(n).有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给元素腾位置.相反,无序数组的插入时间复杂度是常量O(1).
32.Java集合类框架的醉驾时间有哪些?
参考答案:
根据应用的需要正确选择要使用的集合的类型对性能飞回城那个重要, 比如:加入元素的数量是固定的,而且能事先知道,我们就应该用Array而不是ArrayList.
有些集合类允许指定初始化容量,因此,如果我们能估计出存储的元素的数目,我们可以设置初始化容量来避免重新计算hash值或者是扩容.为了类型安全,可读性和健壮性的原因总要使用泛型,因此,使用泛型还可以避免运行时的ClassException.
使用JDK提供的不便类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法.
编程的时候接口优于实现.
底层的集合实际上是空的情况下,返回长度是0的集合或者说数组,不要返回null.
33.Enumeration接口和Iterator接口的区别有哪些?
参考答案:
Enumeration速度是Iterator的2倍,同时占用更少的内存,但是Iterator远比Enumeration安全,因为其它线程不能修改正被Iterator遍历的集合里面的对象.同时,Iterator允许调用者删除底层里面的元素,这对Enumeration来说是不可能的.
34.HashSet和TreeSet有什么区别?
参考答案:
HashSet是由一个hash表来实现的,因此,他的元素是无序的,add(),remove(),contains()方法的时间复杂度是O(1).
另一方面,TreeSet是由一个属性的结构来实现的,它里面的元素是有序的,因此,add().remove().,contains()方法的时间复杂度是O(log n).
35.Java中垃圾回收有什么目的?什么时候进行垃圾回收?
参考答案:
垃圾回收是在内存中存在没有引用的对象或超过作用域的对象时进行.
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源.
36.System.gc()和Runtime.gc()会做什么事情?
参考答案:
这两个方法用来提示JVM要进行垃圾回收,但是,立即开始还是延迟进行垃圾回收是取决于JVM的.
37.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
参考答案:
垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finallize()方法,但是在Java中很不幸,如果内存总是充足,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被之I型那个,显然指望它做首尾工作是靠不住的.那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存.Java程序有垃圾回收期,所以一般情况下内存问题不用程序员操心,但有一种JNI(Java Native Interface)调用nom-Java程序(C或C++),finalize()的工作就是回收这部分的内存.
38.如果对象的引用被指为null.垃圾收集是否会立即释放对象占用的内存?
参考答案:
不会,在下一个垃圾回收周期中,这个对象将是可被回收的.
39.Java堆的结构是什么样子的?什么事堆中的永久代(Perm Gem space)?
参考答案:
JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存.它在JVM启动的时候被创建,对象所占堆内存是由自动内存管理系统也就是垃圾收集器回收.
堆内存是由存活和死亡对象组成的.存活的对象是应用可以访问的,不会被垃圾回收.死亡的对象是应用不可访问尚且还没有垃圾收集器回收的对象.一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间.
永久代是用于存放静态文件,如Java类,方法等.持久化对垃圾回收没有显著的影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类,永久带中一般包含:
类的方法(字节码)
类名(String对象)
.class文件督导的常量信息
class对象相关的对象列表和类型列表(e.g.,方法对象的array).
JVM创建的内部对象
JIT编译器优化用的信息.
40.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
参考答案:
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规则和大规模数据的应用程序,而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了.
Java常考面试题整理(二)的更多相关文章
- Java常考面试题整理(六)
101.HTTP相应的结构是怎么样的? 参考答案: HTTP相应由三个部分组成: 1.状态码(status code):描述了相应的状态,可以用来检查是否成功的完成了请求.请求失败的情况下,状态码可以 ...
- Java常考面试题整理(四)
有关所有Swing相关的面试题,都可以说是凑数的,感觉自己在敲这些的时候感觉一点用处都没有,可以从第72条开始看. 61.说出三种支持重绘(painting)的组件. 参考答案: Canvas,Fra ...
- Java常考面试题整理(一)
1.什么是java虚拟机?为什么java被称作是"平台无关的编程语言". 参考答案: java虚拟级是一个可以执行java字节码的虚拟机进程,java源文件被编译成能被java虚拟 ...
- Java常考面试题整理(五)
81.RMI中的远程接口(Remote Interface)扮演了什么样的角色? 参考答案: 远程接口用来标识哪些方法是可以被非本地虚拟机调用的接口.远程对象必须要直接或者是间接实现远程接口.实现了远 ...
- Java常考面试题整理(三)
明天又要去面试,Good luck to me.,让我在这段时间换个新的工作吧. 41.在Java中,对象什么时候可以被垃圾回收? 参考答案: 当对象对当前使用这个对象的应用程序变得不可触及的时候,这 ...
- Java常考面试题
Java常考面试题 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...
- Java常考面试题(二)
序言 昨天刚开始的”每日5题面试“这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看做过的面试题,试着用 ...
- Java常考面试题(二)(转)
序言 昨天刚开始的"每日5题面试"这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看 ...
- 阿里巴巴JAVA常考面试题及汇总答案
一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? 答: 1.String是字符串常量,StringBuffer和StringB ...
随机推荐
- Eslint报错整理与解决方法
1.‘Unexpected tab character’ 字面意思理解呢就是意想不到的制表符,当时出现的时候就是我习惯的使用Tab键去打空格,但是eslint默认不认可Tab,所以解决方法很简单: 在 ...
- Arkady and a Nobody-men CodeForces - 860E (虚树)
大意: 给定有根树, 根节点深度为$1$. 定义$r(a,b)$为$b$子树内深度不超过$a$的节点数$-1$ 定义$z_a$为$a$的所有祖先的$r$之和. 对于所有点求出$z$的值. 一个点$y$ ...
- nginx配置一般优化参数
#user nobody; worker_processes 2; # CPU亲和力,worker_processes最多开启8个,注意写法 worker_cpu_affinity 01 10; wo ...
- 只读字段(readonly)和常量(const)
1.常量 一个包含不能修改的值的变量,通过const关键字定义.只能在声明的同时赋值 2.只读字段 通过readonly关键字定义. 可以在声明的同时赋值. 对于实例字段,在包含字段声明的类的实例构造 ...
- Redis分布式之前篇
第一篇:初识Redis 一.Redis是什么? Redis 是一个开源(BSD许可)的,使用ANSI C语言编写的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据 ...
- ASP.NET Core WebAPI帮助页--Swagger简单使用1.0
1.什么是Swagger? Swagger是一个规范且完整的框架,提供描述.生产.消费和可视化RESTful API,它是为了解决Web API生成有用文档和帮助页的问题. 2.为啥选用swagg ...
- 4.(基础)tornado应用安全与认证
这一节我们介绍应用安全与认证,其实中间省略了一个数据库.对于tornado来说,读取数据库的数据,性能的瓶颈还是在数据库上面.关于数据库,我在<>中介绍了sqlalchemy,这是一个工业 ...
- SDRAM介绍
一. 介绍 存储器的最初结构为线性,它在任何时刻,地址线中都只能有一位有效.设容量为N×M的存储器有S0-Sn-1条地址线:当容量增大时,地址选择线的条数也要线性增多,利用地址 ...
- 学习Linux让我进入了知名企业 原
说起我学习Linux的原因是多方面的,大学时我学的是物理学师范专业,有部分计算机课程,但我觉得这些课程没什么实际作用,我自己对计算机比较感兴趣,我利用业余时间学习了很多计算机技术.在大学期间我参加了很 ...
- 使用NPOI或POI 导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)
使用工具:POI(JAVA),NPOI(.Net) 致谢博主 Crazy_Jeff 提供的思路 一.问题描述: 导出任务数据量近100W甚至更多,导出的项目就会内存溢出,挂掉. 二.原因分析: 1.每 ...