1.ArrayList扩容
- 新数组长度 = 原数组长度/2+原数组长度
- 添加元素 add()
- 采用addAll(),添加元素,由于添加的是一个集合,所以第一次扩容的时候,应该在 扩容的默认长度和元素个数,选一个较大值。
2. 扩容机制总结
- ArrayList()会使用长度为0的数组
- ArrayList( int initialCapacity) 会使用指定容量得数组
- ArrayList(集合) 使用集合大小作为数组初始容量
- add(Object o) 首次扩容为10,再次扩容为之前的1.5倍
- addAll(Collection c) 没有元素的时候,扩容为Math.max(10,实际元素个数),有元素时为Math.max(原容量1.5倍,实际元素个数)
3.ArrayList
- 底层是基于数组的,需要连续的内存
- 随机访问快,通过数组下标查询
- 尾部增删快,其他慢
- 线程不安全,效率高
4.ArrayList的成员方法 ,以及创建方式
package cn.sxau;
import java.util.ArrayList;
public class Java_List_ArrayList {
public static void main(String[] args) {
/**
* 三种创建集合对象方式:
* ArrayList list1 = new ArrayList(); //无需传递构造参数,底层数组为空数组
* ArrayList list2 = new ArrayList(3); //构造参数需要传递一个int类型的值,用于设定底层数组的长度
* ArrayList list3 = new ArrayList(list1)构造参数需要传递一个Collection类型的值,用于将其他集合中数据放置在当前集合中
*/
ArrayList arrayList = new ArrayList();
/**
* 方法:添加元素
* 1.add("数据"),添加数据,当超过指定数组长度,数组自动扩容;
* 2.add("索引","数据")当索引重复,被重复的向后移动一位
* 3.addAll(collection)增加一个集合中数据
*/
arrayList.add(0,"zhansan");
System.out.println(arrayList);
/**
* 查询:
* 1.get("索引"),获取指定位置的数据
* 2.size(),获取集合中数据条数
* 3.indexOf("数据")获取数据在集合中位置,如果该数据重复,返回第一次出现的位置,如果没有该数据返回-1
* 4.lastIndexOf("数据")获取数据最后一次出现的位置
*/
System.out.println(arrayList.indexOf("zhansan"));
/**
* 修改:
* 1.set("索引","数据")修改数据, 返回修改之前的数据
*/
System.out.println(arrayList.set(0, "王五"));
System.out.println(arrayList);
/**
* 删除:
* 1.remove("索引")删除数据,返回删除之前的数据
* 2.clear()清空数据
* 3.removeAll()删除指定集合中所有数据
*/
System.out.println(arrayList.remove(0));
System.out.println(arrayList);
/**
* 包含:
* contains("数据")判单集合中是否包含该数据
* 判断
* isEmpty()判断改集合是否为空
*/
System.out.println(arrayList.contains("zhansan"));
System.out.println(arrayList.isEmpty());
}
}
5.LinkedList
-
底层是一个双向链表,无需连续的内存
-
随机访问慢,更具链表遍历
-
头尾插入删除快
-
线程不安全,效率高
6.LinkedList的成员方法 ,以及创建方式
package cn.sxau.Collection;
import java.util.LinkedList;
public class java_List_LinkedList {
public static void main(String[] args) {
/**
* 创建集合对象方式:
* 1.LinkedList list1 = new LinkedList();无需传递构造参数
* 2.LinkedList list2 = new LinkedList(list2);传递一个集合
*/
LinkedList linkedList = new LinkedList();
/**
* 添加:
* list.add("zhangsan"); //添加数据,放置在最后
* list.addFirst("数据"); //添加到最前面
* list.addLast("数据");//添加到最后
* list.add("","数据");//通过索引,添加数据
* list.add(集合)
* push("数据");//添加数据,直接添加到最前面
*/
linkedList.addFirst("张三");
linkedList.add("王五");
System.out.println(linkedList);
/**
* 查询
* list.get("索引");
* list.getFirst();
* list.getLast();
* element();//获取第一个数据
*/
System.out.println(linkedList.element());
System.out.println(linkedList.get(0));
/**
* 修改:
* set("索引","数据") 返回被修改的值;
*/
System.out.println(linkedList.set(0, "哈哈哈"));
System.out.println(linkedList);
/**
* 删除
* remove();
* removeFirst();
* removeLast();
* pop();弹出第一个数据,并返回
*/
System.out.println(linkedList.pop());
/**
* ArrayList有的方法,LinkedList基本也有
*/
}
}
7.List接口
-
List接口继承collection父类接口
-
List的实现类有ArrayList和LinkedList
-
List中元素有序,可重复。
-
List存储的是单列数据的集合