技术解析

现在的程序员,这么简单的问题都能答错吗?
0
2021-06-02 19:47:26
idczone
今天作为面试官面了个应聘初级 Java 的程序员,该程序员工作 3 年,因为是初级,先问了几个简单的问题:

1 、final 修饰的变量到底是指引用不能变还是引用的对象内容不能变?
答曰:引用的对象内容不能变

2 、有两个 Integer 类型的变量,他们的值都是 10抗投诉服务器0,如果用==比较,结果是什么?
答曰:false,他说==比较的是内存地址

3 、关于 MySQL 的索引问题,like 会不会走索引?
答曰:不会,而且还特别补充了一句,只要用到了 like 都不会走索引。

4 、创建线程有哪几种方式?
答曰:只知道线程池的方式,其他方式不清楚(然后我顺着这个问了他线程池,结果他说工作中没有用到过线程池,对线程池不是特别了解)。

但其他的理论性东西又答的还可以,估计是背的面试题。
这么水么 3 年经验都在干啥= =

我觉得如果 3 年正常工作的话,应该不会去面初级的吧

没写过 Java 的 123 也能答上来吧

第二个问题有点东西..其实有两种答案,不去搜索我也记不清。
其它都是常应用到的...

这些都是基础题吧,想不通这些都答错其他的答得可以的情况

面试官用”对象内容”表述似乎不够准确,表述换成”对象的域或者对象属性不能变”会更合适更清晰。第二个单纯就是没背 Integer 缓存范围+没踩过基本类型的坑……
许多无关痛痒的小细节往往自己很难去主动意识到,尤其是长期不去使用的领域。人的精力总是有限的,可能他的经历在你的面试域的投影有着无数的偏差。但是能不能在里面找到闪光点,能不能帮助候选人修正自己长期以来的谬误,也许是也是面试中重要的一环吧。

应届生面试题都比这个难...

。我是废物。。

2 有错吗?

Java 包装类型有用到常量池功能,可以参考我写的这篇文章《 Java 的奇技淫巧》 https://typesafe.cn/posts/java-unexpected-features/

true…Integer 源码里有事前实例化数组

散播焦虑。同三年同不会。 结论知道。 你要问原因。 三层 部分能回答出一层 知识多数不都是记得。 记得和背的。 应该没有什么区别

2 虽然知道,但是好像从没写过 Integer == Integer

其实要抬杠的话,两个 Integer 之间用==确实是比较的地址,只不过你不能说一定是 false 。常量池中的对象也是对象。。。

2 至少得知道包装类

等一下,2 不一定:
Integer x = new Integer(100);
Integer y = new Integer(100);
System.out.println(x == y);
这个会打印 false

国内的 Java 卷成这样 很大程度是因为伪造工作经验的人.

以我不到半年的 java 工作经验来看,虽然想考的是 IntegerCache,但是!参考答案都错了。

上面的不是参考答案,是应聘者给我的答案

基本上 100%是培训班出来的,不过就算是培训班出来的也会线程创建,线程池才对,看来是在培训班时也没怎么认真学的

%a%的 like 不会走索引

线程和线程池除了学习写 demo,个人经验,生产实践中很少手动显式地去创建,可能是我接触的比较少。模糊记得看过的书上也建议不要手动去创建。

我也见过工作五年 直接上手就修改 protobuf 字段 id 的家伙 囫囵吞枣型选手

对于 Integer 的缓存池我有个问题啊,请问你们了解这个是在工作中什么场景遇到的呢?还是说是背面试题看到的?
延展一下,除了 Integer,其他几个包装类型有没有缓冲池的概念呢?如果没有,为什么没有呢? Integer 设置缓冲池的目的是什么,它的取值范围那么大,为啥范围仅仅是 -128 到 127 呢,为什么不大一些呢?
我不是在杠啊,我是真不明白,非工作场景遇到的底层细节,除非你说你涉猎广泛看书看知识点看到,不然不就是背面试题背的么,有啥意义呢?
[其他几个问题我觉得问得没问题

我也是菜

另外,隐约闻出一丝傲慢。都是为了谋生,能背面试题 说明起码对这行 态度端正。还有上面那些题目 我特么全不会,不百度一下 真的太难了。

三年了还问这些,你们真的会去记这些细节么
重要的不是解决问题的能力么

Integer a= 100;
Integer b= new Integer(100);
System.out.println(a == b);
Integer a= new Integer(100);
Integer b= new Integer(100);
System.out.println(a == b);
Integer a= 100;
Integer b= 100;
System.out.println(a == b);

Integer 的缓存池我之前完全不知,问我我也懵

你的视野有点厉害

只是题库背错了

工作 9 年 6 年经验 PHP 期望 20-25K 面试照片戴口罩的俯视图
框架 TP3.1 Laravel4 Linux Mysql 全不会
6 年换了 4 公司,只做过微商……感觉下

除了第二个,其他不算细节吧,如果这些都不知道,你还能指望他解决什么问题?

https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.7

补充一下, final 修饰的变量也不是不能改, 通过反射照样改

1/2/3/4 都不会的路过;对于百度下就能出来的问题,不知道问了有何意义
但我确实能解决很多很多各种各样的问题
对于有工作经验、有项目经验的人来说,为嘛不问下项目、踩坑之后才知道的问题,为何不多问下工程化相关的问题;当然,或可以间接说明人是否善于学习、沟通与解决问题的问题

插一个, 请教下那为啥
int q = 10000;
int e = 10000;
System.out.println(q == e);
这就又是 true 了嘞

谢谢您提供的文档,而正如文档里所说:
This ensures that in most common cases, the behavior will be the desired one, without imposing an undue performance penalty, especially on small devices. Less memory-limited implementations might, for example, cache all char and short values, as well as int and long values in the range of -32K to +32K.
按我的理解,这只是 JVM 做的一个底层性能优化,而且它本身也不保证一切情况下不变,比如在内存充裕的设备,缓存池范围可能就是 -32k to 32k 了。
那么,纠结 Integer 的 100 == 100 返回啥,200 == 200 返回啥的现实意义是啥?除非说因为这个会很容易造成某方面的 bug,需要额外注意。不然这就是背面试题的事?

面试问线程或者线程池的十有八九不知道 newWorkStealingPool()更不知道什么是 fork/join ForkJoinPool.commonPool

妈呀,其实我最害怕问语言细节。
不过 Java 后端这种问题确实不应该答错。
我常用的,要写代码的语言至少有 4 种。考虑到某些跨平台前端,估计要掌握的语言只多不少。

我 6 年经验,感觉也不太会面试了。 奇奇怪怪的知识点太多了,很多东西,真的用过了, 面试的时候突然提起也忘记了

关于第二个问题,他有可能之前写过 JavaScript 。doge

问这些无聊的问题还不如弄个 LeetCode medium 讨论讨论...

只会第三个,like 要看 % 在哪里,才会走索引。

不写 Java 的问一下,这个 Integer 缓存池,是列入标准了吗?
还是说是 de facto 标准?那么存在多少依赖此行为的代码?
讽刺的是,大多数 Lisp 实现中 eq? 这一定义上就是严格同一性比较,反而能对同类型的数进行数学相等的比较
因为函数式不需要有『方法』,所以基本类型不构成对象
而 CPython 下,则是基于一个更诡异的编译器优化:一方面有一个有限的常量池([-5...256]),另一方面,如果在同一次编译中编译期求值后存在同一个值,则优化成同一个对象。
所以,在 REPL 中可以发现如下现象(注意一个 >>> 发生一次编译):
>>> a=12345; b=10**4+2344+1; a is b
True
>>> a=12345
>>> b=12345
>>> a is b
False

因为常用的业务逻辑都会用到 for 循环大量用到都是不超 100 的数字,经常使用,没必要每次都初始化,跟字符串一样

有句说句,为啥我觉得做 java 的要面试这种问题很蠢,有点茴香豆有几种写法的感觉

同样感觉,之前面试的 java 实在太水了,基本我都是用一些实战经验来过滤,最简单的一个,http 和 tcp 有什么区别,很多都会答 http 不需要三次握手,tcp 需要三次握手,直接 pass

说真的,java 这种上古语言,真是食之无味弃之可惜(对于我来说)

这个问题就比什么 integer 好很多,http 是很重要的知识

http 是 tcp 的再上一层协议吧,tcp 底下有 ip 协议。大学里涉计算机专业的基本课程,要考的。。。

3 年 培训的吧

第二个问题,其实是未定义的,不要问这种问题。未定义的行为,鬼知道会有什么结果,java 文档里面没有定义。

哇,这个问题好,我记下了,下次面的时候问问。感谢

现在的 HR,连这样的面试者都筛选不出来吗?

我也分享几个我面的:
1.字符串倒转的方法写不出来,部分百度抄了之后自己无法清楚描述每一句逻辑。for 循环说都不会的也有。
2.string a = "123"; a=a+"45";输出什么?有 123 的,有 45 的,知道 12345 的问一下“那为什么说 string 不可变” 就蒙了。
3.说两个或以上字段不能共同作为一个联合索引,我都没办法往下问最左原则的问题。即使能问,也没有能答对的。
我们的要求是 2 年左右经验。
即使我知道有些是毕业了培训班走一遭出来的,问题这大学+培训也没听过讲啊

以前都是有笔试环节的,你问的这些基础题,就是放在笔试用来初筛的。
当然,我说的笔试,是不能手机上网查答案的那种,不然也没意义。

不知道啊,反正是领导让我面的,按道理 hr 应该先进行面试的。

第 3 个我也会问,但一般会先问索引有哪几种类型,如果连索引有哪几种都不知道,就用不着问这个了。

第二个问题其实真的很偏,基本都是背面经才会知道

第二题这个问题问的很好,就怕团队里出现写出==的人。我就见到过判断 String 用==的代码。

第二个都快 20 年的老知识了,127 的边界问题,类似坑爹的题还是 "aaa"==new String("aaa")
第四个我觉得有意思,我记忆中,java 的线程创建只有一种方式(创建个 Runnable 的实现类并实例化,当然也可以直接实例化现成的 Thread 类),其他的方案都是在此基础上的线程包装或管理

这个我是做一个自增操作的时候用==,还是啥来着,理论上是 true 结果是 false 一直想不通,在评论区提问后有人解答了这个缓存。还有就是 java(阿里巴巴)开发手册里也提到过一手

招个会 kotlin 的 java 开发可以避免一些低级&蛋疼的问题.

java 对象比较推荐用 equals,直接在 equals 里实现, == 本来就是用于判断引用(指针)相不相同的。
Integer 缓存取决于 JVM 实现,openjdk 和 oracle 的是-128~128

等 Primitive Objects 出来,我想就不用在问第二个问题了

算偏,但也不偏..很基本的把...一些业务当中..很容易碰到的

说实话没看面试题的我一个也答不上来

我出了个机试题目,请使用任意自己熟悉的框架实现登陆鉴权功能,然后刷走了五六个人。。。。。。。。

工作十一年了,这四个问题,一个都不会

问题 2 有些偏门,其他问题正常

你可以把你的“参考答案”贴出来,让大家品评品评

考第二个的意义是什么 能指导你筛选候选人么

为啥程序员面试还要有笔试。。?如果都是选择题就算了,用笔写代码??

int 基本类型 Integer 包装类型 int 比的是值 Integer 比较会指向内存对象 new Integer 是不同的两个对象

每次看到这种面试题都觉得特别傻

说实话,这些问题我都回答不上来。
通常来说,遇到这类问题的时候,我会 google 一下


其他问题不好说,Integer 缓存问题我实际场景踩过坑。
时间:大概是 15 年
背景:创业公司,巨小的公司,一个后端(我),一个 ios,一个安卓,一个测试
功能:实现一个讨论组,有一个主持人,主持人能全程讲话,其他人需要主持人点名才能讲话
主持人功能实现代码:
if(该用户的 ID==主持人的 ID){
//主持人逻辑
}
自测 ok,测试测了简单测了几十次 ok(测试库是新的,用户从 1 自增),上线后不 ok,主持人进来系统不认,无法主持。
从那以后我就深刻的记住了 IntegerCache 。

虽然不写,但其实我还是知道这些的。
考察一些底层实现层面的优化,实际上是没有必要的。如果想要考量如何解决底层优化所造成的问题,直接把有问题的代码带着环境丢过去,让对方解决不好吗?就算解决不了,只要能看到一些理解。

工作八年了我也答不上来,因为我在日本做外派。。

这题不难,我不写 java 的人,靠大学学的 java 都能答得上来,三年 java 这 5 题错 2 题就已经不靠谱了。虽然楼主这题好像不是很严谨,不过如果有看过面试题的话也应该能反应得出来才对。

第二个问题没啥意义
(反正我会,我看过

2 、4 如果不是写了 3 年 java 的,答不出来其实情有可原,而且 2 他是答对了
1 答不出来实在不应该,但也有会错题意的可能

凑合干吧,熟练工,年轻就行,真都会你给多少钱呢

这不是难不难的问题,而是提问方式有明显的挖坑倾向,面试经验少的人碰到不自信的内容就容易被带偏。例如第 2 题,还不如直接展开聊聊 equals 和==的区别,问清楚比较值时应该用哪个

俺知道 like 可以前缀索引
其他不知道了
面试官我可以去你们公司给你端茶倒水吗
其他三个不知道 java 都不会写

不用看了,这是培训机构出来的。三年,只要不偷懒,这些都不算问题。问的都是 Spring 源码的问题,MQ 和 Redis 的实际使用场景问题。只要你能说一个小时任意一 MQ,不重复,都可以的。

我一个大二在校生都知道答案。。。

如果用过 mysql,然后回答 like 不走索引。应该是背题的人了。

第二题回答思路没问题吧,没看过 Integer 源码确实不知道啊,这属于偏题了吧

面试官问我这种题的时候我一般都直接回复,不好意思贵司不适合我。

格局小了

学到了 IntegerCache 想在代码埋雷坑公司就这样写, 离职后业务扩充超过 127 就爆炸了 ::doge::

工作六年,一个都答不上来

有一道用 hashmap 解的 leetcode 题就涉及到了第二个问题里的坑

一般问我这些钻牛角尖没啥水平的问题,我扭头就走了。


写 C2 题这种坑。
我觉得用性能优化导致语义不一致,并不是良好的语言设计。[-128,127]这种 magic number 当年或许是奇技淫巧,现在就变成了包袱。

然而 js 没有整型( ES2019 以前) :doge:


public static void main(String[] args) {
Integer x = new Integer(100);
Integer y = new Integer(100);
System.out.println(x == y);
x = 100;
y = 100;
System.out.println(x == y);
}
第一个 false,第二个 true 。 大概 Java 优化的时候只能通过很简单的情况做处理,深入下去可能需要 编译优化的知识。
反正 对象 用 == 比较在 Java 领域看不是什么好事情,很奇怪为什么出题要这么出。。。

三年应该是高级了。SSE 这种水平了。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服