zoukankan      html  css  js  c++  java
  • 为什么有的java底层public方法在JDK文档中查不到?

    前言

    今天查看了ArrayList方法底层的remove方法,看到重载方法总共有两种:分别是:
    两种remove方法
    但是仔细想了一下感觉不对劲,大家看一下这个例子:

    public class Main {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
            Iterator<String> iter = list.iterator();
            while(iter.hasNext()){
                String s = iter.next();
                if(s.equals("a")){
                    iter.remove();
                }
            }
            System.out.println(list.toString());
        }
    }
    

    很明显迭代器Iterator调用了remove方法,的确,Iterator接口中有remove方法的定义:
    在这里插入图片描述
    可是实现的确是ArrayList的remove方法,我查看了一下,确实有这个实现方法:那么为什么jdk查不到remove()空参数的这个方法呢???
    在这里插入图片描述

    wtf?明明是public的方法,怎么会查不到?
    很奇怪,难道是Oracle的程序员出了什么差错吗?

    我在谷歌查了半天也没查出个所以然,索性继续看源码:
    向前翻了一下这个remove方法:

    在这里插入图片描述
    原来这个方法是在一个内部类中啊。。而且这个内部类是私有类型的,我去。。原来是这样,其实上面那个例子程序执行了ArrayList的iterator方法,我们跟一下代码:
    在这里插入图片描述
    原来返回的是一个Itr类,这个类不就是ArrayList的那个私有类吗?这样就很好解释了。
    先得到了一个Itr类的对象,然后通过这个对象去调用私有类中的无参数方法remove。。soga!

    总结

    当大家遇到了底层源码有的方法而jdk不存在的方法,不要觉得他们错了,先看仔细源码的上下文,是不是从属于一个私有类当中,好好跟一下觉得有问题的代码的上文代码。

  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/taobean/p/12364276.html
Copyright © 2011-2022 走看看