zoukankan      html  css  js  c++  java
  • Java 面试题 —— java 源码

    1. 静态工厂方法

    静态工厂方法不必在每次调用它们的时候都创建一个新的对象;

    • Boolean.valueOf(boolean):

      public final class Boolean {
          public static final Boolean TRUE = new Boolean(true);
          public static final Boolean FALSE = new Boolean(false);
          public static Boolean valueOf(boolean b) {
                  return (b ? TRUE : FALSE);
          }
      }

    2. ArrayList 长度的动态拓展

    • 构造函数:

      // 底层数据结构,定长数组
      private transient Object[] elementData;
      
      public ArrayList(int initialCapacity) {
              super();
              if (initialCapacity < 0)
                  throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
              this.elementData = new Object[initialCapacity];//属性指向新建长度为初始容量的临时数组
      }
      
      // 使用初始容量10构造一个空列表
      public ArrayList() {
          this(10);
      }
      
      / *构造包含利用collection的迭代器按顺序返回的指定collection元素的列表
       * @param c 集合,它的元素被用来放入列表t
       * @throws NullPointerException 如果指定集合为 null
       */
      public ArrayList(Collection<? extends E> c) {
          elementData = c.toArray(); //用Collection初始化数组elementData
          size = elementData.length;
          if (elementData.getClass() != Object[].class)
              elementData = Arrays.copyOf(elementData, size, Object[].class);
      }
    • 动态拓展 :

      为了实现这一机制,java 引进了 Capacity 和 size 概念,以区别数组的 length。为了保证用户增加新的列表对象,java设置了最小容量(minCapacity),通常情况上,它大于列表对象的数目,所以 Capactiy 虽然就是底层数组的长度(length),但是对于最终用户来讲,它是无意义的。而size存储着列表对象的数量,才是最终用户所需要的。为了防止用户错误修改,这一属性被设置为privae的,不过可以通过size()获取。

      private void grow(int minCapacity) {
          // overflow-conscious code
          int oldCapacity = elementData.length;
          int newCapacity = oldCapacity + (oldCapacity >> 1);//新容量扩大到原容量的1.5倍,右移一位相关于原数值除以2。
          if (newCapacity - minCapacity < 0)
              newCapacity = minCapacity;
          if (newCapacity - MAX_ARRAY_SIZE > 0)
              newCapacity = hugeCapacity(minCapacity);
          // minCapacity is usually close to size, so this is a win:
          elementData = Arrays.copyOf(elementData, newCapacity);
      }
      private static int hugeCapacity(int minCapacity) {
          if (minCapacity < 0) // overflow
              throw new OutOfMemoryError();
          return (minCapacity > MAX_ARRAY_SIZE) ?
              Integer.MAX_VALUE :
              MAX_ARRAY_SIZE;//MAX_ARRAY_SIZE和Integer.MAX_VALUE为常量,详细请参阅下面的注解
      }
  • 相关阅读:
    pip升级报错AttributeError: 'NoneType' object has no attribute 'bytes'
    在Windows中安装MySQL
    nginx配置成功,浏览器无法访问
    mysql 安装完以后没有mysql服务
    对字符串的切片操作
    linux下anaconda的安装和使用
    python学习笔记
    python学习笔记2018-9-18
    python学习笔记2018-9-17
    电脑必须用U盘引导盘才能进系统解决办法
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9420957.html
Copyright © 2011-2022 走看看