java集合框架————List接口

1.List接口概述

在实际开发之中,List接口的使用频率可以达到Collection系列的80%。在进行集合处理的时候,优先考虑List接口。

首先来观察List接口中提供的方法,在这个接口中有两个重要的扩充方法 :
在这里插入图片描述

List子接口与Collection接口相比最大的特点在于其有一个get()方法,可以根据索引取得内容。由于List本身还是接口,要想取得接口的实例化对象,就必须有子类,在List接口下有三个常用子类:ArrayList、Vector、LinkedList。

在这里插入图片描述

最终的操作还是以接口为主,所以所有的方法只参考接口中定义的方法即可。

2. ArrayList子类(优先考虑)

ArrayList是一个针对于List接口的数组实现。下面首先利用ArrayList进行List的基本操作。

范例:观察List基本处理。

import java.util.ArrayList;
import java.util.List;
public class TestDemo {
    public static void main(String[] args) {
        // 此时集合里面只保存String类型
        List<String> list = new ArrayList<>() ;
        list.add("Hello") ;
        // 重复数据
        list.add("Hello") ;
        list.add("Bit") ;
        System.out.println(list) ;
       }
 }

通过上述代码我们可以发现,List允许保存重复数据。

范例:观察其他操作

import java.util.ArrayList;
import java.util.List;

public class TestDemo {
    public static void main(String[] args) {
        // 此时集合里面只保存String类型
        List<String> list = new ArrayList<>() ;
        System.out.println(list.size()+"、" + list.isEmpty());
        list.add("Hello") ;
        // 重复数据
        list.add("Hello") ;
        list.add("Bit") ;
        System.out.println(list.size()+"、" + list.isEmpty());
        System.out.println(list) ;
        System.out.println(list.remove("Hello")) ;
        System.out.println(list.contains("ABC")) ;
        System.out.println(list.contains("Bit")) ;
        System.out.println(list);
}
}

List本身有一个好的支持:存在get()方法,可以利用get()方法结合索引取得数据。

范例:List的get()操作

import java.util.ArrayList;
import java.util.List;

public class TestDemo {
    public static void main(String[] args) {
        // 此时集合里面只保存String类型
        List<String> list = new ArrayList<>() ;
        list.add("Hello") ;
        // 重复数据
        list.add("Hello") ;
        list.add("Bit") ;
        for (int i = 0; i < list.size() ; i++) {
        System.out.println(list.get(i)) ; }
    }
}

get()方法是List子接口提供的。如果现在操作的是Collection接口,那么对于此时的数据取出只能够将集合变为对象数组操作。

范例:通过Collection进行输出处理。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class TestDemo {
    public static void main(String[] args) {
        // 此时集合里面只保存String类型
        Collection<String> list = new ArrayList<>() ;
        list.add("Hello") ;
        // 重复数据
        list.add("Hello") ;
        list.add("Bit") ;
        // 操作以Object为主,有可能需要向下转型,就有可能产生ClassCastException
        Object[] result = list.toArray() ;
        System.out.println(Arrays.toString(result)) ;
    }
}

开发中尽量不要使用Collection接口

3.集合与简单Java类

在以后的实际开发中,集合里面保存最多的数据类型,就是简单Java类。

范例:向集合保存简单Java类对象。

在这里插入图片描述

在这里插入图片描述

集合操作简单java类时,对于remove()、contains()方法需要equals()方法支持。

4.旧的子类(Vector) 使用较少

Vector是从JDK1.0提出的,而ArrayList是从JDK1.2提出的。

范例:使用Vector

import java.util.List;
import java.util.Vector;

public class TestDemo {
    public static void main(String[] args) {
        List<String> list = new Vector<>() ;
        list.add("hello") ;
        list.add("hello") ;
        list.add("bit") ;
        System.out.println(list) ;
        list.remove("hello") ;
        System.out.println(list) ;
    }
}

面试题:请解释ArrayList与Vector区别

  1. 历史时间:ArrayList是从JDK1.2提供的,而Vector是从JDK1.0就提供了。
  2. 处理形式:ArrayList是异步处理,性能更高;Vector是同步处理,性能较低。
  3. 数据安全:ArrayList是非线程安全;Vector是性能安全。
  4. 输出形式:ArrayList支持Iterator、ListIterator、foreach;Vector支持Iterator、ListIterator、foreach、Enumeration。

在以后使用的时候优先考虑ArrayList,因为其性能更高,实际开发时很多时候也是每个线程拥有自己独立的集合资源。如果需要考虑同步也可以使用concurrent包提供的工具将ArrayList变为线程安全的集合。

5.LinkedList子类

在List接口中还有一个LinkedList子类,这个子类如果向父接口转型的话,使用形式与之前没有任何区别。

范例:使用LinkedList

import java.util.LinkedList;
import java.util.List;

public class TestDemo {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>() ;
        list.add("hello") ;
        list.add("hello") ;
        list.add("bit") ;
        System.out.println(list) ;
        list.remove("hello") ;
        System.out.println(list) ;
    }
}

面试题:请解释ArrayList与LinkedList区别

  1. 观察ArrayList源码,可以发现ArrayList里面存放的是一个数组,如果实例化此类对象时传入了数组大
    小,则里面保存的数组就会开辟一个定长的数组,但是后面再进行数据保存的时候发现数组个数不够了
    会进行数组动态扩充。 所以在实际开发之中,使用ArrayList最好的做法就是设置初始化大小。
  2. LinkedList:是一个纯粹的链表实现,与之前编写的链表程序的实现基本一样。

总结:ArrayList封装的是数组;LinkedList封装的是链表。ArrayList时间复杂度为1,而LinkedList的复杂度为n。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章