1.List接口中存储数据的特点
用于存储有序的、可以重复的数据。--->"动态"数组。
2.List中的常用方法
2.1 第一类:Collection 中声明的15个方法。
2.2 第二类:
-
插入元素
void add(int index, Object ele) :在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来 -
获取元素
object get(int index):获取指定index位置的元素
List subList(int fromindex,int tolndex):返回从fromIndex到tolndex位置的子集合 -
获取元素索引
int indexof(object obj):返回obj在集合中首次出现的位置
int lastindexof(object obj):返回obj在当前集合中末次出现的位置 -
删除和替换元素
object remove(int index):移除指定index位置的元素,并返回此元素
object set(int index,object ele):设置指定index位置的元素为ele
List list = new ArrayList();
list.add("java");
list.add(12);
list.add("sun");
list.add(12);
System.out.println(list.toString());//[java, 12, sun, 12]
//add(int index, Object ele)
list.add(0,"hello");
System.out.println(list);//[hello, java, 12, sun, 12]
//addAll(int index, Collection eles)
List List1 = Arrays.asList(1,2,3);
list.addAll(2,List1);
System.out.println(list);//[hello, java, 1, 2, 3, 12, sun, 12]
//list.add(1,List1),将list1整体作为一个元素,插入到list索引为1的位置上
//删除索引12的元素
//list.remove(12);
//删除数据12
list.remove(Integer.valueOf(12));
System.out.println(list);//[hello, java, 1, 2, 3, sun, 12]
3. List不同实现类的对比
3.1 ArrayList实现类
- ArrayList底层是数组 Object[],数组内存空间连续的
- 优点:因为数组内存空间连续的 所以 ArrayList 查询性能较高,查询的时间复杂度是O(1);
- 缺点:删除和指定位置新增的时候,因为涉及到元素的移动,所以性能较低,时间复杂度是O(n)
- 有参构造 是最常用的方式 给一个预估值,避免无效 扩容
- ArrayList无参构造 方法内部数组第一次扩容 长度为10 ;以后的每次扩容 都是旧的数组长度的1.5倍;
ArrayList arrayList = new ArrayList();
arrayList.add("java");
arrayList.add("sun");
arrayList.add("12");
arrayList.add("23");
//
System.out.println(arrayList);//[java, sun, 12, 23]
System.out.println(arrayList.remove(1));//sun
System.out.println(arrayList);//[java, 12, 23]
System.out.println(arrayList.get(1));//12
System.out.println(arrayList.size());//3
//指定位置新增和删除一样 ,内部都会有数组元素的移动
arrayList.add(1, "oracle");
System.out.println(arrayList);//[java, oracle, 12, 23]
3.2 LinkedList实现类
- LinkedList底层是链表 双向链表
- 优点:删除和指定位置新增 性能较高,因为没有元素的移动,只需要改动前后两个节点内容
- 缺点:查询性能较低 要么从前查询 要么从后查询 遍历整个链表的一半 时间复杂度 是O(n)
LinkedList linkedList = new LinkedList();
linkedList.add("java");
linkedList.add("sun");
linkedList.add("oracle");
System.out.println(linkedList.get(1));//sun
System.out.println(linkedList);//[java, sun, oracle]
linkedList.remove(0);
System.out.println(linkedList);//[sun, oracle]
ArrayList和LinkedList的区别:
ArrayList:在添加数据、查找数据时,效率较高,在插入、删除数据时,效率较低
LinkedList:底层使用双向链表的方式进行存储。在对集合中的数据进行频繁的删除、插入操作时,建议使用此类插入。删除数据时,效率较高,在添加数据、查找数据时,效率较低;
3.3 Vector
- 底层也是数组,但是是线程安全的类
//Vector类是线程安全的集合 ArrayList 线程不安全;
Vector<String> vector = new Vector<>();
vector.add("abc");
vector.get(0);