List特点为:存储有序,可存储重复元素,三个实现类为
1.ArrayList(数组列表)
特点:查找效率高,实现了长度可变,在内存中分配了连续的空间
创建ArrayList对象时建议使用有参构造方法,使用无参构造时,默认容量为10
1.1add()方法 无参时默认添加到数组末尾,有参数(索引,添加的元素)时,添加到指定索引处
添加元素时,首先要判断容量是否足够添加,如果无法完成添加,需要先扩容,再添加元素时,此时的容量为原来的1.5倍。
public class ArrayList1<T> {
public static void main(String[] args) {
ArrayList<String> e = new ArrayList<String>();
//创建一个
e.add("a");
e.add("b");
e.add("c");
e.add("d");
e.add(1,"k");
System.out.println(e);
}
}
//输出结果为:
[a, b, c, d]
[a, k, b, c, d]
1.2get()方法 注;先检查索引是否合法,即就是判断索引是否越界,通过索引返回元素
public class ArrayList1<T> {
public static void main(String[] args) {
ArrayList<String> e = new ArrayList<String>();
//创建一个
e.add("a");
e.add("b");
e.add("c");
e.add("d");
System.out.println(e);
e.add(1,"k");
System.out.println(e);
System.out.println(e.get(1));
//获得索引处对应的元素
}
}
1.3set()方法 设置指定索引处元素
public class ArrayList1<T> {
public static void main(String[] args) {
ArrayList<String> e = new ArrayList<String>();
//创建一个
e.add("a");
e.add("b");
e.add("c");
e.add("d");
System.out.println(e);
e.add(1,"k");
System.out.println(e);
e.set(1, "B");
//将指定索引处的元素替换为某一元素
System.out.println(e);
}
}
//输出结果:
[a, b, c, d]
[a, k, b, c, d]
[a, B, b, c, d]
2.2LinkedList(链表)
特点:中间删除,添加效率高,底层通过链表实现,可以实现队列和栈的结构,无索引,但存在一个节点Node
2.1add()方法 添加元素时必须从第一个结点开始
import java.util.LinkedList;
public class LinkedLIst1 {
public static void main(String[] args) {
LinkedList<String> s=new LinkedList<String>();
s.add("a");
s.add("b");
s.add("c");
//向指定位置处添加元素
s.add(1,"d");
System.out.println(s);
}
}
add()方法的底层源码为:通过节点Node依次指向下一个元素
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
2.2get()方法:通过编号查找元素,注意并非索引
import java.util.LinkedList;
public class LinkedLIst1 {
public static void main(String[] args) {
LinkedList<String> s=new LinkedList<String>();
s.add("a");
s.add("b");
s.add("c");
s.add(1,"d");
System.out.println(s);
System.out.println(s.get(2));
}
}
/*输出结果
[a, d, b, c]
b
*/
3.Vector(数组列表)
特点:底层同样是通过数组实现,不过Vector对比与ArrayList而言,是线程安全的,因为Vector底层多了一个安全锁
3.1add()方法 添加元素时先判断容量是否足够,如果容量不够无法完成添加,会先进行扩容操作,与ArrayList中不同的是数组扩容会扩容到原来的两倍
import java.util.Vector;
public class Vector1 {
public static void main(String[] args) {
Vector<String> d=new Vector<String>(1);
d.add("f");
d.add("g");
d.add("h");
System.out.println(d);
}
}