ArrayList
1.概述
--- 是List集合的实现类,可以用Collection的也可以用List的方法
--- 每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着 向 ArrayList 中不断添加元素,其容量也自动增长。
2.特点
--- 底层维护了一个数组Object[],方便查,空间都是连续的
--- 元素有序
--- 元素有下标
--- 元素可以存null
--- 元素可重复
3.扩容机制
--- jdk1.6是当创建了一个ArrayList对象时,直接创建一个容量为10的数组
--- jdk1.8是当创建了一个ArrayList对象时,创建了一个空数组,为了优化内存,first element is added(添加第一个元素)才扩充容量
--- ArrayList底层维护了一个Object[] elementData用来存数据,当调用add()时,才开始扩充容量.会把数据添加到数组里,并同时扩充容量,第一次扩容默认容量是10,当超过10个元素时,底层会自动扩容
--- size()方法,指的是“逻辑”长度。所谓“逻辑”长度,是指内存已存在的“实际元素的长度” 而“空元素不被计算”,即:当你利用add()方法,向ArrayList内添加一个“元素”时,逻辑长度就增加1位。 而剩下的9个空元素不被计算
--- 扩容的方式就是:int newCapacity = oldCapacity + (oldCapacity >> 1);就是旧容量的1.5倍(注:>> :位运算右移,代表除以)
public boolean add ( E e) {
ensureCapacityInternal ( size + 1 ) ;
elementData[ size++ ] = e;
return true ;
}
4.测试常用方法
public static void main ( String[ ] args) {
ArrayList< String> arrayList = new ArrayList < > ( ) ;
arrayList. add ( "火麟飞" ) ;
arrayList. add ( "天羽" ) ;
arrayList. add ( "苗条俊" ) ;
arrayList. add ( "龙戬" ) ;
arrayList. add ( 2 , "狮王" ) ;
System. out. println ( arrayList. remove ( 4 ) ) ;
System. out. println ( arrayList. size ( ) ) ;
System. out. println ( arrayList. isEmpty ( ) ) ;
System. out. println ( arrayList. contains ( "火麟飞" ) ) ;
System. out. println ( arrayList) ;
}
LinkedList
1.概述
--- 是List接口的实现类,也可以使用List接口和Collection接口的所有方法,也可以进行功能扩展(也叫双向链表)
2.特点
--- 底层是链表结构,适合增删(空间不连续)
--- 和List接口一样可以重复,可以有序,可以存null,有下标
3.特有方法(两套效果一样的)
void addFirst(E e)
void addLast(E e)
E getFirst()
E getLast()
E removeFirst()
E removeLast()
boolean offerFirst(E e)
boolean offerLast(E e)
E peekFirst()
E peekLast()
E pollFirst()
E pollLast()
4.测试常用方法
public static void main ( String[ ] args) {
LinkedList< Integer> linkedList = new LinkedList < > ( ) ;
linkedList. add ( 1 ) ;
linkedList. add ( 2 ) ;
linkedList. add ( 3 ) ;
linkedList. add ( 4 ) ;
linkedList. add ( 5 ) ;
linkedList. addFirst ( 22 ) ;
linkedList. addLast ( 33 ) ;
System. out. println ( linkedList) ;
System. out. println ( linkedList. getFirst ( ) ) ;
System. out. println ( linkedList. getLast ( ) ) ;
linkedList. removeFirst ( ) ;
linkedList. removeLast ( ) ;
}
5.测试迭代器遍历
--- 双向链表:下标遍历效率低,迭代器遍历效率高
public static void main ( String[ ] args) {
LinkedList< Integer> l = new LinkedList < > ( ) ;
for ( int i = 0 ; i < 100000 ; i++ ) {
l. addLast ( i) ;
}
method ( l) ;
method2 ( l) ;
}
private static void method2 ( LinkedList< Integer> l) {
long t = System. currentTimeMillis ( ) ;
Iterator< Integer> iterator = l. iterator ( ) ;
while ( iterator. hasNext ( ) ) {
iterator. next ( ) ;
}
t = System. currentTimeMillis ( ) - t;
System. out. println ( "---iterator迭代器---" + t) ;
}
private static void method ( LinkedList< Integer> l) {
long t = System. currentTimeMillis ( ) ;
for ( int i = 0 ; i < l. size ( ) ; i++ ) {
l. get ( i) ;
}
long t2 = System. currentTimeMillis ( ) ;
System. out. println ( "---for循环---" + ( t2- t) ) ;
}
Debug模式/断点模式
--- 专门用来给程序员跟踪代码调试代码用的
--- 步骤: 设置断点 + 激活断点模式 + 向下执行一步/单步执行f8(IDEA)