第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)