27.List接口--ArrayList\LinkedList\Vector

List接口及常用方法

在这里插入图片描述
在这里插入图片描述
List接口实现的常用方法测试

package com.senior.collectionuse;

import org.junit.Test;

import java.util.*;

/**
 * @author eden
 * @Description
 * @create projectTest-com.senior.collectionuse:2021-05-12-15:09
 * @since 
 */
public class ListInterface {

    @Test
    public void arrayListTest() {
        ArrayList arrayList = new ArrayList();
        arrayList.add(123);
        arrayList.add(452);
        arrayList.add("hello");
        arrayList.add(567);
        arrayList.add(567);
        System.out.println(arrayList);
        //添加元素到指定位置
        arrayList.add(1, "world");
        System.out.println(arrayList);

        Collection coll = new ArrayList();
        coll.add("eden");
        coll.add("jjjj");
        //添加一个collection实现类的所有元素到指定位置
        System.out.println(arrayList.addAll(arrayList.size() - 2, coll));
        System.out.println(arrayList);

        //Arrays.asList()生成一个list对象
        List<Integer> integers = Arrays.asList(1, 2, 3);
        arrayList.addAll(arrayList.size(), integers);
        System.out.println(arrayList);

        //获取指定索引位置的元素,返回的是Object类
        System.out.println(arrayList.get(3));
        //obj首次出现的索引位置
        System.out.println(arrayList.indexOf(567));
        //obj最后一次出现的索引位置
        System.out.println(arrayList.lastIndexOf(567));

        System.out.println(arrayList.set(1, "AAA"));//world,注:返回被替换的元素
        System.out.println(arrayList);

        //subList返回一个新的提取出来的list,并不会覆盖原有的
        System.out.println(arrayList.subList(2, 4));//[452, hello]
        System.out.println(arrayList);//[123, AAA, 452, hello, eden, jjjj, 567, 567, 1, 2, 3]

        //遍历
        //方式一
        Iterator iterator = arrayList.iterator();
        while(iterator.hasNext())
        {
            System.out.println(iterator.next());
        }
        //方式二:
        for (Object arr: arrayList) {
            System.out.println(arr);
        }

    }
}


ArrayList源码分析

jdk7和jdk8略有不同(jdk11另说)

JDK7的版本下:

  • ArrayList arrayList = new ArrayList();底层创建了长度为10的数组
  • 默认情况下会扩容为原来容量的1.5倍

JDK8版本下:

  • ArrayList arrayList = new ArrayList();底层初始化为{},并未创建长度为10的数组
  • JDK7数组的创建类似于单例设计模式的饿汉模式,而JDK8则类似于懒汉模式,JDK11亦如此
LinkedList源码分析(JDK8):
  • LinkedList linkedList = new LinkedList();//LinkedList内部定义了Node类,
  • 用来表示节点,Node定义为:
  • private static class Node<E> {
      E item;
      Node<E> next;
      Node<E> prev;
    
      Node(Node<E> prev, E element, Node<E> next) {
          this.item = element;
          this.next = next;
          this.prev = prev;
      }
     }
    
Vector源码分析(JDK11):
  • 初始化默认创建长度为10的数组
  • 扩容方式与ArrayList不同,需要扩容是如果手动给出了扩容增量capacityIncrement,那么每次就按照这个增量capacityIncrement扩容,否则就扩容为原来的2倍
ArrayList\LinkedList\Vector三者的异同点?
  • 同:三个类都是List接口的实现类,存放的数据都是有序且可以重复的,并且可以动态扩容
  • 不同:ArrayList线程不安全,效率高;Vector线程安全,效率低。LinkedList底层使用双向链表存储,对于频繁的插入删除操作使用这类容器,效率较高。ArrayList和Vector底层使用数组存储。
    在这里插入图片描述

该博客图片来源于尚硅谷宋老师教学课件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值