打开网易新闻 查看精彩图片

最近正式面试黄金时间期了,你是不是也开始面试或准备面试了?

如果计划跳槽换工作,强烈给你推荐这篇文章,干货满满:

(这两年大环境不好,当你真的出去面试后会发现不是什么黄金期,这个黄金期只是相对这一年来说)

昨天,一位朋友和面试官吵起来了,很多人可能都会认为面试官都很牛的,其实,非也。不是每个面试官都很牛的,有的面试官也是很水的,尤其是在中小厂,大厂大部分还是不会差的。

本人2017年在杭州滨江的一家小公司待过,技术团队十多号人,Java开发8个人,但是技术总监(其实就是个项目经理)多年没敲代码了,甩锅吹牛逼那是很拿手的,但是每个人来面试都必须过他的技术面试(我当时进去没有面试,因为我和这个技术总监是上家公司就认识的,有时候也是我去面试,但是他都会再面一次的)。

回到上面的话题中,为什么会有冲突呢?

面试现场

下面是这位朋友的真实面试经历,下面是面试对话过程:

面试官:说说String为什么不可变?

面试者:String中使用char数组value来存储String内容的,并且没有给外部提供相应能修改value数组内容的方法。

面试官:就这样吗?

面试者:是的

面试官:你确定没有方法能修改value内容吗?

面试者:嗯?

打开网易新闻 查看精彩图片

面试官:我劝你回去好好看看String源码!

面试者:那您能不能给我普及一下为什么不可变?

面试官:今天反正也不忙,我给你说说吧。其实,这里主要有几个点,第一是是修饰的类,表示这个类是不可以被继承,第二是你说的数组也是修饰,也就意味着这个一旦被赋值了就不能改变了,重点在这里。

String

final

String

char

value

final

value

面试者:就这样吗?

面试官:嗯

面试者:你这好像不对吧,这个是数组,因为是final修饰,确实一旦赋值了就不可以改变了,但是,数组里的数据是可以改变的呀。

value

面试官:怎么可能!你都学看的是什么书啊(一脸不屑地看着,附带着冷笑)。

打开网易新闻 查看精彩图片

面试者:哎,你不能这么说话,你这讲错了,就你这水平还能当面试官?

面试官:???我现在就是面试官,要不你来当面试官吧。

接下来的画面,这里就不说了,两个人互怼了几句,这场面试就这样结束了。

面试复盘

整个面试过程中,面试官确实在关键点上说了一些,但是最后的那个不可变回答不对。

为什么不对?下面我们来验证一下final修饰的char数组内容能不能改变。

publicclassStringDmo{
privatefinalcharvalue[];
publicStringDmo(char[]value){
this.value=value;
}
publicstaticvoidmain(String[]args){
Stringaa="hello";
StringDmostringDmo=newStringDmo(aa.toCharArray());
System.out.println(stringDmo.value);
stringDmo.value[0]='t';
System.out.println(stringDmo.value);
}
}

这段代码很容易看懂吧,但请注意这行代码:

stringDmo.value[0]='t';

这行代码就是把value数组的第一个数据重新赋值了,最后整个代码运行结果如下:

hello
tello

那这里也证明了,面试官说的是不对的,我们确实已经成功修改value数组内容。

final修饰了value数组,不能修改的是value对应的引用。
比如:,你就再也不能对value进行第二次赋值了,
value[]=new char[10];
value[]=new char[20];

另外,我也再次去翻了一下的源码,确实没有提供给外部能修改value数组内容的方法。

String

String

关于final关键字的作用,这里就不打算再赘述了,这是学Java的最最最基本的知识。记得在常规的八股文中都会有这么一道题:说说final、finally、finalize有什么区别,

面试中,难免会遇到一些不如意的面试官。如果依我10年前的脾气,果断当场发飙,怼回去。但,事后想想还是没有必要,哈哈哈,这个仁者见仁,还是觉得千万不要因小失大。

如果计划换工作,记得先把简历写好,这是第一步哈,不然面试机会会大打折扣。