list为单列结合,继承于collection,有序,可重复,有索引,有以下API:
1.1ArrayList
特点:底层是数组,查询修改快,增加删除慢。
ArrayList的基本操作代码如下:
public class ArrayListDemo {
public static void main(String[] args) {
//1.创建一个集合
List<String> list=new ArrayList<>();
//2.添加元素
list.add("香蕉");
list.add("苹果");
list.add("苹果");
list.add("西瓜");
list.add("橙子");
//打印结果可知list元素中有序且可以重复
System.out.println(list); //[香蕉, 苹果, 苹果, 西瓜, 橙子]
//3.指定位置插入元素
list.add(0,"橘子");
//打印结果可知add会在指定索引插入元素,索引从0开始
System.out.println(list); //[橘子, 香蕉, 苹果, 苹果, 西瓜, 橙子]
//4.删除元素
//通过索引删除,会返回删除的值
System.out.println(list.remove(0)); //橘子
System.out.println(list); //[香蕉, 苹果, 苹果, 西瓜, 橙子]
//5.根据索引修改元素
list.set(1, "芒果");
//6.通过索引获取元素
System.out.println(list.get(1)); //芒果
}
}
1.2ArrayList的五大循环
//list的五大循环
public class ArrayListLoop {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("你");
list.add("一会看我");
list.add("一会看云");
list.add("我觉得");
list.add("你看我时很远");
list.add("你看云时很近");
System.out.println("1.-------------------");
//1.增强for循环,只能遍历
for (String s : list) {
System.out.println(s);
}
System.out.println("2.-------------------");
//2.迭代器循环,可用作删除元素
Iterator<String> iterator=list.iterator();
while (iterator.hasNext()){
String s = iterator.next();
//iterator.remove();
System.out.println(s);
}
System.out.println("3.-------------------");
//3.lambda循环,只能遍历
list.forEach(str-> System.out.println(str));
System.out.println("4.-------------------");
//4.列表迭代器循环,可用作添加元素
ListIterator<String> listIterator= list.listIterator();
while (listIterator.hasNext()){
String s = listIterator.next();
//listIterator.add("很远很远");
System.out.println(s);
}
System.out.println("5.-------------------");
//5.普通for循环,可操作索引
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
1.3ArrayList的底层原理
1.底层为数组
2.利用空参构造的集合,在底层创建一个默认长度为0的数组
3.添加第一个元素是,底层会创建一个新的长度为10的数组
4.当超过容量时,会扩容为原来的1.5倍。
5.如果添加的元素过多,超过了1.5倍的扩容,则创建的数组长度以实际长度为标准。
1.4LinkedList
特点:底层的数据结构是双向链表,查询修改慢,增加删除快。
LinkedList的基本操作如下:
public class LinkedListDemo {
public static void main(String[] args) {
//1.定义一个集合
LinkedList<String> list=new LinkedList<>();
//2.在头部添加元素
list.addFirst("a");
list.addFirst("b");
list.addFirst("c");
//3.在尾部添加元素
list.addLast("d");
list.addLast("e");
list.addLast("f");
//4.获取头部元素
System.out.println(list.getFirst()); //c
//5.获取尾部元素
System.out.println(list.getLast()); //f
//6.删除头部元素
System.out.println(list.removeFirst()); //c
//7.删除尾部元素
System.out.println(list.removeLast()); //f
}
}
1.5LinkedList的五大循环
//LinkedList的五大循环
public class LinkedListLoop {
public static void main(String[] args) {
//1.定义一个集合
LinkedList<Integer> list=new LinkedList<>();
//2.添加元素
list.addLast(1);
list.addLast(2);
list.addLast(3);
list.addLast(4);
list.addLast(5);
System.out.println("--------1.--------");
//3.for循环
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
System.out.println("--------2.--------");
//4.增强for循环
for (Integer integer : list) {
System.out.print(integer+" ");
}
System.out.println();
System.out.println("--------3.--------");
//5.lambda循环
list.forEach(i-> System.out.print(i+" "));
System.out.println();
System.out.println("--------4.--------");
//6.迭代器循环
Iterator<Integer> iterator= list.iterator();
while (iterator.hasNext()){
Integer i = iterator.next();
System.out.print(i+" ");
}
System.out.println();
System.out.println("--------5.--------");
//7.列表迭代器遍历
ListIterator<Integer> listIterator = list.listIterator();
while (listIterator.hasNext()){
Integer i = listIterator.next();
System.out.print(i+" ");
}
}
}
1.6LinkedList的底层原理
由于底层采用的双向链表,无需扩容。
1.7Vector(已经淘汰)
vector和ArrayList很像,底层都是数组,但是vector是线程安全的,大多数方法使用了synchronized关键字,扩容机制是两倍。