Collection子接口之一:list接口

在List集合中

  • 允许存在重复元素
  • 允许null元素的存在 并且可以存储多个null
  • list 是有序集合 (有序:存入顺序和遍历顺序一致)
  • 可以通过索引来精确控制集合中的元素 并且索引是从0开始
  • 通过get(int index) 获取元素的时候 如果超出了列表的长度 则会出现异常 IndexOutOfBoundsException
  • JDK API 中 List 接口的实现类常用的有: ArrayList、 LinkedList 和 Vector。

List的常用方法:

void add(int index, Object ele):  在index位置插入ele元素
boolean addAll(int index, Collection eles):  从index位置开始将eles中的所有元素添加进来
Object get(int index):  获取指定index位置的元素
int indexOf(Object obj):  返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):  返回obj在当前集合中末次出现的位置
Object remove(int index):  移除指定index位置的元素,并返回此元素
Object set(int index, Object ele):  设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex):  返回从fromIndex到toIndex位置的子集合

List实现类之一:ArrayList

  • ArrayList 是 List 接口的典型实现类、主要实现类
  • ArrayList 本质是:Object类型的数组
  • ArrayList 该实现不是线程安全的
  • 当列表初始容量满的时候 则会自动扩容 按照初始容量的1.5倍进行扩充
  • ArrayList的JDK1.8之前与之后的实现区别?
    • JDK1.7: ArrayList像饿汉式,直接创建一个初始容量为10的数组
    • JDK1.8: ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创建一个始容量为10的数组

常见面试题

public class ArrayListTest {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        updateList(list);
        System.out.println(list);  //输出 [1, 2]
    }

    private static void updateList(List list) {
        list.remove(2);
    }
}

实现 List 的逆序遍历,前提是必先正序遍历

public class ArrayListTest {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("AAA");
        list.add("BBB");
        list.add("EEE");
        list.add("DDD");
        list.add("CCC");

        //获取特有的迭代器
        ListIterator iterator = list.listIterator();
        //正序遍历
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("------------------");
        //逆序
        while (iterator.hasPrevious()){
            System.out.println(iterator.previous());
        }
    }
}

List实现类之二:LinkedList

  • 对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高
  • 新增方法:
    • void addFirst(Object obj)
    • void addLast(Object obj)
    • Object getFirst()
    • Object getLast()
    • Object removeFirst()
    • Object removeLast()
public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.add("AAA");
        list.add("BBB");
        list.add("EEE");
        list.add("DDD");
        list.add("CCC");

        list.addFirst(1111); //将当前元素增加到链表头
        list.addLast(2222); //将当前元素增加到链表尾
        System.out.println(list.getFirst()); //获取头元素
        System.out.println(list.getLast()); //获取尾元素
        
        list.removeFirst();//移除头元素
        list.removeLast();//移除尾元素
        //获取迭代器
        Iterator iterator = list.listIterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

List实现类之三:Vector

  • Vector是线程安全的
  • 在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList; Vector总是比ArrayList慢,所以尽量避免使用。
  • 新增方法:
    • void addElement(Object obj)
    • void insertElementAt(Object obj,int index)
    • void setElementAt(Object obj,int index)
    • void removeElement(Object obj)
    • void removeAllElements()

常见面试题:ArrayList/LinkedList/Vector的异同?

  • ArrayList 和 LinkedList 的异同:
    • 二者都线程不安全,相对线程安全的 Vector,执行效率高。
    • ArrayList 是实现了基于动态数组的数据结构, LinkedList 基于链表的数据结构。
    • 对于随机访问get和set, ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add(特指插入)和remove, LinkedList比较占优势,因为ArrayList要移动数据。
  • ArrayList 和 Vector 的区别:
    • Vector 和 ArrayList 几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类。因此开销就比 ArrayList 要大,访问要慢。
    • 正常情况下,大多数的Java程序员使用 ArrayList 而不是 Vector ,因为同步完全可以由程序员自己来控制。 Vector 每次扩容请求其大小的2倍空间,而ArrayList 是1.5倍。 Vector 还有一个子类 Stack。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值