你好,我是田哥
最近正式面试黄金时间期了,你是不是也开始面试或准备面试了?
如果计划跳槽换工作,强烈给你推荐这篇文章,干货满满:
(这两年大环境不好,当你真的出去面试后会发现不是什么黄金期,这个黄金期只是相对这一年来说)
昨天,一位朋友和面试官吵起来了,很多人可能都会认为面试官都很牛的,其实,非也。不是每个面试官都很牛的,有的面试官也是很水的,尤其是在中小厂,大厂大部分还是不会差的。
本人2017年在杭州滨江的一家小公司待过,技术团队十多号人,Java开发8个人,但是技术总监(其实就是个项目经理)多年没敲代码了,甩锅吹牛逼那是很拿手的,但是每个人来面试都必须过他的技术面试(我当时进去没有面试,因为我和这个技术总监是上家公司就认识的,有时候也是我去面试,但是他都会再面一次的)。
回到上面的话题中,为什么会有冲突呢?
下面是这位朋友的真实面试经历,下面是面试对话过程:
面试官:说说String为什么不可变?
面试者:String中使用char数组value来存储String内容的,并且没有给外部提供相应能修改value数组内容的方法。
面试官:就这样吗?
面试者:是的
面试官:你确定没有方法能修改value内容吗?
面试者:嗯?
面试官:我劝你回去好好看看String源码!
面试者:那您能不能给我普及一下为什么不可变?
面试官:今天反正也不忙,我给你说说吧。其实,这里主要有几个点,第一是String
是final
修饰的类,表示这个String
类是不可以被继承,第二是你说的char
数组value
也是final
修饰,也就意味着这个value
一旦被赋值了就不能改变了,重点在这里。
面试者:就这样吗?
面试官:嗯
面试者:你这好像不对吧,这个value
是数组,因为是final修饰,确实一旦赋值了就不可以改变了,但是,数组里的数据是可以改变的呀。
面试官:怎么可能!你都学看的是什么书啊(一脸不屑地看着,附带着冷笑)。
面试者:哎,你不能这么说话,你这讲错了,就你这水平还能当面试官?
面试官:???我现在就是面试官,要不你来当面试官吧。
接下来的画面,这里就不说了,两个人互怼了几句,这场面试就这样结束了。
整个面试过程中,面试官确实在关键点上说了一些,但是最后的那个不可变回答不对。
为什么不对?下面我们来验证一下final修饰的char数组内容能不能改变。
public class StringDmo {
private final char value[];
public StringDmo(char[] value) {
this.value = value;
}
public static void main(String[] args) {
String aa="hello";
StringDmo stringDmo=new StringDmo(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[]=new char[10];
,你就再也不能对value进行第二次赋值了,
value[]=new char[20];
另外,我也再次去翻了一下String
的源码,String
确实没有提供给外部能修改value数组内容的方法。
关于final关键字的作用,这里就不打算再赘述了,这是学Java的最最最基本的知识。记得在常规的八股文中都会有这么一道题:说说final、finally、finalize有什么区别,
面试中,难免会遇到一些不如意的面试官。如果依我10年前的脾气,果断当场发飙,怼回去。但,事后想想还是没有必要,哈哈哈,这个仁者见仁,还是觉得千万不要因小失大。
如果计划换工作,记得先把简历写好,这是第一步哈,不然面试机会会大打折扣。
上一期,我跟大家分享了:简历中自我评价,是否应该删掉?
另外给你推荐一个在线刷面试题的网站:https://www.woaijava.cc/
联系客服