Java学习路线-35:List集合

第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)
发布了1392 篇原创文章 · 获赞 347 · 访问量 123万+

猜你喜欢

转载自blog.csdn.net/mouday/article/details/103838107