特点
有序,可重复,有索引。
LIst集合的特有方法
/*
* 目标:掌握List系列集合的特点,以及其提供的特有方法
* */
import java.util.ArrayList;
import java.util.List;
public class ListTest1 {
public static void main(String[] args) {
//1.创建一个ArrayList集合对象(有序、可重复、有索引)
List<String> list = new ArrayList<>(); //经典代码,将来ArrayList是用的最多的 是一种多态的写法
//List是一个接口肯定不能new一个List类,要new一个ArrayList实现类
list.add("蜘蛛精");
list.add("至尊宝");
list.add("至尊宝");
list.add("牛夫人");
System.out.println(list);
//2.public void add(int index,E element):在某个索引位置插入元素。
list.add(2,"紫霞仙子");
list.add(4,"铁扇公主");
System.out.println(list);
//3.public E remove(int index):根据索引删除元素,返回被删除元素
System.out.println(list.remove(5));
System.out.println(list);
//4.public E get(int index): 返回集合中指定位置的元素。
System.out.println(list.get(2));
System.out.println(list);
//5.public E set(int index,E element):修改案引位置处的元系,修改成功后,会返回原来的数据
System.out.println(list.set(3, "牛魔王"));
System.out.println(list);
}
}
List集合支持的遍历方法
- for循环(因为List集合有索引)
- 迭代器
- 增强for循环
- Lambda表达式
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("糖宝");
list.add("蜘蛛精");
list.add("至尊宝");
//1.for循环
for (int i = 0; i < list.size(); i++) {
//i = 0 ,1 ,2
String s = list.get(i);
System.out.println(s);
}
System.out.println("-----------------------------------");
//2.迭代器
Iterator<String> it = list.iterator();//list调用iterator方法,会获得一个迭代器对象
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("-----------------------------------");
//3.增强for(foreach遍历 不是forEach方法)
for (String s : list) {
//会依次让s变量等于第一个、第二个、第三个数据
System.out.println(s);
}
System.out.println("-----------------------------------");
//4.JDK 1.8 开始之后的Lambda表达式
list.forEach(s -> {
System.out.println(s);
});
}
}
ArrayList集合的底层原理
1.底层原理
基于数组实现的
数组:是连续区域,并且会把这一块连续区域分割成若干的相等的小区域,每块区域都有自己的索引,每块区域都是装自己的数据的。
2.适合的应用场景
LinkedList集合的底层原理
是基于双链表实现的
什么是链表?有什么特点?
链表就是由一个一个的结点组成的,结点在内存中不是连续存储的,和数组不一样;链表的数据是分散存储的,链表的每个结点除了会包含数据值之外还会包含下一个结点的地址信息,通过这个地址信息是可以找到下一个结点的。
应用场景:
(1)可以用来设计队列(先进先出,后进后出):只是在首尾增删元素,用LinkedList来实现很合适。
(2)可以用来设计栈(后进先出,先进后出):只是在首增删元素,用LinkedList来实现很合适。
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
//1.创建一个队列
LinkedList<String> queue = new LinkedList<>();//LinkedList集合就当作队列来看待
//这里就不要用多态写代码了List没有首尾操作的特有方法是LinkedList基于双链表特有的方法
queue.addLast("第一");
queue.addLast("第二");
queue.addLast("第三");
queue.addLast("第四");
System.out.println(queue);
//出队
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
System.out.println("-------------------------------------------");
//2.创建一个栈对象
LinkedList<String> stack = new LinkedList<>();//同理,这里不要用多态
//进栈(push)
/*stack.addFirst("第一颗子弹");
stack.addFirst("第二颗子弹");
stack.addFirst("第三颗子弹");
stack.addFirst("第四颗子弹");
stack.addFirst("第五颗子弹");*/
stack.push("第一颗子弹");
stack.push("第二颗子弹");
stack.push("第三颗子弹");
stack.push("第四颗子弹");
stack.push("第五颗子弹");//push的底层就是addFirst
System.out.println(stack);
//出栈(pop)
System.out.println(stack.removeFirst());
System.out.println(stack.pop());//同理pop底层也就是removeFirst
System.out.println(stack);
}
}