java面试题知识点总结.doc
《java面试题知识点总结.doc》由会员分享,可在线阅读,更多相关《java面试题知识点总结.doc(6页珍藏版)》请在冰豆网上搜索。
1.为何要使用同步?
java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性。
(1)同步方法 :
即有synchronized关键字修饰的方法。
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。
在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
代码如:
publicsynchronizedvoidsave(){}
注:
synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类
(2)同步代码块 :
即有synchronized关键字修饰的语句块。
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
代码如:
synchronized(object){
}
注:
同步是一种高开销的操作,因此应该尽量减少同步的内容。
通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
2.说好拿到offer就来牛客发面经,实现承诺
一面:
1.说说C语言中free和malloc区别
不知道。
我不是学C的。
2.你知道基数排序么?
忘了,知道计数。
(这时候心想玩了,连续2个问题都不会,还玩个P?
)
3.说说什么是内存溢出和内存泄露
内存溢出:
介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明
内存泄露:
介绍GC和GCRoot不正常引用。
4.看来你对JVM蛮熟悉的啊,那你说说JAVA怎么分配直接内存?
A:
JAVA不能直接分配内存吧?
Q:
我说是分配直接内存不是直接分配内存。
A:
是NIO类的直接内存么?
Q:
是的。
A:
有点不记得了,能提示下么?
Q:
sun的一个包。
A:
我想起来了,sun.misc.Unsafe类,那个要通过反射获取吧。
平常没怎么用过。
Q:
不用反射
A:
我咋记得要。
Q:
不用的,你再回去看看看(面试官记错,后面他自己纠正错误了)
A:
好吧。
5.介绍下NIO
6.能介绍下mybatis的原理么?
从configuration类说起,然后MapperStatement,然后SqlNode解析,然后连接池,然后resultMap映射,balala说了10分钟。
7.网络方面熟悉么?
A:
熟悉
Q:
那说说TCP/IP三次握手
8.说说http,tcp,udp之间关系和区别。
9.说说浏览器访问,经历了怎样的过程。
二面、
1.讲讲spring IOC原理以及生命周期。
2.讲讲mybatis的连接池。
3.讲讲IO里面的常见类,字节流字符流。
4.讲讲NIO。
5.讲讲tomcat和你做的httpServer.
6.你是通过哪些途径学习这些技术。
7.你是否有想过把mybatis实现成分布式吗?
8.java的基础类型和字节大小。
3.很不幸,二面面完就结束了今天的面试。
预约的时间是下午4点30分到5点15分的时间段,天气比较闷热,算好时间,下午2点半从学校出发,3点50到达面试酒店,本想买瓶水,想想阿里这么大个公司,面试应该会给我们发瓶水的吧,于是我就没买,事实证明我想多了,没有!
签完到去一个厅里面等候,左看看右看看,真没有水!
人挺少的,没过几分钟,3点55分,叫到我的号去某某位置上面试,说好的4点半呢,人和人之间这么点信任都没有了吗?
于是我气还没喘匀就去到面试的大厅了,,到了一个面试官跟前,坐下来,把我的简历给了他,他边看边让我自我介绍。
一面:
整整70分钟!
(说好的45分钟呢?
人和人之间这点信任都没有了吗?
)
1、问:
你把java内存模型的架构给我画一下吧?
我:
迟疑了一下,心想,JMM这玩意儿有架构图吗?
这可怎么画。
面试官看我迟疑,说,那你不画,先说一说吧,我就跟他说了由于什么指令重排序,处理器缓存什么的,不同的系统或者平台有不同的内存模型,使得相同的java程序在不同的处理器架构下的表现不一致啊,java内存模型就是为了在不同的处理器架构和平台下给java程序员提供一致性内存访问的保证的。
本以为后面要问到volatile的内存语义,内存屏障,happens-before之类的,没想到面试官来了一句:
你完全说错了,你说的这个是java的跨平台特性,不是内存模型,然后说内存模型是什么什么堆、栈之类的。
于是我就懵了,我就想到了原来面试官理解的内存模型就是我理解的java运行时数据区域(程序计数器,虚拟机栈,本地方法栈、java堆,方法区)。
我也不敢跟面试官多争论,简单地表达了一下我的观点,然后他就接着问我,那你说说java是如何实现跨平台的。
2、问:
说一下HashMap是如何实现的吧
我:
就先画了一下结构,再说了一些什么拉链法解决冲突,什么JDK8里面冲突达到一定数量的时候就改用了红黑树的存储等等,然后问我怎么扩容。
3、问:
说一下ConcurrentHashMap吧
我:
JDK7里面采用的是分段锁机制什么的,读的时候不加锁,写的时候分段加锁,先定位到某个段,然后段里面的操作委托给HashMap等等。
然后又说JDK8里面ConcurrentHashMap有很大变化,从1600多行代码扩充到了6000多行代码。
(还好没接着问我JDK8里面是怎么实现的,就昨天晚上瞄了一眼,6000多行代码确实没看下来)
4、问:
用他的电脑给我看了一段程序,问我输出结果是什么,跟finally块相关的,考察点就是try块里面return了某个值,finally里面又对该值进行操作了,问最后的结果是什么,我知道return之前会先执行finally块里面的操作,但是操作的是引用类型还是值类型的情况是不一样的。
本想把那个代码回忆起来,想想还是算了,应该有人能知道我说的是什么意思。
我在回答这道题的时候面试官还“贱贱地“说这道题是有坑的,然后看我踩坑了还很鄙视的说一句:
看那么多书连引用类型和值类型都搞不清楚。
5、synchronized相关的,为什么同步块太大会影响性能?
不同的线程拥有不同的对象锁,它们之间会有影响吗?
如果synchronized加在静态方法上面那么锁指的是什么?
(在这个地方又跟面试官就几个名词纠缠了一会儿,我说锁是Class对象,他问是实例还是对象,他说实例是静态的,对象是动态的,我说Class是静态的,对象是动态的,然后他说我们不说类了,用英文,instance和对象,我说instance我理解的就是对象啊,可能他觉得instance是指类,对象就是new出来的对象,也许是我没看过英文版的书吧)于是我接着说,指的是对象,是java虚拟机将一个类的字节码加载进内存之后生成的一个java.lang.Class对象,然后他可能没听明白我说的,还是在问,到底是类还是对象,我其实已经明白他的意思了,然后说,按照您的描述,那就是类。
然后他好像满意了,就下一题了。
(那明明就是一个Class对象嘛,Class对象不也是对象)
6、问:
基本排序和查找相关的,问我有哪些排序和哪些查找算法,(期待让我写个快排什么的,早就憋在心里了,分分钟搞定的事, 然而并没有)他让我描述一下选择排序的过程,就扯了扯,然后他问,你确定这是选择排序吗?
我说,我很确定。
(强调了“很”字,说的很坚决,他也没说什么,希望别又在理解上面跟我有偏差,我说的那个绝对是纯正的选择排序,如假包换)。
7、写代码,给我5分钟,让我实现一个Stack,底层数据结构用数组。
我问他需要支持扩容吗,他说先不用。
写完他拿过去一看,可能是我写的太丑了,他又还给我,让我解释一下代码,然后就解释了一下。
8、问我用栈怎么实现队列,我说用2个栈来实现,他问我具体怎么操作,我说我可以想一下吗?
他说可以,然后我想了一下,画个图给演示了一下。
9、问我有没有登过网页版微信,问我用手机扫二维码登录是怎么实现的。
不会
10、问我知道阻塞队列吗,让我自己实现阻塞队列我会怎么做?
我说我会用两种方法来实现,一种是用wait和notify的方式,一种是用Condition条件变量的方式,然后他问怎么用wait和notify实现,我就把思路说了一下。
最后他还问我是什么时候接触编程的,我说大一。
我不知道他最后问了我一个这个问题是什么意思
就想起来这么些了,整整70分钟,我已经说的口干舌燥了。
面试完,他说,今天的面试结束了,我顿时就懵了,按照我了解的,这就代表没通过的意思,但是我觉得我答的很好,百分之九十都答出来了,而且很多都说的很详细。
我一脸疑惑,还是很客气的说谢谢,准备走呢,马上又听到他说,你先到外面等一下,然后我又说好的,谢谢。
然后他接着说,准备下一轮吧,我说好的,谢谢。
然后就出来了。
出来之后到了等候的大厅,整个人都虚脱了,又左看看,右看看,还是没有水,没过几分钟,元气还没恢复,让我去二面
二面:
45分钟。
拖着疲惫的身子,走到二面面试官前,一见其人,明显能感受到这就是大神,那拖鞋,那发型,那胡子,此时我已经身心俱疲,硬着头皮坐下来,先自我介绍,问了几个问题,然后说那我们写一个简单的题目吧。
他把电脑转过来,让我看其中某个题目,说你做一下这道题吧。
用java统计一个文本文件中出现的频率最高的20个单词。
多经典的题目啊。
我问能用shell命令来实现吗?
他说用java。
于是我用了HashMap,都弄到map里面去了之后,我发现我不会排序。
集合类里面的排序方法确实没怎么用过,于是我就卡在这里了。
然后我跟他说我数据结构选错了,我应该选能排序的map,比如说TreeMap,他说那你接着写,我又不想写了,因为我只是知道TreeMap是怎么一回事,并没有去用过这个TreeMap,而且排序的话它应该是按照key来排序的,我这里的key是单词,并没有什么用,我也不知道该怎么按照后面的value来排序,我也想到可以调用map的entrySet方法得到一个集合,然后我可以对这个集合进行操作,总之我想了很多,但是对一些操作不太熟就没有继续下去了。
我觉得这道题目应该很简单啊,没想到我竟然没写出来。
其实方法还是有的,map都拿到了,排个序岂能难倒我,大不了再倒腾一下,我冒泡也能给它解决了,但是我实在是不想用这么low的方式,然后我就放弃了,没接着写。
然后面试官说,好的,那我们再来写一个简单的题目吧。
题目大概意思就是用面向对象的思想实现题目说的那个场景,具体题目就不说了,我并没有太明白题目的意思,感觉可以用一个HashMap的数据结构来实现,然后我就自己照着HashMap的代码写了写,写了点我又停下了,因为我并没有太理解题目的意思,所以我也不知道该怎么写,于是我又放弃了,真要我实现一个HashMap我也是可以写出来的,毕竟源码我看过很多遍了,一是想到有点麻烦,二是想到我可能没正确理解题目的意思,然后我就放弃了,放弃了,弃了,了。
两道题目下来,我心理已经被击溃了,然后他问我有没有研究java方面的新技术,问我想从事哪一方面的开发,问我阿里云,淘宝等等这些有没有对哪个比较有意向,这个时候的我意识已经开始模糊了,话也说不清楚了,舌头也捋不顺了,这几个开放性的问题答的我都恨不得抽死自己。
总之,一面给自己打90分,二面给自己打20分
经验就不说了,没什么好的经验
教训就说一下吧:
面试之前带好水(之前牛客上有篇面经提到过要带水的,我没有听那位兄弟的话。
也可能是有水我没看到吧)
对于面经里面的题目没必要太看重,每个人遇到的问题肯定是很大不同的,除了一些太常见的题目,比如HashMap,ConcurrenthashMap之类的,就像很多面经里面提到的数据库,网络方面的问题,我这次面试就提都没提这方面的东西。
对于面经我们可以从中看看哪些大的方面在面试的过程当中会问的比较多,然