• 关于list



    public
    class TestArrayList { public static void main(String[] args) { //1.创建一个ArrayList对象,用来存储多个分数 ArrayList list = new ArrayList(); //2.向ArrayList添加分数 list.add(67); //向末尾添加 list.add(89); // 集合的元素必须是对象类型,不能是基本数据类型。 list.add(78);//如果要放入基本数据类型,需要使用包装类 list.add(89);//JDK5之后,自动装箱 list.add(96); //list.add(Integer.valueOf(67)); //[67, 89, 78, 89, 96] list.add(2, 100); //[67, 89, 100, 78, 89, 96] ArrayList list2 = new ArrayList(); list2.add(45); list2.add(54); list2.add(45); //list.addAll(list2); //[67, 89, 100, 78, 89, 96, 45, 54, 45] list.addAll(0, list2); //list2.addAll(list); //[45, 54, 45, 67, 89, 100, 78, 89, 96] //3.获取ArrayList中的分数 System.out.println(list.toString()); System.out.println(list.size()); System.out.println(list.get(2)); //遍历ArrayList1:使用for循环 System.out.println("-------使用for循环-------"); for (int i = 0; i < list.size() ; i++) { int elem = (int) list.get(i); System.out.println(i+" "+elem); } //遍历ArrayList2:使用for-each循环 System.out.println("-------使用for-each循环--------"); for(Object elem :list){ System.out.println(elem); } //遍历ArrayList3:使用迭代器Iterator System.out.println("---------使用迭代器Iterator-----------"); Iterator it = list.iterator(); while(it.hasNext()){ int elem = (int) it.next(); System.out.println(elem); } } }

    理解 ArrayList的源码

    • ArrayList底层就是一个长度可以动态增长的Object数组;(StringBuilder底层就是一个长度可以动态增长的char数组)
    • public class ArrayList<E> extends AbstractList<E> implements

      List<E>, RandomAccess, Cloneable, Serializable{
             private static final int DEFAULT_CAPACITY = 10;
             private static final Object[] EMPTY_ELEMENTDATA = {};
              private static final Object[]  

      DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
             transient Object[] elementData;

             private int size;

      }

    • 接口是可以一个方法也不提供的,比如 RandomAccess, Cloneable, java.io.Serializable

    public class ArrayList<E> extends AbstractList<E>
            implements List<E>,

    RandomAccess,

    Cloneable,

    java.io.Serializable{}

    JDK1.7中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是10。JDK1.8中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是0;第一次添加元素,容量不足就要进行扩容了

    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

    • 容量不足时进行扩容,默认扩容50%。如果扩容50%还不足容纳新增元素,就扩容为能容纳新增元素的最小数量。
    • private void grow(int minCapacity) {

          int oldCapacity = elementData.length;
          int newCapacity = oldCapacity + (oldCapacity >> 1);
          if (newCapacity - minCapacity < 0)
              newCapacity = minCapacity;
          if (newCapacity - MAX_ARRAY_SIZE > 0)
              newCapacity = hugeCapacity(minCapacity); 
          elementData = Arrays.copyOf(elementData, newCapacity);
      }

  • 相关阅读:
    JAVA并发-join
    JAVA并发-同步器AQS
    【转载】Kafka史上最详细原理总结
    Kubernetes部署Spring Boot应用
    Kubernetes 资源对象
    Kubernetes Pod的数据卷Volume
    三块sm865组建RAID0
    三星固态Dell版的960g的sm863a硬盘
    如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)
    如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)
  • 原文地址:https://www.cnblogs.com/vincentmax/p/14241181.html
Copyright © 2020-2023  润新知