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

关于 Java LinkedList 的一个 API: remove(int index) 和 remove(Object o)

  •  
  •   ericgui · 2020-10-24 09:04:45 +08:00 · 2531 次点击
    这是一个创建于 1252 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想问的是,如果这个 list 是这样的:LinkedList<Integer> list = new LinkedList<>();

    list.remove(0);

    这个 0,是 index 0 还是里面的某个元素 0 ? 假设 list 里面有个元素的值也恰好是 0 。

    反正我是晕了。

    17 条回复    2020-10-24 16:40:05 +08:00
    liufish
        1
    liufish  
       2020-10-24 09:15:27 +08:00
    得空我试一下先😄
    ciaoly
        2
    ciaoly  
       2020-10-24 09:23:03 +08:00 via Android
    不懂。你这样用的话,参数 0 是 int 还是 Integer ?感觉应该是根据你传入的参数 0 的类型决定用哪个方法吧
    ljpCN
        3
    ljpCN  
       2020-10-24 09:23:15 +08:00 via Android
    可是 0 不是 Object 叭
    leonme
        4
    leonme  
       2020-10-24 09:28:02 +08:00 via iPhone   ❤️ 4
    类型由窄到宽选择
    lance6716
        5
    lance6716  
       2020-10-24 09:28:13 +08:00 via Android
    好问题,感觉 Java 不好处理这个
    ericgui
        6
    ericgui  
    OP
       2020-10-24 09:31:12 +08:00
    @leonme 谢谢,似乎是这样的,如果仅仅 list.remove(0), 这里是 index

    但我强制转换为 Integer,就好了,list.remove((Integer)0); 就好了
    1194129822
        7
    1194129822  
       2020-10-24 09:31:56 +08:00   ❤️ 2
    ???这个问题不懂的话,建议先看 The Java Language Specification Java SE Edition.
    重载是编译期就确定是哪个方法,如果还有个变元重载,那还更分不清了???
    编译期确认方法三个阶段
    1.不允许装箱拆箱 也不允许变元重载
    2.允许装箱拆箱重载
    3.允许装箱拆箱 允许变元重载,变元重载优先级最低
    nicocho
        8
    nicocho  
       2020-10-24 09:36:29 +08:00   ❤️ 1
    如果是传参是 int,那默认是调用 remove(int var1)
    如果 Integer.valueOf()封装下 int 值,那就调用 remove(Object var1)了
    如楼上说的,根据你传参类型是基本还是引用来决定的
    ericgui
        9
    ericgui  
    OP
       2020-10-24 09:36:33 +08:00   ❤️ 2
    @1194129822 我是前端,用 Java 做 Leetcode,老兄你稍安勿躁,少打两个问号,也同样可以表达你的意思。
    谢谢哈,答案不错,已经感谢
    cwek
        10
    cwek  
       2020-10-24 09:36:46 +08:00   ❤️ 3
    真巧我问过知乎,R 大回答过
    https://www.zhihu.com/question/29371504
    方法前面选择按照类型靠近原则,不会先装解箱,所以优先是 remove(int index)。
    ericgui
        11
    ericgui  
    OP
       2020-10-24 09:38:08 +08:00
    @nicocho 已感谢,非常感谢好答案
    yeqizhang
        12
    yeqizhang  
       2020-10-24 09:40:24 +08:00 via Android
    remove object 这个很少用的吧,都没印象有这个方法
    ericgui
        13
    ericgui  
    OP
       2020-10-24 09:46:00 +08:00
    @yeqizhang 做 leetcode 会用到
    wudaye
        14
    wudaye  
       2020-10-24 12:24:44 +08:00 via Android
    Jvm 规范对重载优先级有定义
    aguesuka
        15
    aguesuka  
       2020-10-24 16:06:14 +08:00 via Android
    建议配合 fun(Object[])fun(int...)fun(int[])fun(Object)使用
    xuanbg
        16
    xuanbg  
       2020-10-24 16:19:56 +08:00
    0 首先是 int,然后是 Integer,最后才是 Object 。
    BBCCBB
        17
    BBCCBB  
       2020-10-24 16:40:05 +08:00
    你传 int 就是 index,你穿 Integer 就是 object??
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2908 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 14:15 · PVG 22:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.