源代码参阅之java.util.array

前言

给读者的话:看源代码,似乎是一个优秀的编程者的必由之路,今天,我们就去探访java.util.array的代码结构。

和大家做一个交流分享,希望大家一起讨论,获得更好、更多的思想和技巧!题外话:【我爱笨媳妇】


结构分析

        我们从以下几个点来分析它这个类,so,让我们开始吧!


  1. 导入的类

        我们可以看到,它只导入了java.lang.reflect.*;难不成它和反射还有什么不解之缘,客官莫急,我们后面再看。
  2. 构造方法

        好吧,我们可以看到亲爱的只有一个私有的构造方法。如下:


// Suppresses default constructor, ensuring non-instantiability.
    private Arrays() {}

看了上面的代码,我们发现,注释里为我们写的很明白,确保无法实例化,大家一看单例模式的光环已经套在了这句代码的头上。so,如果你能把23种设计模式在jdk里面的出处都找的到,告诉我,我给你发红包偶!哈哈

  • 主要的方法:

        真是冤家路窄,又让我遇到了你这个骚情的排序,面试的时候可没被你少虐啊,嘿嘿


    当然,还给出了交换两个数的值,看来这样的场景jdk的开发工程师也遇到了不少呢。
    二分查找,这个binarySearch我咋感觉颇有点中式英文的范呢。

    不可思议,equals方法都重载好几遍,看来确实是有实际需要啊。

    还有个fill方法,是用来帮我们初始化数据的,就一个for循环,糊弄谁呢,我也会写好不?

  •     /**
         * Assigns the specified long value to each element of the specified array
         * of longs.
         *
         * @param a the array to be filled
         * @param val the value to be stored in all elements of the array
         */
        public static void fill(long[] a, long val) {
            for (int i = 0, len = a.length; i < len; i++)
                a[i] = val;
        }
    

    copyof方法,将一个数组复印一下,得到一个新的,我似乎想到了什么,等下,让我冷静下,奥,ArrayList里面必然用到这个·方法,因为、因为它是会动态扩容的数组啊。真是敬佩机智的自己。

    果然,我看到了亲爱的ArrayList


        /**
         * @serial include
         */
        private static class ArrayList<E> extends AbstractList<E>
            implements RandomAccess, java.io.Serializable
        {
            private static final long serialVersionUID = -2764017481108945198L;
            private final E[] a;
    
            ArrayList(E[] array) {
                if (array==null)
                    throw new NullPointerException();
                a = array;
            }
    
            public int size() {
                return a.length;
            }
    
            public Object[] toArray() {
                return a.clone();
            }
    
            public <T> T[] toArray(T[] a) {
                int size = size();
                if (a.length < size)
                    return Arrays.copyOf(this.a, size,
                                         (Class<? extends T[]>) a.getClass());
                System.arraycopy(this.a, 0, a, 0, size);
                if (a.length > size)
                    a[size] = null;
                return a;
            }
    
            public E get(int index) {
                return a[index];
            }
    
            public E set(int index, E element) {
                E oldValue = a[index];
                a[index] = element;
                return oldValue;
            }
    
            public int indexOf(Object o) {
                if (o==null) {
                    for (int i=0; i<a.length; i++)
                        if (a[i]==null)
                            return i;
                } else {
                    for (int i=0; i<a.length; i++)
                        if (o.equals(a[i]))
                            return i;
                }
                return -1;
            }
    

    hashcode方法都重载,丧心病狂有莫有,以后想看hash码怎么算知道地方在哪里了吧?


    toString也难以逃脱魔爪!哈哈


    功能分析

            其实大家看完了结构分析,对它的功能我想也应该已经有了一个大致的把握了,对吧,其实结构就反映了功能啦。一个具体的结构就对应着一个具体的功能点。
            我们在看一下,当我们刚开始学习编程的时候,学到了数组,那个时候先要对数组排个序,再查找下,开始的时候有时候还做个填充,最后在搞个什么包含不包含。。。
    我们发现,这个类简直就是在为我们量身定做的有莫有,那是因为jdk的编写者和我们一样都是人,他当然遇到的问题和我们类似了,这也就是说,我们啊,好好努力,说不定哪天就去写JDK了,哈哈
            玩笑不开了,今天的这篇分享也就到这里了,下面总结下我们学到的知识点呗!


    总结

            我们今天学到的东西呢,我觉得主要有以下几个点,下面我一一列出来,

    1. 单例模式有莫有,当然,还有好多的设计模式,我相信这些设计模式在JDk里面大多数应该都有着体现,面试的时候,你直接告诉面试官这种设计模式在那个类里面是怎样体现出来的,是不是显得。。。自己领悟嘿嘿
    2. 数组的常用操作都包含了有莫有,排序,查找,填充,复制。这些方法怎么来的,当然是来源于我们实际的需求啦。所以,只要你能准确把握需求,你也能写出好的代码,当然了,万一让你写jdk去了,别忘了我啦嘿嘿
    3. 注释很详尽有莫有,实现一个接口用的是全称有莫有,这些都是细节啊,每把握一个细节,你就离成功近了一步。
    4. 还有更多的欢迎大家补充,希望大家多多讨论,得到更多的思想精华!

            最后的最后,我们还是,偶,唱错了,是最后的最后,祝大家新年快乐!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值