LinkedList和ArrayList

List介绍

List是一个接口,继承了Collection。
List的两个最重要的子类分别是LinkedList和ArrayList。

ArrayList

基本概念

ArrayList的底层是一个长度可以动态增长的object数组,并且实现了三个没有方法的接口,RandomAccess、Cloneable、java.io.Serializable。
在JDK中默认的构造函数容量是0,在这里插入图片描述

ArrayList常用方法及其源码

  1. add方法。
    源码:
    底层是一个可以动态增长的数组,默认容量是0,所以第一次调用add时,就要进行扩容。扩容源码在这里插入图片描述
    底层容量进行扩容,每次扩容都进行>>2,即扩容百分之50;在这里插入图片描述
    如果不够,那就直接把最小要求容量进行赋值。
    在这里插入图片描述
    同时size的值也要进行更新。在这里插入图片描述
    把元素赋给elementData(size)=e,size++。
    使用:
    **********!list默认不指定泛型时,存进去的对象都是object
ArrayList list=new ArrayList();
list.add(67);//向末尾增加元素 但是这里的67不是基本类型!!!
list.add(2,50);//向下表为2的地址增加元素
list.add(new Integet(50));

ArrayList list1=new ArrayList();
list1.add(45);
list1.add(54);
list1.add(45);

list.addAll(list1);//将list1的元素全部加到list的末尾。
  1. get方法
    源码:
    先进性范围判断。(E 指的是泛型,在创建类的时候设置的)在这里插入图片描述
    然后返回在这里插入图片描述
    使用:
Object obj=list.get(2);
int elem=(int) list.get(2);
  1. Iterator-----迭代器
    Iterator是一个接口,new了一个Itr对象。详细使用请见https://editor.youkuaiyun.com/md/?articleId=116155312 有详细描述。

  2. set();------修改方法

list.set(1,52);
  1. remove();----删除
    list.clean();-----全部清空
    list.remove(new Integer(89));------按内容删
    list.remove(2);--------按索引删

ArrayList的遍历

一共有三种方法。

  1. 使用for循环遍历
for(int i=0;i<list.size;i++){
	int elem=list.get(i);
	System.out.println(elem);
}
  1. 使用foreach循环
for(Object elem:list){
	System.out.println(elem);
}
  1. 使用迭代器遍历
Iterator it=list.iterator();
while(it.hasNext()){
	int elem=(int) it.next();
	System.out.println(elem);
}

LinkedList

底层存储结构发生变化

LinkedList的底层存储结构不再是数组,而是双向链表。

功能底层实现变了

LinkedList的增加删除操作效率比ArrayList效率高的高。只用修改前后的指针就可,而ArrayList需要大量移动元素。但是ArrayList按照索引查找效率比Linked List高,ArrayList直接计算即可,而Linked List需要一个个遍历下来数数。

到底是使用ArrayList还是LinkedList

如果按照索引查询多的,则采用ArrayList;若删除添加操作多的则采用LinkedList。

LinkedList相比ArrayList提供了更多的方法

public class LinkedList Deque-----双管队列 可以当作栈也可以当作队列
implements List, Deque, Cloneable, java.io.Serializable 实现了多个接口

推荐向上转型,提高代码利用率

List list=new ArrayList();

linkedList源码

因为实现Deque,所以除了可以作为线性表,还可以当作队列和栈使用。
当用栈的时候,在这里插入图片描述

		//栈
        //public class Stack<E> extends Vector<E> 已经过时
        Stack stack=new Stack();
        //双端队列 :可以作为栈来使用push()入栈 pop()出栈 peek()获取栈顶元素
        Deque deque;//实现类 ArrayDeque 底层是数组 LinkedList 底层是链表

        //模拟摞盘子---栈
        Deque<String> deque1=new LinkedList();
        deque1.push("盘子1");
        deque1.push("盘子2");
        System.out.println(deque1.peek());
        deque1.push("盘子3");
        while (!deque1.isEmpty()){
            String s=deque1.pop();
            System.out.println(s);
		}

结果在这里插入图片描述
用队列的时

//队列
        Queue queue;//实现类 ArrayDeque 底层是数组 LinkedList 底层是链表

        //模拟摞盘子---队列
        queue=new LinkedList();
        queue.offer("盘子5");
        queue.offer("盘子4");
        System.out.println(queue.peek());
        queue.offer("盘子7");
        while (!queue.isEmpty()){
            String s= (String) queue.remove();
            System.out.println(s);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值