你离BAT之间,只差了解这些面试题

工作多年,我经常能体会到,有些确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因:

1、“知其然不知其所以然”。 做了多年技术,开发了很多业务应用,但似乎并未思考过种种技术选择背后的逻辑。

2、知识碎片化,不成系统。 在面试中,面试者似乎无法完整、清晰地描述自己所开发的系统,或者使用的相关技术。平时可能埋头苦干,或者过于死磕某个实现细节,并没有抬头审视这些技术。

前人已经掉过的坑,后来的朋友就别再“前仆后继”了!

Java基础
1、谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?

考点分析:

对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化, Java 知识理解得也比较全面,一定要避免让面试官觉得你是个“知其然不知其所以然”的人。 毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。

回归正题,对于 Java 平台的理解,可以从很多方面简明扼要地谈一下, 例如:Java 语言特性,包括泛型、Lambda 等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。

2、请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?

考点分析:

分析 Exception 和 Error 的区别,是从概念角度考察了 Java 处理机制。总的来说,还处于理解的层面,面试者只要阐述清楚就好了。

我们在日常编程中,如何处理好异常是比较考验功底的,我觉得需要掌握两个方面。

第一,理解 Throwable、Exception、Error 的设计和分类。 比如,掌握那些应用最为广泛的子类,以及如何自定义异常等。

很多面试官会进一步追问一些细节,比如, 你了解哪些 Error、Exception 或者 RuntimeException?

第二,理解 Java 语言中操作 Throwable 的元素和实践。 掌握最基本的语法是必须的,如 try-catch-finally 块,throw、throws 关键字等。与此同时,也要懂得如何处理典型场景。

3、谈谈 Java 反射机制,动态代理是基于什么原理?

考点分析:

这个题目给我的第一印象是稍微有点诱导的嫌疑,可能会下意识地以为动态代理就是利用反射机制实现的,这么说也不算错但稍微有些不全面。 功能才是目的,实现的方法有很多。

总的来说,这道题目考察的是 Java 语言的另外一种基础机制: 反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。 而动态代理,则是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。

从考察知识点的角度,这道题涉及的知识点比较庞杂,所以面试官能够扩展或者深挖的内容非常多,比如:

考察你对反射机制的了解和掌握程度。

动态代理解决了什么问题,在你业务系统中的应用场景是什么?

JDK 动态代理在设计和实现上与 cglib 等方式有什么不同,进而如何取舍?

4、Java 提供了哪些 IO 方式? NIO 如何实现多路复用?

在实际面试中,从传统 IO 到 NIO、NIO 2,其中有很多地方可以扩展开来,考察点涉及方方面面,比如:

基础 API 功能与设计, InputStream/OutputStream 和 Reader/Writer 的关系和区别。

NIO、NIO 2 的基本组成。

给定场景,分别用不同模型实现,分析 BIO、NIO 等模式的设计和实现原理。

NIO 提供的高性能数据操作方式是基于什么原理,如何使用?

或者,从开发者的角度来看,你觉得 NIO 自身实现存在哪些问题?有什么改进的想法吗?

5、如何保证容器是线程安全的?ConcurrentHashMap 如何实现高效地线程安全?
典型回答:

Java 提供了不同层面的线程安全支持。在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用 Collections 工具类提供的包装方法,来获取一个同步的包装容器(如 Collections.synchronizedMap),但是它们都是利用非常粗粒度的同步方式,在高并发情况下,性能比较低下。

另外,更加普遍的选择是利用并发包提供的线程安全容器类,它提供了:

各种并发容器,比如 ConcurrentHashMap、CopyOnWriteArrayList。

各种线程安全队列(Queue/Deque),如 ArrayBlockingQueue、SynchronousQueue。

各种有序容器的线程安全版本等。

具体保证线程安全的方式,包括有从简单的 synchronize 方式,到基于更加精细化的,比如基于分离锁实现的 ConcurrentHashMap 等并发实现等。具体选择要看开发的场景需求,总体来说,并发包内提供的容器通用场景,远优于早期的简单同步实现。

6、谈谈接口和抽象类有什么区别?

考点分析:

这是个非常高频的 Java 面向对象基础问题,看起来非常简单的问题,如果面试官稍微深入一些,你会发现很多有意思的地方, 可以从不同角度全面地考察你对基本机制的理解和掌握。

比如:

对于 Java 的基本元素的语法是否理解准确。 能否定义出语法基本正确的接口、抽象类或者相关继承实现,涉及重载(Overload)、重写(Override)更是有各种不同的题目。

在软件设计开发中妥善地使用接口和抽象类。 你至少知道典型应用场景,掌握基础类库重要接口的使用;掌握设计方法,能够在 review 代码的时候看出明显的不利于未来维护的设计。

掌握 Java 语言特性演进。 现在非常多的框架已经是基于 Java 8,并逐渐支持更新版本,掌握相关语法,理解设计目的是很有必要的。

Java进阶
7、synchronized 底层如何实现?什么是锁的升级、降级?

考点分析:

今天的问题主要是考察你对 Java 内置锁实现的掌握,也是并发的经典题目。我在前面给出的典型回答,涵盖了一些基本概念。如果基础不牢,有些概念理解起来就比较晦涩,我建议还是尽量理解和掌握,即使有不懂的也不用担心,在后续学习中还会逐步加深认识。

我个人认为,能够基础性地理解这些概念和机制,其实对于大多数并发编程已经足够了,毕竟大部分工程师未必会进行更底层、更基础的研发,很多时候解决的是知道与否,真正的提高还要靠实践踩坑。

后面我会进一步分析:

从源码层面,稍微展开一些 synchronized 的底层实现,并补充一些上面答案中欠缺的细节,有同学反馈这部分容易被问到。如果你对 Java 底层源码有兴趣,但还没有找到入手点,这里可以成为一个切入点。

理解并发包中 java.util.concurrent.lock 提供的其他锁实现,毕竟 Java 可不是只有 ReentrantLock 一种显式的锁类型,我会结合代码分析其使用。

8、synchronized 和 ReentrantLock 有什么区别?有人说 synchronized 最慢,这话靠谱吗?

考点分析:

今天的题目是考察并发编程的常见基础题,我给出的典型回答算是一个相对全面的总结。

对于并发编程,不同公司或者面试官面试风格也不一样,有个别大厂喜欢一直追问你相关机制的扩展或者底层,有的喜欢从实用角度出发,所以你在准备并发编程方面需要一定的耐心。

我认为,锁作为并发的基础工具之一,你至少需要掌握:

理解什么是线程安全。

synchronized、ReentrantLock 等机制的基本使用与案例。

更近一步,你还需要:

掌握 synchronized、ReentrantLock 底层实现;理解锁膨胀、降级;理解偏斜锁、自旋锁、轻量级锁、重量级锁等概念。

掌握并发包中 java.util.concurrent.lock 各种不同实现和案例分析。

典型回答:

synchronized 是 Java 内建的同步机制,所以也有人称其为 Intrinsic Locking,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里。

在 Java 5 以前,synchronized 是仅有的同步手段,在代码中, synchronized 可以用来修饰方法,也可以使用在特定的代码块儿上,本质上 synchronized 方法等同于把方法全部语句用 synchronized 块包起来。

ReentrantLock,通常翻译为再入锁,是 Java 5 提供的锁实现,它的语义和 synchronized 基本相同。再入锁通过代码直接调用 lock() 方法获取,代码书写也更加灵活。与此同时,ReentrantLock 提供了很多实用的方法,能够实现很多 synchronized 无法做到的细节控制,比如可以控制 fairness,也就是公平性,或者利用定义条件等。但是,编码中也需要注意,必须要明确调用 unlock() 方法释放,不然就会一直持有该锁。

synchronized 和 ReentrantLock 的性能不能一概而论,早期版本 synchronized 在很多场景下性能相差较大,在后续版本进行了较多改进,在低竞争场景中表现可能优于 ReentrantLock。


这些资料是小编最近花了几个月的时间整理出来的,想要获取上面的资料
点击“了解更多”即可免费获取

原文地址:https://blog.51cto.com/14416052/2421057

时间: 2024-09-28 11:30:47

你离BAT之间,只差了解这些面试题的相关文章

你与优秀源码之间只差一个 Star

fir.im Weekly - 你与优秀源码之间只差一个 Star 说起开源社区,Github 是一个不可缺少的存在.作为全球最大的同性交友网站,上面有太多优秀的开源代码库和编程大神,让无数开发者心生向往.那么如何正确的使用 Github,也许是编程学习之必要.来看下@googdev 的 关于如何选择开源项目 ,如何正确使用开源项目,如何发现优秀的开源项目,同时作者还出了几篇从0开始学习 GitHub的系列文章,对于迫切需要成长的开发者会有所帮助. 本期fir.im Weekly 收集了不少好的

你与年薪百万程序员之间只差这4个习惯

程序员(误:猿),在不同的领域和场合,他们有很多不同的称呼,软件工程师 (Software Engineer),程序员(Programmer),编码人(Coder),开发人员(Developer).这群人非常熟悉如何用计算机语言来完成自 己的工作,并乐此不疲.但是,如何从普通码农进阶为一名优秀的程序员却是一条艰辛的路.我们来看看CSDN上程序猿大牛推荐的4个习惯,对于如何走上优秀 程序员之路会有些启发. 0. 时刻保持求知欲. 吸取新知识,千万不要局限于程序员领域,就算是你有了10年以上的程序员

你跟大牛之间只差一个google

google在中国被墙的厉害,http://209.116.186.231/ 这个地址可以访问google.另外,有VPN或者某个神奇的浏览器也可以. 非技术人员,还可以凑合着用百度,但是技术人员必须用google,bing都不行. 经常在QQ或者论坛里看到人问一些问题,我心里会问,"自己有先查过吗".如果没有的话,那么就不具备一个程序员的基础素质,就是解决问题的能力.如果有,但是没有查到结果的话,那么就应该掌握一些技巧了. 基本上,我们会欣赏一些能够独立思考和解决问题的人.当然在刚入

你和理想生活之间,只差一个“她”!

曾经以为,站在事业最高峰,就是人生的最大目标,而今终于明白,让心灵从容自在才是生活的真谛.听腻了车马喧嚣,自然会向往鸟鸣啾啾,事实上,你距离你想要的理想生活,只差一个"她"! 置身于她的怀抱,满园花香代替城市中的汽车尾气,葱郁草木唤醒内心对自然的渴望.花团锦簇,鸟语花香,徜徉墅境之间,沉醉自然的清新魅力里. 如果说自然是散文,那么建筑就是凝固的诗篇.来自美国纽约的褐石建筑在这座美丽的园林,续写着那个优雅年代的曼妙时光,缔造永不褪色的百年褐石区.(http://www.landart.c

从投资小白到理财高手 只差三步

投资理财原本被认为是有钱人的事,不过随着观念的改变,理财也"飞入寻常百姓家".理财的收益让人心动,它的风险却让人畏惧,对于理财小白们来说,理财让人又爱又惧.那么,作为投资小白,怎么成为理财高手呢?一起来听听妙资财富理财师是怎么说吧! 财富体检 妙资财富理财师建议,在投资理财之前,先得寻找专业的理财机构做一次"家庭财富体检",而非急匆勿选择某某理财产品.许多人常常意识不到家庭财富体验的重要性.什么是家庭财富体检呢?对个人的财务状况进行全面的梳理和摸底,了解个人全部资产

我们与上帝的距离只差一台量子计算机

我们与上帝的距离只差一台量子计算机 上帝啊上帝,你能不能创造出一块自己搬不起来的石头?上帝笑而不语,默默的掏出了一台量子计算机. 扎克伯格君是科技圈的大拿(之一),作为Facebook帝国的帝王,上个科技新闻的头版头条再自然不过,然而最近我们却发现,他似乎还有意攻占除了科技频道之外的所有新闻版块. 上周他用捐巨款的方式占领了社会新闻的高地,而这一次,他又用另一张看似漫不经心的照片引爆了朋友圈? ▲“你以为我是在炫父爱,其实我是在秀智商” 孩子还未满一个月,小扎就已经在给她讲量子物理了!!!某种程

从现实到理想,你只差一个透视宝的距离

当用户投诉说,无法用APP下单的时候,大家是怎么做的呢? 现实中,大家是这样的: 小钉:大锤,673***[email protected]这个客户说没法付款,试了好多次,点支付按钮没反应. 大锤:客户用什么手机 小钉: 大锤:让客户截张图来看看 小钉: 大锤:让测试同学测过了,问题没有重现,没法解决. 小钉:... 理想的状态是怎样的呢? 小钉:大锤,673***5这个客户说没法付款,试了好多次,点支付按钮没反应. 大锤:我查一下.查到673***5客户,看看"支付"行为,发现代码问

UESTC 250 数位dp(数字相位数之间的差值不小于2)

http://acm.uestc.edu.cn/#/problem/show/250 windy定义了一种windy数. 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. 满足 1≤A≤B≤2000000000 . Output Sample input and output Sample Input Sample Output 1 10 9 Source Windy /*

[微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小_利用排列组合思路解决_python版

(原题出自微软公司面试题)问题如下:有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小.例如:a=[100,99,98,1,2, 3]b=[1, 2, 3, 4,5,40] 题目是看到QQ群友发的,网上也百度了下目前已经有好几种解法了.写了半天有点晕,后面忽然想到中学时候数学里面的排列组合的方法.方法对于较短的list可行,长list组合情况太多,可能耗时太长或溢出. 1 from itertools im