第29 章 : List集合
125 List接口简介
允许保存重复数据
List新的方法
E get(int index); E set(int index, E element); ListIterator<E> listIterator();
三个常用子类
ArrayList 90% Vector 8% LinkedList 2%
定义
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable
126 ArrayList子类
继承结构
@Iterable -@Collection -@List AbstractCollection(Collection) - AbstractList(List) -ArrayList(List, RandomAccess, Cloneable, java.io.Serializable)
List特征
1、保存顺序就是存储顺序
2、允许有重复数据
JDK >= 1.8 Iterable接口中有forEach方法
import java.util.ArrayList; import java.util.List; class Demo{ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("Hello"); list.add("Hello"); list.add("World"); System.out.println(list); // [Hello, Hello, World] list.forEach((str)->{ System.out.println(str); }); /** * Hello * Hello * World */ System.out.println(list.size()); // 3 System.out.println(list.isEmpty()); // false } }
ArrayList 实际包含一个对象数组
默认使用空数组
添加新元素时,如果长度不够,会开辟一个新的数组
版本不一样实现也不一样
JDK < 1.9 默认使用长度为10的数组
JDK >= 1.9 默认空数组
如果超过10个数据,考虑使用有参构造,避免垃圾数组的产生
127 ArrayList保存自定义类对象
如果需要remove,contains方法,要覆写equals方法
import java.util.ArrayList; import java.util.List; class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (!(obj instanceof Person)) { return false; } Person other = (Person) obj; return this.name.equals(other.name) && this.age == other.age; } } class Demo { public static void main(String[] args) { List<Person> list = new ArrayList<Person>(); list.add(new Person("Tom", 23)); list.add(new Person("Jack", 24)); list.add(new Person("Steve", 25)); System.out.println(list.contains(new Person("Tom", 23))); // true } }
128 LinkedList子类
继承关系
@Iterable -@Collection -@List AbstractCollection(Collection) -AbstractList(List) -AbstractSequentialList -LinkedList(List, Deque, Cloneable, java.io.Serializable)
代码实例
import java.util.LinkedList; import java.util.List; class Demo{ public static void main(String[] args) { List<String> list = new LinkedList<String>(); list.add("Hello"); list.add("Hello"); list.add("World"); System.out.println(list); // [Hello, Hello, World] list.forEach(System.out::println); /** * Hello * Hello * World */ } }
LinkedList和ArrayList接口一致,实现不一样
区别:
ArrayList 数组实现 get查找复杂度为O(1) LinkedList 链表实现 get查找复杂度为O(n)
ArrayList默认初始化大小为10,长度会自动扩容,保存大数据会产生垃圾,这时使用LinkedList
129 Vector子类
Vector和ArrayList继承关系一致
Vector 的方法加了同步处理synchronized ,多线程安全,性能不如ArrayList
import java.util.List; import java.util.Vector; class Demo{ public static void main(String[] args) { List<String> list = new Vector<String>(); list.add("Hello"); list.add("Hello"); list.add("World"); System.out.println(list); // [Hello, Hello, World] list.forEach(System.out::println); /** * Hello * Hello * World */ } }
总结
集合 |
说明 |
ArrayList |
数组实现,读>写 |
Vector |
数组实现,线程安全 |
LinkedList |
链表实现,写>读 |
继承关系
@Iterable -@Collection -@List AbstractCollection(Collection) - AbstractList(List) -ArrayList(List, RandomAccess, Cloneable, java.io.Serializable) -Vector(List, RandomAccess, Cloneable, java.io.Serializable) -AbstractSequentialList -LinkedList(List, Deque, Cloneable, java.io.Serializable)