浅析 ArrayList

打印 上一主题 下一主题

主题 876|帖子 876|积分 2630

by emanjusaka from  https://www.emanjusaka.top/2023/12/java-arrayList 彼岸花开可奈何
本文欢迎分享与聚合,全文转载请留下原文地址。
ArrayList是一个使用List接口实现的Java类。顾名思义,Java ArrayList提供了动态数组的功能,其中数组的大小不是固定的。它实现了所有可选的列表操作,并允许所有元素,包括null。
ArrayList 继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。
  1. public class ArrayList<E> extends AbstractList<E>
  2.         implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
  3.   }
复制代码

ArrayList 中的构造函数
  1. // 默认初始化容量
  2. private static final int DEFAULT_CAPACITY = 10;
  3. // 用于空实例的共享空数组实例。
  4. private static final Object[] EMPTY_ELEMENTDATA = {};
  5. // 用于默认大小的空实例的共享空数组实例。我们将其与EMPTY_ELEMENTDATA区别开来,以了解添加第一个元素时要膨胀多少。
  6. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  7.   
  8. public ArrayList() {
  9.         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  10.     }
  11.     public ArrayList(int initialCapacity) {
  12.         if (initialCapacity > 0) {
  13.             this.elementData = new Object[initialCapacity];
  14.         } else if (initialCapacity == 0) {
  15.             this.elementData = EMPTY_ELEMENTDATA;
  16.         } else {
  17.             throw new IllegalArgumentException("Illegal Capacity: "+
  18.                                                initialCapacity);
  19.         }
  20.     }
  21.     public ArrayList(Collection<? extends E> c) {
  22.         Object[] a = c.toArray();
  23.         if ((size = a.length) != 0) {
  24.             if (c.getClass() == ArrayList.class) {
  25.                 elementData = a;
  26.             } else {
  27.                 elementData = Arrays.copyOf(a, size, Object[].class);
  28.             }
  29.         } else {
  30.             // replace with empty array.
  31.             elementData = EMPTY_ELEMENTDATA;
  32.         }
  33.     }
复制代码
更改 ArrayList 中的元素

可以使用 set() 方法更改 ArrayList 中的元素。需要提供索引和新元素,然后此方法用新的给定元素更新给定索引处存在的元素。
  1. public void ensureCapacity(int minCapacity) {
  2.         int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
  3.             // any size if not default element table
  4.             ? 0
  5.             // larger than default for default empty table. It's already
  6.             // supposed to be at default size.
  7.             : DEFAULT_CAPACITY;
  8.         // 最小容量大于初始容量
  9.         if (minCapacity > minExpand) {
  10.             ensureExplicitCapacity(minCapacity);
  11.         }
  12.     }
  13.     private static int calculateCapacity(Object[] elementData, int minCapacity) {
  14.         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  15.             return Math.max(DEFAULT_CAPACITY, minCapacity);
  16.         }
  17.         return minCapacity;
  18.     }
  19.     private void ensureCapacityInternal(int minCapacity) {
  20.         ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
  21.     }
  22.     private void ensureExplicitCapacity(int minCapacity) {
  23.         modCount++;
  24.         // overflow-conscious code
  25.         if (minCapacity - elementData.length > 0)
  26.             // 扩容
  27.             grow(minCapacity);
  28.     }
  29.     private void grow(int minCapacity) {
  30.         // overflow-conscious code
  31.         int oldCapacity = elementData.length;
  32.         int newCapacity = oldCapacity + (oldCapacity >> 1);
  33.         if (newCapacity - minCapacity < 0)
  34.             newCapacity = minCapacity;
  35.         if (newCapacity - MAX_ARRAY_SIZE > 0)
  36.             newCapacity = hugeCapacity(minCapacity);
  37.         // minCapacity is usually close to size, so this is a win:
  38.         elementData = Arrays.copyOf(elementData, newCapacity);
  39.     }
  40.       private static int hugeCapacity(int minCapacity) {
  41.         if (minCapacity < 0) // overflow
  42.             throw new OutOfMemoryError();
  43.         return (minCapacity > MAX_ARRAY_SIZE) ?
  44.             Integer.MAX_VALUE :
  45.             MAX_ARRAY_SIZE;
  46.     }
复制代码
输出结果:

从 ArrayList 中移除元素

可以使用 remove() 方法从 ArrayList 中移除元素。
  1. // 这将在列表末尾添加“emanjusaka”
  2. aList.add("emanjusaka");
  3. // 这将在第四个位置添加“emanjusaka”
  4. aList.add(3,"emanjusaka");
复制代码
输出结果:

迭代 ArrayList
  1. package top.emanjusaka;
  2. import java.util.ArrayList;
  3. public class Main {
  4.     public static void main(String[] args) {
  5.         ArrayList<String> aList = new ArrayList<>();
  6.         aList.add("emanjusaka");
  7.         aList.add("Tom");
  8.         aList.add("Jack");
  9.         aList.set(1, "Jerry");
  10.         System.out.println(aList);
  11.     }
  12. }
复制代码
输出结果:

ArrayList 大小

可以使用ArrayList的size() 方法来查找ArrayList中的元素数量。
  1. package top.emanjusaka;
  2. import java.util.ArrayList;
  3. public class Main {
  4.     public static void main(String[] args) {
  5.         ArrayList<String> aList = new ArrayList<>();
  6.         aList.add("emanjusaka");
  7.         aList.add("Tom");
  8.         aList.add("Jack");
  9.         System.out.println(aList);
  10.         aList.remove("Tom");
  11.         System.out.println(aList);
  12.         aList.remove(1);
  13.         System.out.println(aList);
  14.     }
  15. }
复制代码
输出结果:

对 ArrayList 进行排序

可以使用 Collections 实用程序类的 sort() 方法对 ArrayList 进行排序。
  1. package top.emanjusaka;
  2. import java.util.ArrayList;
  3. public class Main {
  4.     public static void main(String[] args) {
  5.         ArrayList<String> aList = new ArrayList<>();
  6.         aList.add("emanjusaka");
  7.         aList.add("Tom");
  8.         aList.add("Jack");
  9.         for (String s : aList) {
  10.             System.out.println(s);
  11.         }
  12.     }
  13. }
复制代码
输出结果:

参考资料

本文原创,才疏学浅,如有纰漏,欢迎指正。如果本文对您有所帮助,欢迎点赞,并期待您的反馈交流,共同成长。
原文地址: https://www.emanjusaka.top/2023/12/java-arrayList
微信公众号:emanjusaka的编程栈

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表