java.util.ArrayList

本文详细介绍了Java中ArrayList的实现原理,包括其内部数据结构、构造函数、主要方法如add和get的具体实现,以及涉及到的扩容机制。

java.util.ArrayList

api

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。

具体介绍见 http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/ArrayList.html

construct

ArrayList是一个顺序列表,是对一个数组的封装

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * will be expanded to DEFAULT_CAPACITY when the first element is added.
     */
    transient Object[] elementData; // non-private to simplify nested class access

     /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;

elementData数组是存储数据的容器,size表示当前存储元素的个数

ArrayList有三个构造函数

  • ArrayList()
    默认构造函数,lazey的思想,将elementData设置为一个空数组,在add()时初始化大小为10
  • ArrayList(int initialCapacity)将elementData初始化为固定指定大小this.elementData = new Object[initialCapacity]
  • ArrayList(Collection<? extends E> c)
    用另一个集合的底层数组来构成新的ArrayList,elementData = c.toArray();

Collection.toArray()方法返回该集合的底层数组(ArrayList也是一个集合,实现了interface Collection)

Collection.toArray()具体介绍
http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/Collection.html#toArray()

构造函数ArrayList(Collection<? extends E> c)中还有一段代码,是为了处理bug 6260652

        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);

因为c.toArray返回的可能不是Object[].class类型,例如返回了String[].class类型,这里用Arrays.copyOf重新复制了一下数组,并且作了类型转化

reference http://www.zhihu.com/question/26603565

主要方法实现

add

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);扩充容量  // Increments modCount!!
        elementData[size++] = e;//放入元素到数组
        return true;
    }

get

转载于:https://www.cnblogs.com/CHzero/p/5557908.html

Java 里,`java.util.ArrayList` 无法直接转换为 `java.util.Map`,因为它们属于不同的数据结构,`ArrayList` 是有序的元素列表,而 `Map` 是键值对的集合。出现 `java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map` 错误,表明尝试进行了不合法的类型转换。以下是几种解决办法: ### 手动转换 若 `ArrayList` 中的元素本身就是键值对形式,能手动遍历 `ArrayList` 并将元素添加到 `Map` 中。示例代码如下: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ArrayListToMap { public static void main(String[] args) { // 假设 ArrayList 中的元素是键值对的形式,这里使用自定义对象来模拟 class KeyValuePair { private String key; private String value; public KeyValuePair(String key, String value) { this.key = key; this.value = value; } public String getKey() { return key; } public String getValue() { return value; } } List<KeyValuePair> arrayList = new ArrayList<>(); arrayList.add(new KeyValuePair("key1", "value1")); arrayList.add(new KeyValuePair("key2", "value2")); Map<String, String> map = new HashMap<>(); for (KeyValuePair pair : arrayList) { map.put(pair.getKey(), pair.getValue()); } System.out.println(map); } } ``` ### 依据特定规则转换 要是 `ArrayList` 中的元素存在特定规则,可根据该规则把元素转换为键值对添加到 `Map` 中。例如,`ArrayList` 中偶数索引的元素为键,奇数索引的元素为值: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ArrayListToMapByRule { public static void main(String[] args) { List<String> arrayList = new ArrayList<>(); arrayList.add("key1"); arrayList.add("value1"); arrayList.add("key2"); arrayList.add("value2"); Map<String, String> map = new HashMap<>(); for (int i = 0; i < arrayList.size(); i += 2) { if (i + 1 < arrayList.size()) { map.put(arrayList.get(i), arrayList.get(i + 1)); } } System.out.println(map); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值