System.out.println(list.indexOf(“a”)); //集合中有该元素就返回第一次出现的index,没有就返回-1
list.add(“b”);
System.out.println(list.indexOf(“b”)); //返回第一个对应的索引
System.out.println(list.lastIndexOf(“b”)); //返回最后一个对应的索引
}
}
//output:
学习源码时,都会涉及到数据结构,而数据结构往往是程序的精髓所在。ArrayList的数据结构是数组,但是它跟数组不同的地方是ArrayList有一种扩容机制,所以能过自动扩容。妈妈再也不用担心我的容量不够了。
ArrayList的查询速率高,增删效率低,线程不安全。Vector是线程安全的,但是性能不及ArrayList,它们俩的底层实现都是数组。增删一般用HashMap,HashMap是最常用到的集合框架,它的底层实现是链表。
1,继承结构
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
{
我们可以很清晰的看出,ArrayList先继承了AbstractList,然后分别实现List, RandomAccess, Cloneable, java.io.Serializable三个接口。
List接口
RandomAccess接口 :用来快速存取,提高性能的。
Cloneable接口:实现了该接口,就可以使用Object.Clone()方法了。
Serializable接口:实现该序列化接口,表明该类可以被序列化,什么是序列化?简单的说,就是能够从类变成字节流传输,然后还能从字节流变成原来的类。
这里为什么没有让ArrayList直接实现List接口呢?反而让ArrayList继承AbstractList,然后AbstractList再实现List接口。其实这是java大牛设计jdk时就考虑到的问题,设计的思想是简洁可读性。
接口中全都是抽象的方法,而抽象类中可以有抽象方法,还可以有具体的实现方法,正是利用了这一点,让AbstractList是实现接口中一些通用的方法,而具体的类还可以添加自己独特的方法。
2,类中的属性
public class ArrayList extends AbstractList
implements List, Rando