zoukankan      html  css  js  c++  java
  • Java.util 源码阅读

    util

    AbstractCollection.java

    //查询操作
    public abstract Iterator<E> iterator();
    public abstract int size();
    public boolean isEmpty();
    public boolean contains(Object o);
    //toArray
    public Object[] toArray();
    public <T> T[] toArray(T[] a);
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    private static <T> T[] finishToArray(T[] r,Iterator<?> it);
    //Modification Operations
    public boolean add(E e);
    public boolean remove(Object o);
    //Bulk Operation
    public boolean containsAll(Collection<?> c);
    public boolean addAll(Collection<? extends E> c);
    public boolean removeAll(Collection<?> c);
    public boolean retainAll(Collection<?> c);
    public void clear();
    //String conversion
    public String toString();
    

    以下为需要注意和没弄清楚的几点:

    /*
     o == null 居然也可以返回true,在remove方法中采用了类似的处理方式
    */
    public boolean contains(Object o){
        Iterator<E> it = iterator();
    
        if(o==null){
            while(it.hasNext()){
                if(it.next()==null)
                    return true;
            }
        }else{
            while(it.hasNext())
                if(o.equals(it.next()))
                    return true;
        }
        return false;
    }
    /*
    1.Arrays.copyOf的用法
    2.
    */
    public Object[] toArrary(){
          Object[] r = new Object[size()];
          Iterator<E> it = iterator();
          for(int i=0;i<r.length;i++){
              if(!it.hasNext()){
                  return Arrays.copyOf(r, i);             //源对象更短
              }
              r[i]=it.next();
          }
          return it.hasNext()? finishToArray(r,it):r;      //源对象更长?size()所取得长度小于it实际迭代获得的长度
    }
    /*
    这部分没太看明白,找到了一个比较好的解释
    https://blog.csdn.net/u014785687/article/details/78535435
    */
    @SuppressWarnings("unchecked")
    public <T> T[] toArray(T[] a){
        int size = size();
        T[] r = a.length >= size? a:
            (T[])java.lang.reflect.Array
            .newInstance(a.getClass().getComponentType(), size);
        Iterator<E> it = iterator();
    
        for(int i=0;i<r.length;i++){
            // 申请元素空间个数少于期待(size()返回)的个数
            if(!it.hasNext()){
         
                // a.length >= size
                if(a == r){
                    r[i]= null;
                }
                // 这里可以认为i为a实际的大小,size为最开始确定的大小,然后由于同步发生了修改 出现了i与size不一致
                // a.length <size  且 a!= r
                // a.length < i <= size ,  即
                else if(a.length<i){
                    return Arrays.copyOf(r, i);
                }
                // size > a.length >=i 
                else{
                    System.arraycopy(r, 0, a, 0, i);
                    // a.length > i
                    if(a.length > i){
                        a[i]=null;
                    }
                }
                return a;
            }
            r[i]=(T)it.next();
        }
        return it.hasNext()?finishToArray(r,it):r;
    }
    
    /*
    需要扩容的情况
    */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    
    @SuppressWarnings("unchecked")
    private static <T> T[] finishToArray(T[] r, Iterator<?> it){
        int i = r.length;
        while(it.hasNext()){
            int cap = r.length;
            if(i == cap){
                int newCap = cap + (cap >>1) +1;
                if(newCap - MAX_ARRAY_SIZE>0)
                    newCap = hugeCapacity(cap+1);
                r = Arrays.copyOf(r,newCap);
            }
            r[i++]= (T)it.next();
        }
        return (i==r.length)? r:Arrays.copyOf(r, i);
    }
    
    private static int hugeCapacity(int minCapacity){
        if(minCapacity < 0){
            throw new OutOfMemoryError
            ("Required array size too large");
        }
        return( minCapacity >MAX_ARRAY_SIZE)?
        Integer.MAX_VALUE:
        MAX_ARRAY_SIZE;
    }
    
    

    AbstractList.java

    /*
    1.hashCode 为什么乘以31
    https://blog.csdn.net/mxw2552261/article/details/91349677
    */
    public int hashCode(){
        int hashCode = 1;
        for(E e :this)
            hashCode = 31*hashCode + (e==null?0:e.hashCode());
        return hashCode;
    }
  • 相关阅读:
    AttributeError: 'DatabaseFeatures' object has no attribute 'autocommits_when_autocommit_is_off'
    mac 添加adb环境变量
    ios环境搭建
    接口自动化测试平台介绍
    听风系统介绍
    nginx启动报错整理
    Mongodb: Sort operation used more than the maximum 33554432 bytes of RAM
    Mac上python 在终端使用pip3安装包报ConnectTimeoutError错误
    crontab -让服务器执行定时任务
    koajs项目之memcached实现session共享
  • 原文地址:https://www.cnblogs.com/zhouyu0-0/p/13418148.html
Copyright © 2011-2022 走看看