第29 章 : List集合
125 List接口简介
允许保存重复数据
List新的方法
E get(int index);
E set(int index, E element);
ListIterator listIterator();
三个常用子类
ArrayList 90%
Vector 8%
LinkedList 2%
定义
public class ArrayList
extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
public class Vector
extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
public class LinkedList
extends AbstractSequentialList
implements List, Deque, 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 list = new ArrayList();
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 list = new ArrayList();
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 list = new LinkedList();
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 list = new Vector();
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)