Java常考面试题(五)
序言
好好努力。
---WH
一、Iterator和ListIterator的区别是什么?
自我解答:
Iterator是针对所有collection来使用的,而看名字ListIterator,顾名思义,就是给list集合特有的,增加了其他专有的方法吧。
参考答案:
下面列出了他们的区别:
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator继承了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
自我评价:
首先第一映像,我只看过Iterator,第二个ListIterator我是没听过的,但是通过这么久的学习,我可以看出,ListIterator就是只能给list集合用,而不是给其他集合,
1、Iterator:是接口,能给所有的集合使用
2、ListIterator:也是接口,继承了Iterator接口,同时肯定对Iterator接口中的方法进行了增强
·ListIterator只能对list集合迭代,
·ListIterator不仅能向后迭代,也能想前迭代
·ListIterator还能增加元素和删除元素,并且还能获得前一个元素和后一个元素
注意:使用Iterator迭代的时候需要注意几个问题
1、xx.next(); 每次使用这个,就会往后面推一位,也就是索引会往后移一位,
2、xx.hasNext(); 当检测到后面没有值了,返回false,但是指向器还是会往后面移一位。指向最后一位的后一位,这也是在ListIterator发现的,使用Iterator没有这个考虑,无所谓,因为只有ListIterator才有往前迭代的方法,所以才有前面这一大堆话。
3、ListIterator使用xx.add();在当前索引的后面增加,不是替代当前索引的值
4、ListIterator使用xx.set(E);将当前索引的值给替换成我们给定的值
二、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
自我解答:
这个没接触过。。。
参考答案:
Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。
java.util包下面的所有的集合类都是快速失败的,快速失败的迭代器会抛出ConcurrentModificationException异常
java.util.concurrent包下面的所有的类都是安全失败的。,而安全失败的迭代器永远不会抛出这样的异常。
自我评价:
先说一下,这个题目花了我两个多小时,才彻底弄明白,但是还是很有效果的,比如,我查看了Iterator实现的源码,和之前看ArrayList源码时不懂得地方都弄清楚了,Iterator实现的原理和ArrayList源码分析我会在别的文章中写出来,到时候可以看看。现在来解决这个问题
1、fail-fast 和 fail-safe 这两个针对的是Iterator,
2、fail-fast:快速失败,在那些不是线程安全的集合使用Iterator时发生的问题,因为在迭代的时候,有别的线程对集合内部的构造进行了改变,比如,add、delete这类操作,都会使之发生快速失败。
3、fail-safe:安全失败,在线程安全的集合中发生上面的问题,就会出现该fail-safe了。
因为我明白了其中到底发生了什么,所以,写上面的文字,我知道意思,可能大家有点不理解,可以先了解一下fail-fast是什么,推荐博文:http://blog.csdn.net/chenssy/article/details/38151189 这里面就详细讲解了fail-fast是什么, 建议先观看arrayList源码,在其中重点了解Iterator的实现,还有modCount是什么,知道了这些,结合这篇博文和我说的,差不多就了解啦。
3、Java中的HashMap的工作原理是什么?
自我解答:
使用数组存储键值数据,每个数组中的位置又是一个链表。
参考答案:
HashMap的底层是用hash数组和单向链表实现的 ,当调用put方法是,首先计算key的hashcode,定位到合适的数组索引,然后再在该索引上的单向链表进行循环遍历用equals比较key是否存在,如果存在则用新的value覆盖原值,如果没有则在链头保存该值。HashMap的两个重要属性是容量capacity和加载因子loadfactor,默认值分布为16和0.75,当容器中的元素个数大于 capacity*loadfactor时,容器会进行扩容resize 为2n,在初始化Hashmap时可以对着两个值进行修改,负载因子0.75被证明为是性能比较好的取值,通常不会修改,那么只有初始容量capacity会导致频繁的扩容行为,这是非常耗费资源的操作,所以,如果事先能估算出容器所要存储的元素数量,最好在初始化时修改默认容量capacity,以防止频繁的resize操作影响性能。
自我评价:
1、没搞清楚hashMap的存储结构,虽然看了源码,但还是模模糊糊,现在差不多知道了
2、hashMap是用hash表和单向链表来实现存储数据的,具体模型如下,并且在hashmap中有一个内部类entry,它有四个属性V、K、next、hash,我们放入的key和value会分别放入entry的K、V中,所以存放的都市entry对象。
3、首先将key通过hash算法算出hashcode值,
4、通过hashcode值找到在hash数组中对应的位置,然后通过equals方法,遍历单向链表,看有没有相同的key值,如果有,则替换key所对应的value值,如果没有,将该数据插入链表的开始。
四、hashCode()和equals()方法的重要性体现在什么地方?
自我解答:
这个问题可以看我那边hashcode详解的文章,因为有hashCode()和equals()两个方法,使对数据的查询的效率变得很高,比如set集合中,就用到了这两个方法,不可以存放相同的值,这里就得到了体现
参考答案:
Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
自我评价:
差不多就是这样,就解释一下大概的情况,举个例子,差不多了。
五、HashMap和Hashtable有什么区别?
自我解答:
hashMap是Hashtable的父类,hashtable是线程安全的,而hashmap不是。
参考答案:
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
一般认为Hashtable是一个遗留的类。
自我评价:
map的各种继承关系模糊了,
1、hashMap的子类是linkedHashMap
2、hashTable和hashMap的关系就好像arrayList和Vector的关系差不多
3、hashTable是同步的,而hashMap是异步的,也就是一个线程安全一个线程不安全
4、hashMap的key值可以为null 而hashTable不可以
5、具体的可以去看collections集合的那篇总结文章
Java常考面试题(五)的更多相关文章
- Java常考面试题
Java常考面试题 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...
- Java常考面试题整理(五)
81.RMI中的远程接口(Remote Interface)扮演了什么样的角色? 参考答案: 远程接口用来标识哪些方法是可以被非本地虚拟机调用的接口.远程对象必须要直接或者是间接实现远程接口.实现了远 ...
- Java常考面试题(二)
序言 昨天刚开始的”每日5题面试“这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看做过的面试题,试着用 ...
- Java常考面试题(二)(转)
序言 昨天刚开始的"每日5题面试"这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看 ...
- 阿里巴巴JAVA常考面试题及汇总答案
一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? 答: 1.String是字符串常量,StringBuffer和StringB ...
- Java常考面试题(四)
序言 双十一那天去我女朋友那了,11.11到11.13 漏了两天的内容,今天中午刚回来的,赶紧补一下前两天漏下的博文,我相信,坚持下来,会有成长的,等到出去实习那一天,肯定会很有帮助,会感谢现在自己的 ...
- Java常考面试题(三)
序言 说说今天遇到的一件小事吧,在遇到问题,查找答案时,看到很多人的博客里面都有提到关键字眼,可让人觉得可恨的是,大多数人写的博文中,基本上都是照着书上的语言发表的,看了跟没看一样,没有一点通俗的语言 ...
- Java常考面试题(一)
序言 我是一只乱飞乱撞的菜鸟,写的文章目前是以记录自己学习,和方便以后查看,期待日后不久能通过自己的努力,获得一点小小的成功,然后写出我的学习经验总结性文章来. ---WH 一.什么是虚拟机?为什么J ...
- Java常考面试题整理(四)
有关所有Swing相关的面试题,都可以说是凑数的,感觉自己在敲这些的时候感觉一点用处都没有,可以从第72条开始看. 61.说出三种支持重绘(painting)的组件. 参考答案: Canvas,Fra ...
随机推荐
- AppStore上传已经开发好的App的方法
可以很好的解决ERROR ITMS-90168:"The binary you uploaded was invalid'的问题: 1.下载:Xcode 8.1 找到:Application ...
- java sm3加密算法
java sm3加密算法实现 CreationTime--2018年7月13日09点28分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59.ja ...
- 单目视觉里程计 mono vo
之前为了修改svo进行了一些不同的尝试,两个视频demo在以下. 效果1 视频链接: https://v.qq.com/x/page/d0383rpx3ap.html 在不同数据集上測试 效果2 视频 ...
- 体验cygwin纪实
在windows快速体验linux,借助Cygwin很不错的体验(占用空间小),win10应用商店目前集成ubuntu.fedora...系统... 00.安装源,直接下载的是init(仅仅是下载器) ...
- PAC Manager的重生: Asbru
PAC Manager在2016年停更后, 在Ubuntu18.04上的各种bug就无人修复了. 我在Windows下对XShell是重度依赖, 而在Linux下没有其他更好的替代品. 在上一次安装1 ...
- MYSQL多行合并成一行多列
), VALUE )) INSERT INTO # VALUES (,,'), (,,'), (,,'), (,,'), (,,'), (,,'), (,,') SELECT code,MIN(nam ...
- OpenGL实现通用GPU计算概述
可能比較早一点做GPU计算的开发者会对OpenGL做通用GPU计算,随着GPU计算技术的兴起,越来越多的技术出现,比方OpenCL.CUDA.OpenAcc等,这些都是专门用来做并行计算的标准或者说接 ...
- jquery版本号升级不兼容的问题:$("input").attr("value")功能发生改变
之前项目中使用的是jquery-1.6.3.js,在这个版本号中,假设我们想获取输入框的值,能够使用$("input").attr("value")或者是$(& ...
- 【TP3.2.X】(同样适用于OT) 设置单入口index.php文件,区分PC/WAP/Wechat 三个终端
1.目的:本教程适用于 OneThink1.0.或者TP3.2.X 系列,达到单入口index.php文件,区分PC/WAP/Wechat 三个终端 2.启发至 : http://www.thinkp ...
- Maven Package Plugins And Maven Test
在使用Maven时候,大家避免不了使用大量插件: 1. maven-compiler-plugin 指定JDK版本和编码方式 ? ?compiler插件能解决2个问题: 第一:指定JDK版本--mav ...