V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
polyang
V2EX  ›  程序员

现在的程序员,这么简单的问题都能答错吗?

  •  
  •   polyang · 85 天前 · 9235 次点击
    这是一个创建于 85 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天作为面试官面了个应聘初级 Java 的程序员,该程序员工作 3 年,因为是初级,先问了几个简单的问题:

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

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

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

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

    但其他的理论性东西又答的还可以,估计是背的面试题。
    99 条回复    2021-05-08 12:02:50 +08:00
    facelezz
        1
    facelezz   85 天前
    这么水么 3 年经验都在干啥= =
    Amber2011
        2
    Amber2011   85 天前 via Android
    我觉得如果 3 年正常工作的话,应该不会去面初级的吧
    zhoudaiyu
        3
    zhoudaiyu   85 天前 via iPhone   ❤️ 2
    没写过 Java 的 123 也能答上来吧
    yeqizhang
        4
    yeqizhang   85 天前 via Android
    第二个问题有点东西..其实有两种答案,不去搜索我也记不清。
    其它都是常应用到的...
    geekboy
        5
    geekboy   85 天前
    这些都是基础题吧,想不通这些都答错其他的答得可以的情况
    ccde8259
        6
    ccde8259   85 天前 via iPhone   ❤️ 31
    面试官用”对象内容”表述似乎不够准确,表述换成”对象的域或者对象属性不能变”会更合适更清晰。第二个单纯就是没背 Integer 缓存范围+没踩过基本类型的坑……
    许多无关痛痒的小细节往往自己很难去主动意识到,尤其是长期不去使用的领域。人的精力总是有限的,可能他的经历在你的面试域的投影有着无数的偏差。但是能不能在里面找到闪光点,能不能帮助候选人修正自己长期以来的谬误,也许是也是面试中重要的一环吧。
    bear2000
        7
    bear2000   85 天前
    应届生面试题都比这个难...
    raaaaaar
        8
    raaaaaar   85 天前 via Android   ❤️ 4
    。我是废物。。
    leafre
        9
    leafre   85 天前
    2 有错吗?
    FreeEx
        10
    FreeEx   85 天前 via iPhone   ❤️ 1
    @leafre Java 包装类型有用到常量池功能,可以参考我写的这篇文章《 Java 的奇技淫巧》 https://typesafe.cn/posts/java-unexpected-features/
    x340
        11
    x340   85 天前 via iPhone
    @leafre true…Integer 源码里有事前实例化数组
    statement
        12
    statement   85 天前 via iPhone   ❤️ 3
    散播焦虑。同三年同不会。 结论知道。 你要问原因。 三层 部分能回答出一层 知识多数不都是记得。 记得和背的。 应该没有什么区别
    zidian
        13
    zidian   85 天前
    2 虽然知道,但是好像从没写过 Integer == Integer
    raysonx
        14
    raysonx   85 天前 via iPhone
    其实要抬杠的话,两个 Integer 之间用==确实是比较的地址,只不过你不能说一定是 false 。常量池中的对象也是对象。。。
    dingwen07
        15
    dingwen07   85 天前 via iPhone
    @zhoudaiyu #3 2 至少得知道包装类
    dingwen07
        16
    dingwen07   85 天前 via iPhone   ❤️ 7
    等一下,2 不一定:

    Integer x = new Integer(100);
    Integer y = new Integer(100);
    System.out.println(x == y);

    这个会打印 false
    emeab
        17
    emeab   85 天前
    国内的 Java 卷成这样 很大程度是因为伪造工作经验的人.
    limuyan44
        18
    limuyan44   85 天前
    以我不到半年的 java 工作经验来看,虽然想考的是 IntegerCache,但是!参考答案都错了。
    polyang
        19
    polyang   84 天前
    @limuyan44 上面的不是参考答案,是应聘者给我的答案
    pydiff
        20
    pydiff   84 天前
    基本上 100%是培训班出来的,不过就算是培训班出来的也会线程创建,线程池才对,看来是在培训班时也没怎么认真学的
    crazyhorse
        21
    crazyhorse   84 天前
    %a%的 like 不会走索引
    kakach
        22
    kakach   84 天前
    线程和线程池除了学习写 demo,个人经验,生产实践中很少手动显式地去创建,可能是我接触的比较少。模糊记得看过的书上也建议不要手动去创建。
    opentrade
        23
    opentrade   84 天前 via Android
    我也见过工作五年 直接上手就修改 protobuf 字段 id 的家伙 囫囵吞枣型选手
    xloger
        24
    xloger   84 天前
    对于 Integer 的缓存池我有个问题啊,请问你们了解这个是在工作中什么场景遇到的呢?还是说是背面试题看到的?

    延展一下,除了 Integer,其他几个包装类型有没有缓冲池的概念呢?如果没有,为什么没有呢? Integer 设置缓冲池的目的是什么,它的取值范围那么大,为啥范围仅仅是 -128 到 127 呢,为什么不大一些呢?

    我不是在杠啊,我是真不明白,非工作场景遇到的底层细节,除非你说你涉猎广泛看书看知识点看到,不然不就是背面试题背的么,有啥意义呢?

    [其他几个问题我觉得问得没问题
    Dogtler
        25
    Dogtler   84 天前
    我也是菜
    Dogtler
        26
    Dogtler   84 天前
    另外,隐约闻出一丝傲慢。都是为了谋生,能背面试题 说明起码对这行 态度端正。还有上面那些题目 我特么全不会,不百度一下 真的太难了。
    BuffDog
        27
    BuffDog   84 天前
    三年了还问这些,你们真的会去记这些细节么
    重要的不是解决问题的能力么
    tinyuu
        28
    tinyuu   84 天前
    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);
    leeyuzhe
        29
    leeyuzhe   84 天前
    Integer 的缓存池我之前完全不知,问我我也懵
    shengminjie
        30
    shengminjie   84 天前
    @ccde8259 你的视野有点厉害
    funbox
        31
    funbox   84 天前   ❤️ 1
    只是题库背错了
    NerverLibis
        32
    NerverLibis   84 天前
    工作 9 年 6 年经验 PHP 期望 20-25K 面试照片戴口罩的俯视图
    框架 TP3.1 Laravel4 Linux Mysql 全不会
    6 年换了 4 公司,只做过微商……感觉下
    polyang
        33
    polyang   84 天前
    @BuffDog 除了第二个,其他不算细节吧,如果这些都不知道,你还能指望他解决什么问题?
    yitingbai
        35
    yitingbai   84 天前
    补充一下, final 修饰的变量也不是不能改, 通过反射照样改
    xsen
        36
    xsen   84 天前
    @polyang #33 1/2/3/4 都不会的路过;对于百度下就能出来的问题,不知道问了有何意义
    但我确实能解决很多很多各种各样的问题

    对于有工作经验、有项目经验的人来说,为嘛不问下项目、踩坑之后才知道的问题,为何不多问下工程化相关的问题;当然,或可以间接说明人是否善于学习、沟通与解决问题的问题
    qwer666df
        37
    qwer666df   84 天前
    插一个, 请教下那为啥
    int q = 10000;
    int e = 10000;
    System.out.println(q == e);
    这就又是 true 了嘞
    xloger
        38
    xloger   84 天前
    @dingwen07 #34 谢谢您提供的文档,而正如文档里所说:
    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,需要额外注意。不然这就是背面试题的事?
    dqzcwxb
        39
    dqzcwxb   84 天前
    面试问线程或者线程池的十有八九不知道 newWorkStealingPool()更不知道什么是 fork/join ForkJoinPool.commonPool
    lagoon
        40
    lagoon   84 天前
    妈呀,其实我最害怕问语言细节。
    不过 Java 后端这种问题确实不应该答错。

    我常用的,要写代码的语言至少有 4 种。考虑到某些跨平台前端,估计要掌握的语言只多不少。
    wssy921
        41
    wssy921   84 天前
    我 6 年经验,感觉也不太会面试了。 奇奇怪怪的知识点太多了,很多东西,真的用过了, 面试的时候突然提起也忘记了
    fffang
        42
    fffang   84 天前
    关于第二个问题,他有可能之前写过 JavaScript 。doge
    Mirage09
        43
    Mirage09   84 天前
    问这些无聊的问题还不如弄个 LeetCode medium 讨论讨论...
    lauix
        44
    lauix   84 天前
    只会第三个,like 要看 % 在哪里,才会走索引。
    no1xsyzy
        45
    no1xsyzy   84 天前   ❤️ 1
    不写 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
    simonlu9
        46
    simonlu9   84 天前
    @xloger 因为常用的业务逻辑都会用到 for 循环大量用到都是不超 100 的数字,经常使用,没必要每次都初始化,跟字符串一样
    zihuyishi
        47
    zihuyishi   84 天前   ❤️ 4
    有句说句,为啥我觉得做 java 的要面试这种问题很蠢,有点茴香豆有几种写法的感觉
    simonlu9
        48
    simonlu9   84 天前
    同样感觉,之前面试的 java 实在太水了,基本我都是用一些实战经验来过滤,最简单的一个,http 和 tcp 有什么区别,很多都会答 http 不需要三次握手,tcp 需要三次握手,直接 pass
    unco020511
        49
    unco020511   84 天前
    说真的,java 这种上古语言,真是食之无味弃之可惜(对于我来说)
    unco020511
        50
    unco020511   84 天前
    @simonlu9 这个问题就比什么 integer 好很多,http 是很重要的知识
    lakehylia
        51
    lakehylia   84 天前
    @simonlu9 http 是 tcp 的再上一层协议吧,tcp 底下有 ip 协议。大学里涉计算机专业的基本课程,要考的。。。
    dany813
        52
    dany813   84 天前
    3 年 培训的吧
    lakehylia
        53
    lakehylia   84 天前
    第二个问题,其实是未定义的,不要问这种问题。未定义的行为,鬼知道会有什么结果,java 文档里面没有定义。
    polyang
        54
    polyang   84 天前
    @simonlu9 哇,这个问题好,我记下了,下次面的时候问问。感谢
    kidlj
        55
    kidlj   84 天前
    现在的 HR,连这样的面试者都筛选不出来吗?
    bluekz
        56
    bluekz   84 天前
    我也分享几个我面的:
    1.字符串倒转的方法写不出来,部分百度抄了之后自己无法清楚描述每一句逻辑。for 循环说都不会的也有。
    2.string a = "123"; a=a+"45";输出什么?有 123 的,有 45 的,知道 12345 的问一下“那为什么说 string 不可变” 就蒙了。
    3.说两个或以上字段不能共同作为一个联合索引,我都没办法往下问最左原则的问题。即使能问,也没有能答对的。
    我们的要求是 2 年左右经验。
    即使我知道有些是毕业了培训班走一遭出来的,问题这大学+培训也没听过讲啊
    hoyixi
        57
    hoyixi   84 天前
    以前都是有笔试环节的,你问的这些基础题,就是放在笔试用来初筛的。
    当然,我说的笔试,是不能手机上网查答案的那种,不然也没意义。
    polyang
        58
    polyang   84 天前
    @kidlj 不知道啊,反正是领导让我面的,按道理 hr 应该先进行面试的。
    polyang
        59
    polyang   84 天前
    @bluekz 第 3 个我也会问,但一般会先问索引有哪几种类型,如果连索引有哪几种都不知道,就用不着问这个了。
    Helsing
        60
    Helsing   84 天前 via iPhone
    第二个问题其实真的很偏,基本都是背面经才会知道
    redtea
        61
    redtea   84 天前
    第二题这个问题问的很好,就怕团队里出现写出==的人。我就见到过判断 String 用==的代码。
    afewok
        62
    afewok   84 天前
    第二个都快 20 年的老知识了,127 的边界问题,类似坑爹的题还是 "aaa"==new String("aaa")
    第四个我觉得有意思,我记忆中,java 的线程创建只有一种方式(创建个 Runnable 的实现类并实例化,当然也可以直接实例化现成的 Thread 类),其他的方案都是在此基础上的线程包装或管理
    Amber2011
        63
    Amber2011   84 天前 via Android
    @xloger 这个我是做一个自增操作的时候用==,还是啥来着,理论上是 true 结果是 false 一直想不通,在评论区提问后有人解答了这个缓存。还有就是 java(阿里巴巴)开发手册里也提到过一手
    yazinnnn
        64
    yazinnnn   84 天前
    招个会 kotlin 的 java 开发可以避免一些低级&蛋疼的问题.
    4kingRAS
        65
    4kingRAS   84 天前
    @no1xsyzy java 对象比较推荐用 equals,直接在 equals 里实现, == 本来就是用于判断引用(指针)相不相同的。
    Integer 缓存取决于 JVM 实现,openjdk 和 oracle 的是-128~128
    dbpe
        66
    dbpe   84 天前
    等 Primitive Objects 出来,我想就不用在问第二个问题了
    dbpe
        67
    dbpe   84 天前
    @Helsing 算偏,但也不偏..很基本的把...一些业务当中..很容易碰到的
    lumnag
        68
    lumnag   84 天前
    说实话没看面试题的我一个也答不上来
    Michaelssss
        69
    Michaelssss   84 天前
    我出了个机试题目,请使用任意自己熟悉的框架实现登陆鉴权功能,然后刷走了五六个人。。。。。。。。
    lbp0200
        70
    lbp0200   84 天前
    工作十一年了,这四个问题,一个都不会
    cloudzhou
        71
    cloudzhou   84 天前
    问题 2 有些偏门,其他问题正常
    WhoMercy
        72
    WhoMercy   84 天前
    你可以把你的“参考答案”贴出来,让大家品评品评
    YORYOR
        73
    YORYOR   84 天前
    考第二个的意义是什么 能指导你筛选候选人么
    BoringTu
        74
    BoringTu   84 天前
    @hoyixi 为啥程序员面试还要有笔试。。?如果都是选择题就算了,用笔写代码??
    hemingyang
        75
    hemingyang   84 天前
    @qwer666df int 基本类型 Integer 包装类型 int 比的是值 Integer 比较会指向内存对象 new Integer 是不同的两个对象
    lachesis
        76
    lachesis   84 天前
    每次看到这种面试题都觉得特别傻
    vagranth
        77
    vagranth   84 天前
    说实话,这些问题我都回答不上来。
    通常来说,遇到这类问题的时候,我会 google 一下
    dark3212
        78
    dark3212   84 天前   ❤️ 2
    @xloger
    其他问题不好说,Integer 缓存问题我实际场景踩过坑。
    时间:大概是 15 年
    背景:创业公司,巨小的公司,一个后端(我),一个 ios,一个安卓,一个测试
    功能:实现一个讨论组,有一个主持人,主持人能全程讲话,其他人需要主持人点名才能讲话
    主持人功能实现代码:

    if(该用户的 ID==主持人的 ID){
    //主持人逻辑
    }

    自测 ok,测试测了简单测了几十次 ok(测试库是新的,用户从 1 自增),上线后不 ok,主持人进来系统不认,无法主持。
    从那以后我就深刻的记住了 IntegerCache 。
    no1xsyzy
        79
    no1xsyzy   84 天前
    @4kingRAS 虽然不写,但其实我还是知道这些的。
    考察一些底层实现层面的优化,实际上是没有必要的。如果想要考量如何解决底层优化所造成的问题,直接把有问题的代码带着环境丢过去,让对方解决不好吗?就算解决不了,只要能看到一些理解。
    douyacai911
        80
    douyacai911   84 天前
    @vagranth 工作八年了我也答不上来,因为我在日本做外派。。
    IvanLi127
        81
    IvanLi127   84 天前
    这题不难,我不写 java 的人,靠大学学的 java 都能答得上来,三年 java 这 5 题错 2 题就已经不靠谱了。虽然楼主这题好像不是很严谨,不过如果有看过面试题的话也应该能反应得出来才对。
    zxCoder
        82
    zxCoder   84 天前
    第二个问题没啥意义

    (反正我会,我看过
    HolmLoh
        83
    HolmLoh   84 天前
    2 、4 如果不是写了 3 年 java 的,答不出来其实情有可原,而且 2 他是答对了
    1 答不出来实在不应该,但也有会错题意的可能
    buzailianxi
        84
    buzailianxi   84 天前   ❤️ 1
    凑合干吧,熟练工,年轻就行,真都会你给多少钱呢
    lachesis
        85
    lachesis   84 天前
    这不是难不难的问题,而是提问方式有明显的挖坑倾向,面试经验少的人碰到不自信的内容就容易被带偏。例如第 2 题,还不如直接展开聊聊 equals 和==的区别,问清楚比较值时应该用哪个
    johnsona
        86
    johnsona   84 天前 via iPhone
    俺知道 like 可以前缀索引
    其他不知道了
    面试官我可以去你们公司给你端茶倒水吗
    其他三个不知道 java 都不会写
    young1lin
        87
    young1lin   84 天前
    不用看了,这是培训机构出来的。三年,只要不偷懒,这些都不算问题。问的都是 Spring 源码的问题,MQ 和 Redis 的实际使用场景问题。只要你能说一个小时任意一 MQ,不重复,都可以的。
    enoc
        88
    enoc   84 天前
    我一个大二在校生都知道答案。。。
    Felldeadbird
        89
    Felldeadbird   84 天前
    如果用过 mysql,然后回答 like 不走索引。应该是背题的人了。
    JianH
        90
    JianH   84 天前
    第二题回答思路没问题吧,没看过 Integer 源码确实不知道啊,这属于偏题了吧
    jiangzhizhou
        91
    jiangzhizhou   84 天前
    面试官问我这种题的时候我一般都直接回复,不好意思贵司不适合我。
    SpiderXiantang
        92
    SpiderXiantang   84 天前
    格局小了
    shyangs
        93
    shyangs   84 天前   ❤️ 2
    学到了 IntegerCache 想在代码埋雷坑公司就这样写, 离职后业务扩充超过 127 就爆炸了 ::doge::
    fuermosi777
        94
    fuermosi777   84 天前
    工作六年,一个都答不上来
    xupefei
        95
    xupefei   83 天前 via iPhone
    有一道用 hashmap 解的 leetcode 题就涉及到了第二个问题里的坑
    cassyfar
        96
    cassyfar   83 天前
    一般问我这些钻牛角尖没啥水平的问题,我扭头就走了。
    snw
        97
    snw   83 天前 via Android
    @zhoudaiyu
    写 C#的就不会知道第 2 题这种坑。

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

    @fffang
    然而 js 没有整型( ES2019 以前) :doge:
    iceteacover
        98
    iceteacover   83 天前
    @dingwen07

    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 领域看不是什么好事情,很奇怪为什么出题要这么出。。。
    yjxjn
        99
    yjxjn   83 天前
    @Amber2011 三年应该是高级了。SSE 这种水平了。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1375 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:20 · PVG 01:20 · LAX 10:20 · JFK 13:20
    ♥ Do have faith in what you're doing.