一次外企公司Java面试体验纪实(转)

转的网友的一次Java面试经历。

前言

3月末,像我这种年轻浮躁的程序员心里的魔鬼被放了出来。跳槽!跳槽!
实际上我也有了offer,可能是offer不够吸引我吧,或者说我还有梦想。最近去了一家外企面试,公司规模不大,但是通过看简介以及跟HR沟通,觉得公司是难得遇见的优秀的公司,可能会遇到很nice很open的人。
废话多了,接入正题。

面试经历

4点半我准时到达门口,一个女孩子坐在进门的小圆桌上抱着一个笔记本在奋笔疾书。我摁下门铃,她帮我开门,我说面试,接着她抱着电脑叫了一声赛瑞(Sarry)? 应该是这个发音。一个小巧玲珑的HR出来了,跟我稍微谈论了一下说要拿张笔试题给我做一下。拿到笔试题之后大致看了一下,5道题,非常简单
1、&与&&的区别
2、继承和实现的区别
3、多态是什么,简单解释
4、线程的实现方式
5、单例模式实现

接下来第一轮面试,一个Java相关的技术人员,面容很老了,听说大概十多年工作经验。觉得很强。
面试官问了下面试题部分,我简单讲解了下。面试官对我写的单例模式提出了个疑问(我写的恶汉,因为代码比较简单),这个代码是否线程安全? 我心里笑了一下,这点小问题…
这个是我当时写的代码:

这个代码肯定是最简单的,我是懒得写,我就把线程安全的单例给口述了一遍
一种是这个,加synchronized关键字,可以保证线程安全性。

但这种颗粒度比较大,直接在方法上面加了synchronized关键字,稍微会影响点效率吧。还有一种叫双重同步锁的实现方式:

这种方式在进入方法的时候不会加锁,进入方法后判断是否已经存在实例,不存在再创建的时候加锁,加锁之后再判断是否存在实例(有可能在加锁的过程中别的线程刚释放锁并且生成了实例,这个时候实例不为null),这种双重判断的方式对效率会有一点增益,也保证了线程安全,名曰双重同步锁的单例模式。

面试官又问了Java8的一些新特性是否了解,我对Java8也是了解了一点点,Java8推崇函数式编程。之前看了@FunctionalInterface这个注解,该注解标注的接口只能有一个抽象方法,此接口被称为函数式接口。通过阅读这个注解的源码注释可以知道:
1、该注解只能标记在”有且仅有一个抽象方法”的接口上。
2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
4、该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
讲了下lambda表达式,stream流操作。
我对面试官说stream流其实效率不高,看着大佬的表情泛起了疑问,哈哈哈哈。

接着面试官又问了我一些线程方面的。
1、造成死锁的原因
2、Lock与synchronized,wait与sleep
3、java并发包的了解

问了一些微服务中间件相关的,我简单讲解了一下dubbo的结构,表示理解可能不是很深刻,讲了讲redis注册服务,讲了讲做过得项目架构,以及RPC调用的几种方式。讲了讲MQ,以及延时队列的实现。讲了讲MongoDB的使用体验。大概好像也就这些,有的可能记忆不太清楚了。

第二轮面试,过一会又来一个面试官,CTO级别的。性格很open,来了就开始说你也看过flutter,我说简单涉猎一点,就开始问我一些dart的语法。

接着出了一个简单的问题:
A说B说谎,B说C说谎,C说AB都说谎,至少有一个人说谎。问谁说谎?(考离散数学命题)
试推理:
1、假设A说B说谎是真,那B说C说谎是假,C说AB都说谎是真,与原命题假设矛盾 ✖
2、假设A说B说谎是假,那B说C说谎是真,C说AB都说谎是假,AB有可能只有一个人说谎 ✔
即推理2为正确答案:A说谎,B没有说谎,C说谎。

再接下来考计算机网络相关的七层协议:
这个概念性的,我计算机网络学的一般,概念也没记全,所以当时没答完,羞愧了。

又问了下数据库ACID
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性:在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

大概这些吧也问了一些操作系统软件工程相关的,概念性的东西。

我比较懒的记,这可能就是此次面试吃亏的原因吧。面试的时候二面觉得自己面的不够好。基础不够扎实,面试准备不够充分。慢慢积累吧,前方道路还很长。

0

java里如何验证email邮件地址?

java里如何验证email邮件地址?

1.使用正则表达式

2.使用commons-validator包提供的方法

pom依赖

验证使用

0

java里int型的最大值是多少?

java int最大值是:2147483647

int 类型数占4个byte.

1byte=8bit

也就是有32个bit占位符

可以用位移运算得出

那不是32位么,怎么计算只有30?

由于Int最高位,也就是第32不是用来计算value,而是用来表示此值是正数还是负数,0表示正数,1表示负数。不参与value计算。

所以只有31位,那还差一位,二进制换算,是从0开始的,在移位过程中,移到30位,就是第31bit值。

java里int型的最大值是多少介绍完了,更多Java相关文章请持续关注本站!

0

java里使用Thumbnails进行指定大小压缩图片

以下是java压缩图片至指定大小的代码

代码里的imageId仅做日志输出用途,getAccuracy()方法是本人测试了几张图片后得出的经验数值(为了减少循环次数),也可以不用,直接传入压缩质量比即可。

0

Java将List转换为逗号分隔的字符串

1.利用Guava的Joiner

List list = new ArrayList();
list.add(“a”);
list.add(“b”);
list.add(“c”);

String str = Joiner.on(“,”).join(list);

2.利用Apache Commons的StringUtils

List list = new ArrayList();
list.add(“a”);
list.add(“b”);
list.add(“c”);

String str = StringUtils.join(list.toArray(), “,”);

0

Java 里的字符串反转

方法一:

方法二:利用JDK提供的方法

如果描述改一下,输入一个字符串,例如“abcd”,输出”dcba”

0

一文告诉你java是高级语言吗?

很多刚接触java的朋友可能会疑惑,java是高级语言吗

可以肯定的说,Java语言是高级语言。Java和C都是计算机的高级语言。相对低级语言来说,高级语言更接近人类的思维方式,更容易理解和掌握,用高级语言编写程序时,感觉像是学生写作文一样,既能表达准确又不那么吃力。

低级语言分为机器语言(二进制语言)和汇编语言(符号语言)。早期的程序开发,用的是汇编语言,编程难度较大,因为汇编语言不容易理解和掌握。汇编语言跟计算机的硬件关系密切,涉及到计算机底层的指令系统。

我们知道,高级语言最终还是要编译成低级语言,计算机才能读懂和执行的。

高级语言与计算机底层的硬件与指令没什么关系,可以很方便地表示数据的运算和程序的控制结构,描述各种算法,容易学习掌握等等。但是,用高级语言编写的程序,编译生成的指令代码比汇编语言编写的程序的代码的要长,执行的速度也慢。

所以,汇编语言还是有它的好处的,因为汇编语言能直接被机器所读懂并执行了!速度快,还能开发与硬件相关的程序!

C跟Java的区别主要在于编程思维的特点,C是面向过程,Java是面向对象。相比面向过程,面向对象的优点是:可重用性高、可扩展性强、可维护性好。

这两种思维对我们人类解决问题时,都是很重要的,面向过程与面向对象各有优劣,各有侧重点。而面向对象被应用得更广泛。

java是高级语言吗,看到这相信大家会有所了解了。

0