java中ArrayList、LinkedList和Vector

Java集合在这里插入图片描述

list常用方法

A:添加功能
boolean add(E e):向集合中添加一个元素
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):向集合中添加一个集合的元素。

B:删除功能
void clear():删除集合中的所有元素
E remove(int index):根据指定索引删除元素,并把删除的元素返回
boolean remove(Object o):从集合中删除指定的元素
boolean removeAll(Collection<?> c):从集合中删除一个指定的集合元素。

C:修改功能
E set(int index, E element):把指定索引位置的元素修改为指定的值,返回修改前的值。

D:获取功能
E get(int index):获取指定位置的元素
Iterator iterator():就是用来获取集合中每一个元素。

E:判断功能
boolean isEmpty():判断集合是否为空。
boolean contains(Object o):判断集合中是否存在指定的元素。
boolean containsAll(Collection<?> c):判断集合中是否存在指定的一个集合中的元素。

F:长度功能
int size():获取集合中的元素个数

G:把集合转换成数组
Object[] toArray():把集合变成数组。

1. Vector

Vector,来源JDK1.0 线程安全,效率低
底层是Object类型的数组,初始容量10,扩容是原集合的2倍。

2.ArrayList
ArrayListJDK1.2新增 ,底层是Object类型的数组,初始容量10,每次扩容是原数组的1.5倍 线程不安全,有序。可以插入null。
在JDK1.7当中,当第一个元素添加时,ensureCapacityInternal()方法会计算ArrayList的扩容大小,默认为10;

ArrayList 相关操作

public class ArrayListTest {
    public static void main(String[] agrs){
        //创建ArrayList集合:
        List<String> list = new ArrayList<String>();
        System.out.println("ArrayList集合初始化容量:"+list.size());

        //添加功能:
        list.add("Hello");
        list.add("world");
        list.add(2,"!");
        System.out.println("ArrayList当前容量:"+list.size());

        //修改功能:
        list.set(0,"my");
        list.set(1,"name");
        System.out.println("ArrayList当前内容:"+list.toString());

        //获取功能:
        String element = list.get(0);
        System.out.println(element);

        //迭代器遍历集合:(ArrayList实际的跌倒器是Itr对象)
        Iterator<String> iterator =  list.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }

        //for循环迭代集合:
        for(String str:list){
            System.out.println(str);
        }

        //判断功能:
        boolean isEmpty = list.isEmpty();
        boolean isContain = list.contains("my");

        //长度功能:
        int size = list.size();

        //把集合转换成数组:
        String[] strArray = list.toArray(new String[]{});

        //删除功能:
        list.remove(0);
        list.remove("world");
        list.clear();
        System.out.println("ArrayList当前容量:"+list.size());
    }
}

3.LinkedList
LinkedList 线程也是不安全的,数据结构基于双向列表,每个元素Node(next 下一个元素的地址,prev 上一个元素的地址,item 当前元素 ),没有初始化大小,增删修改比Arraylist快,但是查询慢。
执行增删修改操作直接将指针指向新的引用地址,便利时用增强for循环耗时少

双向列表

内部类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;
        }
    }

LinkedList相关操作

public class LinkedListTest {
    public static void main(String[] agrs){
        List<String> linkedList = new LinkedList<String>();
        System.out.println("LinkedList初始容量:"+linkedList.size());

        //添加功能:
        linkedList.add("my");
        linkedList.add("name");
        linkedList.add("is");
        linkedList.add("jiaboyan");
        System.out.println("LinkedList当前容量:"+ linkedList.size());

        //修改功能:
        linkedList.set(0,"hello");
        linkedList.set(1,"world");
        System.out.println("LinkedList当前内容:"+ linkedList.toString());

        //获取功能:
        String element = linkedList.get(0);
        System.out.println(element);

        //遍历集合:(LinkedList实际的跌倒器是ListItr对象)
        Iterator<String> iterator =  linkedList.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }
        //for循环迭代集合:
        for(String str:linkedList){
            System.out.println(str);
        }

        //判断功能:
        boolean isEmpty = linkedList.isEmpty();
        boolean isContains = linkedList.contains("jiaboyan");

        //长度功能:
        int size = linkedList.size();

        //删除功能:
        linkedList.remove(0);
        linkedList.remove("jiaboyan");
        linkedList.clear();
        System.out.println("LinkedList当前容量:" + linkedList.size());
    }
}

4ArrayList创建扩容相关源码

//添加元素e
public boolean add(E e) {
    ensureCapacityInternal(size + 1);
    //将对应角标下的元素赋值为e:
    elementData[size++] = e;
    return true;
}
//得到最小扩容量
private void ensureCapacityInternal(int minCapacity) {
    //如果此时ArrayList是空数组,则将最小扩容大小设置为10:
    if (elementData == EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    //判断是否需要扩容:
    ensureExplicitCapacity(minCapacity);
}
//判断是否需要扩容
private void ensureExplicitCapacity(int minCapacity) {
    //操作数+1
    modCount++;
    //判断最小扩容容量-数组大小是否大于0:
    if (minCapacity - elementData.length > 0)
        //扩容:
        grow(minCapacity);
}
//ArrayList动态扩容的核心方法:
private void grow(int minCapacity) {
    //获取现有数组大小:
    int oldCapacity = elementData.length;
    //位运算,得到新的数组容量大小,为原有的1.5倍:
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    //如果新扩容的大小依旧小于传入的容量值,那么将传入的值设为新容器大小:
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;

    //如果新容器大小,大于ArrayList最大长度:
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        //计算出最大容量值:
        newCapacity = hugeCapacity(minCapacity);
    //数组复制:
    elementData = Arrays.copyOf(elementData, newCapacity);
}
//计算ArrayList最大容量:
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0)
        throw new OutOfMemoryError();
    //如果新的容量大于MAX_ARRAY_SIZE。将会调用hugeCapacity将int的最大值赋给newCapacity:
    return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
}

5 linkedList add 操作
对于LinkedList集合增加元素来说,可以简单的概括为以下几点:

将添加的元素转换为LinkedList的Node对象节点;

增加该Node节点的前后引用,即该Node节点的prev、next属性,让其分别指向哪一个节点);

修改该Node节点的前后Node节点中pre/next属性,使其指向该节点。

在这里插入图片描述

参考文章: javaList集合详解 https://www.jianshu.com/p/63b01b6379fb

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值