List集合

一、特点,特有方法

List集合:有序,可重复,有索引

ArrayList集合:有序,可重复,有索引

LinkedList集合:有序,可重复,有索引

ArrayList集合和LinkedList集合底层采用的数据结构(存储,组织数据的方式)不同,应用场景不同

List集合的特有方法

List集合因为支持索引所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了

方法名称说明
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove (int index)删除指定索引处的元素,返回被删除的元素
E  set (int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素
import java.util.ArrayList;
import java.util.List;

public class ConList {
    public static void main(String[] args) {
        //1、void add(int index,E element)	在此集合中的指定位置插入指定的元素
        List<String>list=new ArrayList<>();
        list.add("宋钟基");
        list.add("胡歌");
        list.add("杨幂");
        System.out.println(list);
        list.add(3,"张国荣");
        list.add(0,"陈建斌");
        list.add(1,"宋雨琦");
        list.add(2,"董卿");
        System.out.println(list);
        //2、E remove (int index)	删除指定索引处的元素,返回被删除的元素
        list.remove(1);
        System.out.println(list);
        //3、E set (int index,E element)	修改指定索引处的元素,返回被修改的元素
        System.out.println(list.set(3, "董宇辉"));

        //4、E get(int index)	返回指定索引处的元素
        System.out.println(list.get(1));

    }
}

二、遍历方式

List集合支持的遍历方式

① for循环(因为List集合有索引)

②迭代器

③增强for循环

④Lambda表达式

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;

public class ListBianli {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("花千骨");
        list.add("糖宝");
        list.add("风轻水");
        System.out.println(list);
        //① for循环(因为List集合有索引)
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        //②迭代器
        Iterator <String>  iterator=list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        //③增强for循环
        for (String s : list) {
            System.out.println(s);
        }
        //④Lambda表达式
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        list.forEach( s-> { System.out.println(s); });
    }
}

三、ArrayList集合的底层原理

基于数组实现的

数组的特点:查询快,增删慢

查询速度快(注意:是根据索引查询速度快):查询数据通过索引值和地址值定位,查询任意索引耗时相同

删除效率低:可能需要把后面的很多的数据进行迁移

添加效率极低:可能需要把后面很多的数据后移,再添加元素,或者也可能需要进行数组的扩容

1、ArrayList集合的底层原理

①利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组

②添加一个元素时底层会创建一个新的长度为10的数组

③存满时,会扩容1.5倍

④如果一次添加多个元素,1.5倍还放不下,则新创建的数组的长度以实际为准

特点:查询快,增删慢

ArrayList集合适合的应用场景

1、ArrayList适合:根据索引查询数据,比如根据随机索引取数据(高效)!或者数据量不是很大时。

2、ArrayList不适合:数据量大的同时,又要频繁的进行增删操作。

LinkedList集合的底层原理

*基于双链表实现的

*特点:查询慢,增删相对快但对首尾元素的元素进行增删改查的速度是极快的

1、什么是链表?有啥特点?

链表中的节点是独立的对象,在内存中是不连续的,每个节点包含数据值和下一个节点的地址。

链表的特点:①查询慢,无论查询哪个数据,都要从头开始找②链表增删相对快

单向列表:只能从头节点往后找

双向列表:既可以从头节点往后找,也可以从尾节点往前找。

特点:查询慢,增删相对快,但对首尾元素的元素进行增删改查的速度是极快的

LinkedList新增了:很多首尾操作的特有方法

方法名称说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addList(E  e)将指定的元素追加到此列表的首尾
public E  getFirst()返回此列表中的第一个元素
public E  getLast()返回此列表中的最后一个元素
public   E  removeFirst()从此列表中删除并返回第一个元素
public   E  removeLast()从此列表中删除并返回最后一个元素

LinkedList的应用场景之一:可以用来设计队列

队列的特点:先进先出,后进后出。

只是在首尾增删元素,用LinkedList来实现很合适。

LinkedList的应用场景之二:可以用来设计栈

栈的特点:后进先出,先进后出

数据进入栈模型的过程称为:压/进栈(push)

数据离开栈模型的过程称为:弹/出战(pop)

栈顶元素先出,栈底元素后出

只是首部增删元素,用LinkedList来实现很合适

import java.util.LinkedList;

public class ListTest {
    public static void main(String[] args) {
        //1、创建一个队列
        LinkedList<String> queue=new LinkedList<>();
        queue.addFirst("第一个");
        queue.addFirst("第二个");
        queue.addFirst("第三个");
        queue.addFirst("第四个");
        System.out.println(queue);
        //出队
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        //创建一个栈对象
        LinkedList<String> stack=new LinkedList<>();
        stack.addFirst("第一个");
        stack.addFirst("第二个");
        stack.addFirst("第三个");
        stack.addFirst("第四个");
        System.out.println(stack);
        System.out.println(stack.removeFirst());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值