List集合子类
List集合常用子类:ArrayList、LinkedList,使用时都需要导包
- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层数据结构是链表,查询慢,增删快
1.分别使用ArrayList和LinkedList完成存储字符串并遍历
package com.gather.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
public class ListDemo05 {
public static void main(String[] args) {
//创建集合对象
ArrayList<String> array=new ArrayList<String>();
array.add("hello");
array.add("world");
array.add("java");
//遍历
//增强for循环
for(String s:array){
System.out.println(s);
}
System.out.println("========================");
LinkedList<String> linkedList=new LinkedList<String>();
linkedList.add("hello");
linkedList.add("world");
linkedList.add("java");
for (String s:linkedList){
System.out.println(s);
}
}
}
2.案例:ArrayList集合存储学生对象使用三种方式遍历
package com.gather.list.example;
import java.util.ArrayList;
import java.util.Iterator;
public class ListDemo03 {
public static void main(String[] args) {
ArrayList<Student> array = new ArrayList<Student>();
Student s1 = new Student("郝佳乐", 20);
Student s2 = new Student("张三", 18);
Student s3 = new Student("李四", 22);
array.add(s1);
array.add(s2);
array.add(s3);
//迭代器方式遍历
Iterator<Student> it = array.iterator();
while (it.hasNext()) {
Student s = it.next();
System.out.println(s.getName() + "," + s.getAge());
}
System.out.println("=====================");
//普通for的方式
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
System.out.println(s.getName() + "," + s.getAge());
}
System.out.println("======================");
//增强for的方式
for (Student s:array){
System.out.println(s.getName() + "," + s.getAge());
}
}
}
ArrayList源码分析如下:
1、空参构造创建对象时,底层会创建一个名为elementData的数组,长度为0
2、添加第一个元素时,底层会经过一系列的判断,调用grow方法完成第一次扩容,将数组elementData长度扩容为10
3、当10个元素存满了,底层会经过一系列的判断,再次调用grow方法完成扩容,将数组elementData长度扩容为旧容量的1.5
4、如果一次存多个元素,扩容1.5倍也存不下,则数组elementData的扩容以实际为准
3.LinkedList集合的特有功能
-
public void addFirst(E e):在该列表开头插入指定的元素
-
public void addLast(E e):将指定的元素追加到此列表的末尾
package com.gather.list; import java.util.LinkedList; //LinkedList特有功能 public class ListDemo06 { public static void main(String[] args) { LinkedList<String> linkedList=new LinkedList<String>(); linkedList.add("hello"); linkedList.add("world"); linkedList.add("java"); linkedList.addFirst("javaee"); linkedList.addLast("javase"); System.out.println(linkedList); } }
-
public E getFirst():返回此列表中的第一个元素
-
public E getLast():返回此列表中的最后一个元素
package com.gather.list; import java.util.LinkedList; public class ListDemo06 { public static void main(String[] args) { LinkedList<String> linkedList=new LinkedList<String>(); linkedList.add("hello"); linkedList.add("world"); linkedList.add("java"); System.out.println(linkedList.getFirst()); System.out.println(linkedList.getLast()); System.out.println(linkedList); } }
-
public E removeFirst():从此列表中删除并返回第一个元素
-
public E removeLast():从此列表中删除并返回最后一个元素
package com.gather.list; import java.util.LinkedList; public class ListDemo06 { public static void main(String[] args) { LinkedList<String> linkedList=new LinkedList<String>(); linkedList.add("hello"); linkedList.add("world"); linkedList.add("java"); System.out.println(linkedList.removeFirst()); System.out.println(linkedList.removeLast()); System.out.println(linkedList); } }
4.LinkedList集合的应用场景
-
设计队列
队列:两端开口,特点是先进先出(排队)
从队列后端入队列:addLast方法
从队列前端出队列:removeFirst方法 -
设计栈
栈:顶端开口的结构,特点是先进后出(弹匣)
进栈/压栈:push方法(底层封装了addFirst方法)
出栈/弹栈:pop方法底(底层封装了removeFirst方法)
public class Demo {
public static void main(String[] args) {
LinkedList<String> queue = new LinkedList<>();
queue.addLast("第1位顾客");
queue.addLast("第2位顾客");
queue.addLast("第3位顾客");
queue.addLast("第4位顾客");
System.out.println(queue);
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
System.out.println("---------");
LinkedList<String> stack = new LinkedList<>();
stack.push("第1颗子弹");
stack.push("第2颗子弹");
stack.push("第3颗子弹");
stack.push("第4颗子弹");
System.out.println(stack);
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack);
}
}