Java常考面试题(四)
序言
双十一那天去我女朋友那了,11.11到11.13 漏了两天的内容,今天中午刚回来的,赶紧补一下前两天漏下的博文,我相信,坚持下来,会有成长的,等到出去实习那一天,肯定会很有帮助,会感谢现在自己的努力。
对了,因为常常会被别人影响到自己,看到别人努力,自己玩了两天就感觉心里好慌啊,每到这个时候,我就告诉自己:不与他人相比,但求超越自己, 希望有跟同样情况的同学也能这样来安抚自己那颗躁动的心,踏踏实实,按照自己的节奏走下去。
--- WH
一、什么是死锁(deadlock)?
自我解答:
这个问题,依稀在讲解数据库时有学习过。不过忘记的差不多了,大概就是A有一把锁,B也有一把锁,现在A获得了B这把锁,此时,A失去CPU,B又获得了A这吧锁,此时就造成了死锁,因为双方都解不开了。
参考答案:
两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。
自我评价:
顺便把其他情况也复习一下,感觉这个需要理解,自己对这个概念也有点模糊不清。
1、死锁:A等待B、B等待A,造成死锁,无限的等待中,
2、死锁的问题我就想到了复习一下数据库的事务的特性和隔离级别吧
什么是事务?一组业务逻辑,注意,是一组。例如,A转钱给B A就要有更新语句,B也要有更新语句,这两个一起才是一个事务。
事务的特性:ACID
A:原子性,就是事务不可被划分,是一个整体,要么一起成功,要么就一起失败
C:一致性:银行转账,A转走100块给B,A减少100,那么B就增加100
I:隔离性:比较麻烦的点,多个事务对同一个内容的并发操作
D:持久性:已经提交的事务,就已经保存到数据库中,不能再更改了。
事务隔离性产生的问题
1、脏读:事务 读取到了 另一个事务还未提交的数据。
例如:小明去银行取钱,读取到卡里有100元,然后小明将100元取出,但是数据还没有提交到数据库中; 这个时候小红拿着同一张卡去取钱,因为小明的取出的100元还没有被写到数据库,小红读到的还是100 元,小红读到的就是小明没有提交的数据,这就是脏读。
2、不可重复读: 事务 读取到了 另一个事务已经提交的数据。 针对update
有些人会问,这不是问题,正确的做法不就是要读取到已经提交的数据吗,但有些情况是只需要读取未提交的数据,所以这是个问题。
例如:由于经验少,目前没有遇到这种情况,但是肯定有,
3、虚度、幻读:事务 读取到了 另一个事务已经提交的数据。 针对的是insert delete
解决事务隔离性产生的问题
1、读未提交:解决O个问题,还有3个问题 这三个问题就是前面说的三个
2、读已提交:解决1个问题,还有2个问题,解决第一个问题,还有后面两个问题
3、可重复读:一个事务读到的还是原来的数据,即使另一个事务已经提交,解决2个问题,还有1个问题 解决前面两个问题,还有最后一个问题
4、串行化:单事务、两个事务同时对一个内容进行操作,必须等待前一个事物操作完成,后一个事务才能进行操作。解决全部问题。
mysql默认的隔离级别:可重复读。 oracle默认的隔离级别:读已提交
丢失更新问题:
后一次更新将前一次更新的内容给覆盖了,这就是丢失更新问题,
l A 查询数据,username = 'jack' ,password = '1234'l
B 查询数据,username="jack", password="1234"l
A 更新用户名 username="rose",password='1234' --> username="rose",password="1234"l
B 更新密码 password="9999" ,username="jack" --> username="jack",password='9999'
第三句话:A将用户名更新为rose 此时数据库 username = rose password = 1234
第四句话:B将密码改为9999 但用户名还是jack 但是更新后,又把原数据库中username的rose更新为jack了,密码为9999
解决:乐观锁和悲观锁
乐观锁:丢失更新肯定不会发生,在数据库中增加一个标识符,比较版本号,如果一样,修改版本自动+1.。如果不一样,必须先查询,再更新
悲观锁:丢失更新肯定会发生:使用排他锁和共享锁
共享锁:只能读,不能写。
排他锁:只能一个进行写,不能拥有其他锁,也就是说,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A
二、如何确保N个线程可以访问N个资源同时又不导致死锁?
自我解答:
这题不会
参考答案:
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
自我评价:
首先得知道死锁的四个必要条件
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
解决死锁的方式最简单的就是让最后一个条件不成立,按同样的顺序加锁和释放锁
三、Java集合类框架的基本接口有哪些?
自己解答:
其实在写的随笔中,就有关于集合的总结,大概就三类接口、set、map、list
参考答案:
集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。
自我评价:
1、set接口:不可重复,无序,实现类有HashSet、linkedset等。
2、list接口:可重复,有顺序,实现类有arrayList、linkedList等
3、map接口:以键值对的形式来存储数据,键不能重复,实现类有hashMap等,
要看不同请看我写的JavaSE集合的深入的一系列博文
四、为什么集合类没有实现Cloneable和Serializable接口?
自我解答:
这个不知道,Serializable接口称为序列化接口,百度过,用来形成持久化对象用的,比如,将可序列化的对象存入到硬盘中。
参考答案:
克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化
自我评价:
首先得明白Serializable接口干嘛用的
1、Serializable接口
将对象的状态保存在存储媒体中以便可以在以后重写创建出完全相同的副本;
按值将对象从一个从一个应用程序域发向另一个应用程序域。
上面的官方解释太难懂了,通俗的讲,就是将对象转换为字节流后,还能从字节流转换成原来的对象,需要实现这样的效果,就需要将对象类实现Serializable接口。
2、cloning接口
需要将对象克隆,也就是使用clone()方法时,就需要实现该接口
明白了上面两个概念,实现着两个接口,是看具体的情况,并不是每个collection接口的实现类都需要使用上面的情况,所以只能根据具体的情况来决定是否实现Serializable接口和cloning接口。
组织语言:
首先理解Serializable接口和cloning接口是干什么用的,Serializable接口是序列化接口,实现序列化接口的实现类就是使用字节流传输,而实现cloning接口,是能够克隆自己,使用clone()方法,而并不是所有的collection都需要用到上面两种情况,所以不需要在collection上实现着两个接口。
五、什么是迭代器(Iterator)?
自己解答:
迭代器,就是用来迭代各种数据类型的,比如,取出数组中的每个数据,取出集合中的每个数据,将不同存储数据的类型用一个统一的方法来迭代出数据,这就是迭代器,为什么需要迭代器,因为如果要取出数组中的数据和要取出集合中的数据,他们要执行的代码不一样, 不统一,所以就有了Iterator接口。就是为了解决这个问题。
参考答案:
Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的
自我评价:
上面理解错了,使用iterator是因为在不同的集合中,都能使用Iterator来迭代,而不用管集合是哪个,而其他类也想用iterator迭代的话,那么就实现iterator接口,实现其中的方法,那么也能按照Iterator定义的方法来迭代了,平常普通数组就直接用for循环搞定啦,理解错了,是因为看一篇博客,讲解为什么有Iterator,迭代器设计模式时理解错了,博文地址:http://shmilyaw-hotmail-com.iteye.com/blog/1469288 感觉还不错这篇博客,起码让我知道了为什么使用Iterator,和它的设计。
1、迭代器的使用
实现了Iterator接口,使用方法iterator()要求容器返回一个Iterator,
next():返回第一个元素
hasNext():是否还有元素
remove():将返回来的元素删除。
注意:不可以直接调用集合中的方法remove()来删除元素,只能通过Iterator中的方法
2、为什么要有迭代器?
上面其实已经分析过来,为了让所有的集合都有统一的遍历方式,不用管集合是什么,迭代器统一了对容器的访问方式,collection接口就已经继承了Iterator接口,所以之下的所有collection接口实现类都已经实现了Iterator接口。
Java常考面试题(四)的更多相关文章
- Java常考面试题
Java常考面试题 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...
- Java常考面试题整理(四)
有关所有Swing相关的面试题,都可以说是凑数的,感觉自己在敲这些的时候感觉一点用处都没有,可以从第72条开始看. 61.说出三种支持重绘(painting)的组件. 参考答案: Canvas,Fra ...
- 阿里巴巴JAVA常考面试题及汇总答案
一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? 答: 1.String是字符串常量,StringBuffer和StringB ...
- Java常考面试题(五)
序言 好好努力. ---WH 一.Iterator和ListIterator的区别是什么? 自我解答: Iterator是针对所有collection来使用的,而看名字ListIterator,顾名思 ...
- Java常考面试题(三)
序言 说说今天遇到的一件小事吧,在遇到问题,查找答案时,看到很多人的博客里面都有提到关键字眼,可让人觉得可恨的是,大多数人写的博文中,基本上都是照着书上的语言发表的,看了跟没看一样,没有一点通俗的语言 ...
- Java常考面试题(二)
序言 昨天刚开始的”每日5题面试“这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看做过的面试题,试着用 ...
- Java常考面试题(一)
序言 我是一只乱飞乱撞的菜鸟,写的文章目前是以记录自己学习,和方便以后查看,期待日后不久能通过自己的努力,获得一点小小的成功,然后写出我的学习经验总结性文章来. ---WH 一.什么是虚拟机?为什么J ...
- Java常考面试题(二)(转)
序言 昨天刚开始的"每日5题面试"这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看 ...
- Java常考面试题(经典)
什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被设计 ...
随机推荐
- Java volatile 的测试(Java代码实战-004)
package Threads; /** * Created by xfyou 2018/5/21 16:07. */ public class VolatileTest { private stat ...
- POJ 2186 强联通分量
点击打开链接 题意:牛A喜欢牛B,若牛B喜欢牛C,则牛A喜欢牛C,问最后多少牛被其它全部牛喜欢 思路:用强联通分量进行缩点,最后形成的图是有向无环图DAG.而拓扑序的值为DAG的长度,则加一,可是最后 ...
- MUI(拍照+系统相册)图片上传剪切预览
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 2、redis原生的命令操作不同数据类型
一.常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 String是最简单的类型,一个key对应一个v ...
- LVM逻辑卷管理测试——创建逻辑卷
虚拟机里再添加两块硬盘,如下所示: 启动系统后,我们可以看到新添加的两块硬盘为/dev/sdb和/dev/sdc.每个2GB. [root@lxjtest ~]# fdisk -l Disk /dev ...
- ACE的源码划分
前几篇文章也提到过,ACE的所有源文件和头文件都杂乱堆在了ACE_wrappers/ace目录下.这样的代码组织方式给学习ACE带来了很大的困难,很多朋友在看到ace目录下庞大的代码的时候,几乎就失去 ...
- docker运行nginx为什么要使用 daemon off
再返回Nginx的docker仓库仔细查看说明,其实是有说明的 /捂脸- 就是在CMD后面加上exec nginx -g 'daemon off;',如下: command: /bin/bash -c ...
- lua一些特殊函数说明
setclLvalue(L, L->top, cl); 这是个宏展开是这样: ((L->top)->value_).gc = obj2gco(cl); //top valud gc ...
- <转>字节码指令
本文转自:http://www.cnblogs.com/nazhizq/p/6525263.html 在llimits.h文件中定义了指令的类型.其实就是32个字节. typedef lu_int32 ...
- Jquery 数组操作(转)
在jquery中处理JSON数组的情况中遍历用到的比较多,但是用添加移除这些好像不是太多. 今天试过json[i].remove(),json.remove(i)之后都不行,看网页的DOM对象中好像J ...