ArraysList源码分析

本文详细介绍了Java中ArrayList类的源码,包括默认容量、构造方法重载以及通过集合初始化ArrayList的方式。重点关注了如何设置集合容量以及对传入非法容量值的处理。此外,还解释了elementData数组的transient特性及其作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中集合的源码经常在面试中被问到,这里我简单复制啦一段源码,范围是ArrayList类的构造方法重载结束
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final long serialVersionUID = 8683452581122892189L;
    //设置Arrays的默认容量大小是10,注意是final修饰的,只能赋值一次
    private static final int DEFAULT_CAPACITY = 10;
    
    private static final Object[] EMPTY_ELEMENTDATA = {};

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

   //定义一个Object类型的数组,transient是一个修饰符,表示该数组不被序列化
    transient Object[] elementData; // non-private to simplify nested class access

   //定义啦一个大小
    private int size;

   //构造方法的重载,这个方法重载是为啦定义ArraysList的容量大小,创建ArraysList对象时候要传    入一个int作为集合大小
    public ArrayList(int initialCapacity) {

        if (initialCapacity > 0) {
//传入的值大于0的时候就让,elementData数组的大小为initialCapacity
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
//如果你传入一个零就让数组等于默认EMPTY_ELEMENTDATA
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
//***在这里可以总结出来如果你要设置集合的大小,传入的int值必须为大于等于0的值
//,如果为负数就会抛出IllegalArgumentException异常
    }

   //你也可以不设置集合大小使用默认的容量10
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

  //传入一个集合
    public ArrayList(Collection<? extends E> c) {
//把这个集合转为数组
        elementData = c.toArray();
//这个数组长度赋值给size后 不为0
        if ((size = elementData.length) != 0) {
           //判断这个数组的类型是否属于Object[]类
            if (elementData.getClass() != Object[].class)
              //克隆这个数组赋值给elementData
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // 数组长度为零,让当前elementData值为EMPTY_ELEMENTDATA
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
### Java ArrayList 排序方法 在 Java 中,可以使用多种方式对 `ArrayList` 进行排序。以下是几种常见的实现方法: #### 使用 `List.sort()` 方法 从 Java 8 开始,`List` 接口新增了一个默认方法 `sort(Comparator<? super E> c)`,允许通过传递比较器来对列表中的元素进行排序。 ```java import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(5); list.add(2); list.add(9); // 自然顺序排序 list.sort(null); System.out.println(list); // 输出: [2, 5, 9] // 定制排序 (降序) list.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } }); System.out.println(list); // 输出: [9, 5, 2] } } ``` 上述代码展示了如何利用 `List.sort()` 方法按照自然顺序以及定制顺序对整数类型的 `ArrayList` 进行排序[^1]。 #### 使用 `Collections.sort()` 方法 对于较早版本的 Java 或者需要额外灵活性的情况,可以使用 `Collections.sort()` 静态方法来进行排序。 ```java import java.util.*; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(Arrays.asList("banana", "apple", "orange")); Collections.sort(list); System.out.println(list); // 输出: [apple, banana, orange] Collections.sort(list, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s2.length() - s1.length(); } }); System.out.println(list); // 可能输出: [orange, banana, apple] } } ``` 这里说明了两种不同的排序策略:一种是基于字符串字典顺序的标准升序排列;另一种则是依据字符串长度进行降序排列[^3]。 #### 对自定义对象的排序 当处理的是包含复杂数据结构的对象而非基本类型时,则需提供具体的比较逻辑给定这些对象之间的相对次序关系。 假设我们有一个表示书籍信息的类 Book ,其中包含了书名 title 和价格 price 属性 。我们可以创建一个实现了 Comparable 接口或者编写独立 comparator 来决定两本书应该如何被比较并最终完成整个 books 列表内的项目重新安排位置的过程如下所示: ```java class Book implements Comparable<Book>{ private String title; private double price; public Book(String t,double p){ this.title=t;this.price=p;} @Override public int compareTo(Book b){ return Double.compare(this.price,b.getPrice()); } //getter setter omitted for brevity... } //Usage Example: List<Book> bookList=new ArrayList<>(); bookList.add(new Book("Java Programming",40)); bookList.add(new Book("Python Crash Course",35)); Collections.sort(bookList);//uses natural ordering defined by compareTo method. for(Book b :bookList )System.out.println(b.getTitle()+":"+b.getPrice()); ``` 此段程序会先按价格低到高打印每本图书的名字及其对应的价格.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值