java基础,集合,Arraylist,源码解析(基础)

ArrayList

  • 是什么,定义?

这是动态的数组,它提供了动态的增加和减少元素,实现了List接口(List实现Collection,所以也实现Collection接口)灵活的设置数组的大小等好处

  

  • 内部如何实现
 1     /**
 2      * The array buffer into which the elements of the ArrayList are stored.
 3      * The capacity of the ArrayList is the length of this array buffer.
 4      */
 5     private transient Object[] elementData;//内部是数组
 6
 7     /**
 8      * The size of the ArrayList (the number of elements it contains).
 9      *
10      * @serial
11      */
12     private int size;//定义大小
13
14     /**
15      * Constructs an empty list with the specified initial capacity.
16      *
17      * @param  initialCapacity  the initial capacity of the list
18      * @throws IllegalArgumentException if the specified initial capacity
19      *         is negative
20      */
21     public ArrayList(int initialCapacity) {//带参数的初始化
22         super();
23         if (initialCapacity < 0)
24             throw new IllegalArgumentException("Illegal Capacity: "+
25                                                initialCapacity);
26         this.elementData = new Object[initialCapacity];
27     }
28
29     /**
30      * Constructs an empty list with an initial capacity of ten.
31      */
32     public ArrayList() {//默认初始化,大小是10
33         this(10);
34     }
  • 添加如何操作
 1   public boolean add(E e) {
 2         ensureCapacityInternal(size + 1);  // 进行长度的判断与修改(将检查与扩容放在一个方法调用,代码阅读性高)
 3         elementData[size++] = e;
 4         return true;
 5     }
 6   
 7     private void ensureCapacityInternal(int minCapacity) {
 8         modCount++;
 9         // overflow-conscious code
10         if (minCapacity - elementData.length > 0)//进行判断
11             grow(minCapacity);
12     }
13
14     private void grow(int minCapacity) {
15         // overflow-conscious code
16         int oldCapacity = elementData.length;
17         int newCapacity = oldCapacity + (oldCapacity >> 1);//扩大原来的二分之一
18         if (newCapacity - minCapacity < 0)//最小的长度
19             newCapacity = minCapacity;
20         if (newCapacity - MAX_ARRAY_SIZE > 0)//最大长度
21             newCapacity = hugeCapacity(minCapacity);
22         // minCapacity is usually close to size, so this is a win:
23         elementData = Arrays.copyOf(elementData, newCapacity);
24     }
  • 添加重要的一部,扩容,——这是为什么实际应用中要定义数组大小的原因,
 1    //Array的源代码
 2 public static <T> T[] copyOf(T[] original, int newLength) {
 3         return (T[]) copyOf(original, newLength, original.getClass());
 4     }
 5
 6     public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {//需要复制原来的数组
 7         T[] copy = ((Object)newType == (Object)Object[].class)
 8             ? (T[]) new Object[newLength]
 9             : (T[]) Array.newInstance(newType.getComponentType(), newLength);
10         System.arraycopy(original, 0, copy, 0,
11                          Math.min(original.length, newLength));
12         return copy;
13     }
  • 制定位置的添加
1     public void add(int index, E element) {
2         rangeCheckForAdd(index);
3
4         ensureCapacityInternal(size + 1);  // Increments modCount!!
5         System.arraycopy(elementData, index, elementData, index + 1,
6                          size - index);//仅仅是当前位置以后的对象进行复制
7         elementData[index] = element;
8         size++;
9     }
  • 删除对象
    public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);//制定位置以后的对象,向前移动一位
        elementData[--size] = null; // Let gc do its work

        return oldValue;
    }
  • 怎么遍历呢?

数组,通过数组的脚标,遍历;

for each 因为实现Iterator,也可以使用迭代器

  

使用中改注意:

1、初始化最好定义都用的长度,避免Arrarlist内部复制的操作;

2、如果删除的,尽量从后往前删除

3、不是线程安全,全部代码中都没有synchronized ,

  如果有需要,使用Vector,两者的区别3点(其他基本是一样):

  线程安全,

  多了方法indexOf,

  扩容的打大小是:1倍

      int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
      capacityIncrement : oldCapacity);

  

原文地址:https://www.cnblogs.com/xiebq/p/8325975.html

时间: 2024-10-16 04:41:39

java基础,集合,Arraylist,源码解析(基础)的相关文章

Java 1.8 ArrayList源码解析

1 // 非线程安全 2 // 继承了AbstractList类 3 // 实现了List.RandomAccess.Cloneable.java.io.Serializable接口 4 // 后面3个接口是标记接口,没有抽象方法. 5 // 表示ArrayList可以随机访问.浅复制.序列化和反序列化. 6 public class ArrayList<E> extends AbstractList<E> 7 implements List<E>, RandomAcc

Java集合干货系列-(一)ArrayList源码解析

前言 今天来介绍下ArrayList,在集合框架整体框架一章中,我们介绍了List接口,ArrayList继承了AbstractList,实现了List.ArrayList在工作中经常用到,所以要弄懂这个类是极其重要的.构造图如下:蓝色线条:继承绿色线条:接口实现 正文 ArrayList简介 ArrayList定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomA

给jdk写注释系列之jdk1.6容器(1):ArrayList源码解析

原文出自吞噬天地,链接整理自ImportNew 给jdk写注释系列之jdk1.6容器(2):LinkedList源码解析 给jdk写注释系列之jdk1.6容器(3):Iterator设计模式 给jdk写注释系列之jdk1.6容器(4)-HashMap源码解析 给jdk写注释系列之jdk1.6容器(5)-LinkedHashMap源码解析 给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&Map迭代器 给jdk写注释系列之jdk1.6容器(1):ArrayList源码解析 工作中

ArrayList源码解析

ArrayList源码解析 ArrayList简介: ArrayList 是list接口的一个常用实现类.它的对象可以认为是一维数组的"类版本".我们很快就可以看到,ArrayList 对象可以看做是一维数组的改良版本.类似于数组,ArrayList 对象支持元素的随机访问:也就是说,只要给出元素的索引,任何元素的访问时间都是常数.但是同数组不同的是,ArrayList 对象的大小在程序执行的过程中可以自动进行调整,并且ArrayList对象具有在任何索引位置插入和删除对象的方法,而数

面试必备:ArrayList源码解析(JDK8)

面试必备:ArrayList源码解析(JDK8) https://blog.csdn.net/zxt0601/article/details/77281231 概述很久没有写博客了,准确的说17年以来写博客的频率降低到一个不忍直视的水平.这个真不怪我,给大家解释一下. 一是自从做了leader,整天各种事,开会,过需求,无限循环.心很累,时间也被无线压榨 二 我本身也在学习一些其他的技术,比如ReactNative,也看了半天的kotlin,撸了几个groovy脚本.gradle插件. 三 是打

源码解读:ArrayList源码解析(JDK8)

ArrayList源码解析(JDK8) 更详细的讲解可以参考这篇博文,本文只讲解在阅读源码中个人遇到的问题. 面试必备:ArrayList源码解析(JDK8) 构造函数 /** * ArrayList容器默认初始容量 */ private static final int DEFAULT_CAPACITY = 10; /** * 用于有参构造的空数组 */ private static final Object[] EMPTY_ELEMENTDATA = {}; /** * 用于无参构造的空数组

java.lang.Void类源码解析_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code null} * @throws SecurityException if the current thread cannot create a * thread in the specified thread grou

Java集合---LinkedList源码解析

一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据remove()7.数据获取get()8.数据复制clone()与toArray()9.遍历数据:Iterator()二.ListItr 一.源码解析 1. LinkedList类定义. public class LinkedList<E> extends AbstractSequentialList<E> implements List&

ArrayList源码解析(一)

目录 1.位置 2.变量和常量 3.构造函数 4.trimToSize()方法 正文 源码解析系列主要对Java的源码进行详细的说明,由于水平有限,难免出现错误或描述不准确的地方,还请大家指出. 回到顶部 1.位置 ArrayList位于java.util包中. 1 package java.util; 2 3 import java.util.function.Consumer; 4 import java.util.function.Predicate; 5 import java.util

数据结构-ArrayList源码解析

一.ArrayList简介 1.1.ArrayList概述 1)ArrayList是个动态数组,它是基于数组实现的List类. 2)该类封装了一个动态再分配的Object[]数组,每一个类对象都有一个capacity属性,表示它们所封装的Object[]数组的长度,当向ArrayList中添加元素时,该属性值会自动增加. 如果想ArrayList中添加大量元素,可使用ensureCapacity方法一次性增加capacity,可以减少增加重分配的次数提高性能. 3)ArrayList的用法和Ve