List系列集合

  • List系列集合
  • 一、List集合特点、 特有API
  • (1)List系列集合特点
  • (2)List集合特有方法
  • (3)总结
  • ①List系列集合特点
  • ②List的实现类的底层原理
  • 二、List集合的遍历方式小结
  • (1)List集合的遍历方式有几种?
  • ArrayList集合的底层原理
  • (1)ArrayList集合的底层原理
  • (2)List集合存储的元素要超过容量怎么办?
  • LinkedList集合的底层原理
  • (1)LinkedList的特点
  • (2)LinkedList集合的特有功能
  • (3)链表的种类


List系列集合

list的索引值 list集合有没有索引_java

一、List集合特点、 特有API

(1)List系列集合特点

●ArrayList、LinekdList :有序,可重复,有索引。
●有序:存储和取出的元素顺序一致
●有索引:可以通过索引操作元素
●可重复:存储的元素可以重复

(2)List集合特有方法

●List集合因为支持索引,所以多了很多索引操作的独特api,其他Collection的功能List也都继承了。

方法名称

说明

void add(int index,E element)

在此集合中的指定位置插入指定的元素

E remove( int index)

删除指定索引处的元素,返回被删除的元素

E set(int index,E element )

修改指定索引处的元素,返回被修改的元素

E get(int index)

返回指定索引处的元素

list的索引值 list集合有没有索引_java_02


list的索引值 list集合有没有索引_list_03

// 1.创建一个ArrayList集合对象:
        // List:有序,可重复,有索引的。
        List<String> list = new ArrayList<>();//多态
        list.add("one");
        list.add("two");
        list.add("three");
        list.add("four");
        list.add("five");
        System.out.println(list);

        // 2.在某个索引位置插入元素。
        list.add(2,"java");
        System.out.println(list);

        // 3.根据索引删除元素,返回被删除元素
        System.out.println(list.remove(2));
        System.out.println(list);

        // 4. 根据索引获取元素:public E get(int index): 返回集合中指定位置的元素。
        System.out.println(list.get(2));

        // 5. 修改索引位置处的元素: public E set(int index, E element)
        //返回修改前的数据
        System.out.println(list.set(1,"1"));
        System.out.println(list);
(3)总结
①List系列集合特点

●ArrayList、LinekdList :有序,可重复,有索引。

②List的实现类的底层原理

●ArrayList底层 是基于数组实现的,根据查询元素快,增删相对慢。
●LinkedList底 层基于双链表实现的,查询元素慢,增删首尾元素是非常快的。

二、List集合的遍历方式小结

(1)List集合的遍历方式有几种?

①迭代器
②增强for循环
③Lambda表达式
④for循环 (因为List集合存在索引)

list的索引值 list集合有没有索引_idea_04


list的索引值 list集合有没有索引_java_05

List<String> list = new ArrayList<>();//多态
        list.add("one");
        list.add("two");
        list.add("three");
        list.add("four");
        list.add("five");

        //(1)for循环
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }

        //(2)迭代器
        System.out.println("--------------------");
        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String ele = it.next();
            System.out.println(ele);
        }

        //(3)foreach
        System.out.println("--------------------");
        for (String ele : list) {
            System.out.println(ele);
        }

        //(4)JDK 1.8 开始以后的Lambda表达式
        System.out.println("--------------------");
        list.forEach(s -> {
            System.out.println(s);
        });

ArrayList集合的底层原理

(1)ArrayList集合的底层原理

●ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
●第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。

List<String> list = new ArrayList<>();
list.add("a");

list的索引值 list集合有没有索引_学习_06


list的索引值 list集合有没有索引_java_07


list的索引值 list集合有没有索引_list_08


size既是元素个数,也是下一个插入元素的位置

(2)List集合存储的元素要超过容量怎么办?

list的索引值 list集合有没有索引_list_09

一旦元素的个数超过了10,会按照1.5倍扩容,把元素重新迁移

LinkedList集合的底层原理

(1)LinkedList的特点

●底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。

(2)LinkedList集合的特有功能

方法名称

说明

public void addFirst(E e)

在该列表开头插入指定的元素

public void addLast(E e)

将指定的元素追加到此列表的末尾

public E getFirst()

返回此列表中的第一个元素

public E getLast( )

返回此列表中的最后一个元素

public E removeFirst()

从此列表中删除并返回第一个元素

public E removeLast( )

从此列表中删除并返回最后一个元素

list的索引值 list集合有没有索引_list的索引值_10


list的索引值 list集合有没有索引_list的索引值_11

// LinkedList 可以完成队列结构,和栈结构(双链表)
        //栈
        LinkedList<String> stack = new LinkedList<>();
        //压栈,入栈
//        stack.addFirst( "第1颗子弹");
//        stack.addFirst( "第2颗子弹");
//        stack.addFirst( "第3颗子弹");
//        stack.addFirst( "第4颗子弹");
        stack.push( "第1颗子弹");
        stack.push( "第2颗子弹");
        stack.push( "第3颗子弹");
        stack.push( "第4颗子弹");
        //这两种方法均可,但push更专业
        System.out.println(stack);

        //出栈,弹栈
//        System.out.println(stack.removeFirst());
//        System.out.println(stack.removeFirst());
//        System.out.println(stack.removeFirst());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        //这两种方法均可,但pop更专业
        System.out.println(stack);

        //队列
        LinkedList<String> queue = new LinkedList<>();
        queue.addLast("1号");
        queue.addLast("2号");
        queue.addLast("3号");
        queue.addLast("4号");
        System.out.println(queue);
        //出队
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue);
(3)链表的种类

list的索引值 list集合有没有索引_list的索引值_12