List接口介绍
1) List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
2)List集合的元素的存储顺序和取出顺序一致。
3) List接口的实现类常用的有:ArrayList(主要实现类)、LinkedList和Vector。
4) List不但继承了Collection接口中的全部方法(上一篇博客已经介绍过Conllection接口),还增加了一些根据元素位置索引来操作集合的特有方法。
5)集合不能定义为基本类型(int float char) 应该定义为包装类数据类型(Integer、String……)。
6)List下有ArrayList,Vector,LinkedList
List实现类之一:ArrayList
1) ArrayList 是 List 接口的典型实现类
2)可以将ArrayList集合看作一个长度可变的数组;底层依靠的就是数组来实先动态的存储数据。因为arrayList有个默认数组初始长度为10,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来重新容纳这些元素
3)Arrays.asList(…) 方法返回的 List 集合既不是 ArrayList 实例,也不是 Vector 实例。 Arrays.asList(…) 返回值是一个固定长度的 List 集合。、
List集合相对于Collection新增加的方法
List 集合里添加了一些根据索引来操作集合元素的方法,因为List是有序的,可重复的,所以在List中可以根据索引号来获取集合中每一个元素的值
void add(int index, Object ele) //在指定索引位置添加元素
boolean addAll(int index, Collection eles) //在指定索引位置添加集合
Object get(int index) //根据索引号取值
int indexOf(Object obj)//返回obj元素在集合中首次出现的位置 没有的话返回-1
int lastIndexOf(Object obj)//返回obj元素在集合中最后一次出现的位置 没有的话返回-1
Object remove(int index)// 删除指定索引位置的元素
Object set(int index, Object ele)//设置指定索引位置的元素,为新的元素
List subList(int fromIndex, int toIndex)//返回从fromIndex开始到toIndex结束的一个子list// 左闭右开(包含左边不包含右边)**加粗样式**
代码解释
package com.ghl.demo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.junit.Test;
public class ArrayListDemo {
@Test
public void arrayListTest() {
List list = new ArrayList(); //创建一个list集合对象
list.add(123);
list.add(345);
list.add("AA");
list.add("BB");
list.add(new Date());
// System.out.println(list);//输出结果:[123, 345, AA, BB, Sat Apr 20 17:32:32 CST 2019]
// 1.void add(int index, Object ele) //在指定索引位置添加元素
list.add(0, "ghl");
System.out.println("我是list集合新增的方法,在指定的索引位置添加元素"+list);//输出结果:我是list集合新增的方法,在指定的索引位置添加元素[ghl,123, 345, AA, BB, Sat Apr 20 17:32:32 CST 2019]
// 2.Object get(int index) //根据索引号取值
Object obj = list.get(0);
System.out.println(obj);// 输出结果:ghl
List list1 = new ArrayList();
list1.add("hbc");
list1.add("llq");
//3. boolean addAll(int index, Collection eles) 在指定索引位置添加集合
list.addAll(0, list1);
System.out.println(list);//输出结果:[hbc, llq, ghl, 123, 345, AA, BB, Sat Apr 2017:38:53 CST 2019]
//4. Object remove(int index) 删除指定索引位置的元素
Object remove = list.remove(0);
// System.out.println(list);//输出结果[llq, ghl, 123, 345, AA, BB, Sat Apr 2017:40:57 CST 2019]
// Object set(int index, Object ele) 设置指定索引位置的元素,为新的元素
list.set(0, "你好");
System.out.println(list);// 输出结果[你好, llq, ghl, 123, 345, AA, BB, Sat Apr 20 17:41:54 CST 2019]
// int indexOf(Object obj) //返回obj元素在集合中首次出现的位置 没有的话返回-1
int indexOf = list.indexOf(123);
System.out.println(indexOf);// 输出结果:3
// int lastIndexOf(Object obj)//返回obj元素在集合中最后一次出现的位置 没有的话返回-1
list.add(123);// 向集合中在添加一个元素123
System.out.println(list.lastIndexOf(123));// 8
// List subList(int fromIndex, int toIndex)//返回从fromIndex开始到toIndex结束的一个子list
// 左闭右开(包含左边不包含右边)
List subList = list.subList(0, 3);
System.out.println(subList);// 输出结果[你好, llq, ghl]
}
}
ArrayList的优缺点
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
List实现类之一:LinkedList
1)对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。
2)LinkedList克服了ArrayList集合在增删元素时效率较低的局限性。但是LinkedList集合的查询效率低(不支持随机访问),要查询第n个元素,必须从第一个元素开始,逐一的向后遍历,直到第n个元素。
3)该集合内部维护了一个双向链表,链表中的每个元素都通过对象引用来记住它的前一个元素和后一个元素,从而将所有的元素彼此连接起来
4)当插入或删除一个新元素时,只需要修改元素之间的引用关系即可。
LinkedList新增的方法:
void addFirst(Object obj)
void addLast(Object obj)
Object getFirst()
Object getLast()
Object removeFirst()
Object removeLast()
代码解释
package com.ghl.demo;
import java.util.LinkedList;
import org.junit.Test;
public class LinkedListDemo {
@Test
public void linkedListTest() {
LinkedList link = new LinkedList();///创建LinkedList集合,初始为空列表
link.add("ghl"); //0
link.add("geng");//1
link.add("fang");//2
link.add(123);//3
System.out.println(link.get(2));//获取下标为2的元素 结果:fang
System.out.println(link.toString());//打印集合中的元素 结果:[ghl, geng, fang, 123]
link.add(3, "Student");//向下标为3的位置添加指定元素 原来的元素会被覆盖
System.out.println(link.toString());//结果:[ghl, geng, fang, Student, 123]
link.addFirst(123467);//向集合第一个位置添加元素
System.out.println(link.getFirst());//打印集合中的第一个元素 结果123467
link.remove(3); //删除索引值为3的元素
link.removeFirst(); //删除第一个元素
}
}
ArrayList的优缺点
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
List实现类之一:Vector
1)Vector 是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。
2)在各种list中,最好把ArrayList作为默认选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。
Iterator和ListIterator主要区别(了解)
1)ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历。但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
2)ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator 没有此功能。
3)ListIterator有add()方法,可以向List中插入对象,而Iterator不能。
4)都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。
LinkedList与ArrayList的区别
相同之处
1)都直接或者间接继承了AbstractList、都支持以索引的方式操作元素
2)ArrayList是通过动态数组来保存数据的、当容量不足时、数组会自动扩容、而LinkedList是以双向链表来保存数据的、不存在容量不足的问题
3)都是线程不安全的、一般用于单线程的环境下、要想在并发的环境下使用可以使用Collections工具类包装。
不同之处
1)ArrayList是通过动态数组来保存数据的、而LinkedList是以双向链表来保存数据的
2)对集合中元素进行不同的操作效率不同、LinkedList善于删除、添加元素、ArrayList善于查找元素。本质就是不同数据结构之间差异。
ArrayList与Vector的区别
相同之处:
1)都继承AbstractList、拥有相同的方法
2)内部都是以动态数组来存储、操作元素的、并且都可以自动扩容
不同之处:
ArrayList是线程不安全的、适用于单线程的环境下、Vector是线程安全的、使用与多线程的环境下。