Java筑基24-集合02-List

目录

一、List

List接口

List常用方法

List的三种遍历方式

List排序练习

1.ArrayList

ArrayList注意事项

ArrayList源码分析

2.Vector

Vector介绍

Vector源码分析

ArrayList和Vector比较

3.LinkedList

LinkedList介绍

模拟双向链表

LinkedList源码分析

ArrayList和LinkedList比较


一、List

List接口

/**
 * @author: 程序员飞扬
 * @description:
 */
public class List_ {
    public static void main(String[] args) {
        List list = new ArrayList();

        //1. List集合中元素有序(即添加顺序和取出顺序一致)、且可重复
        list.add("tom");
        list.add("jack");
        list.add("alice");
        System.out.println(list);//[tom, jack, alice]

        list.add("jack");
        System.out.println(list);//[tom, jack, alice, jack]

        //2. List集合中的每个元素都有其对应的顺序索引,即支持索引
        System.out.println(list.get(0));//tom

    }
}

List常用方法

/**
 * @author: 程序员飞扬
 * @description:
 */
public class ListMethod {
    public static void main(String[] args) {
        List list = new ArrayList();

        //增(单元素)
        list.add("张三丰");
        list.add("洪七公");
        list.add(1,"黄老邪");
        System.out.println(list);//[张三丰, 黄老邪, 洪七公]
        //增(多元素)
        List list2 = new ArrayList();
        list2.add("rose");
        list2.add("jack");
        list.addAll(1,list2);
        System.out.println(list);//[张三丰, rose, jack, 黄老邪, 洪七公]

        //返回指定元素首次出现的索引
        int jack = list.indexOf("jack");
        System.out.println(jack);
        //返回元素末次出现的索引
        list.add(4,"jack");
        int jack1 = list.lastIndexOf("jack");
        System.out.println(jack1);

        //删(指定元素)
        System.out.println(list);//[张三丰, rose, jack, 黄老邪, jack, 洪七公]
        list.remove("洪七公");
        System.out.println(list);//[张三丰, rose, jack, 黄老邪, jack]
        //删(指定索引处的元素)
        list.remove(4);
        System.out.println(list);//[张三丰, rose, jack, 黄老邪]

        //改(指定索引处的元素)
        list.set(0, "张无忌");
        System.out.println(list);//[张无忌, rose, jack, 黄老邪]

        //查(指定索引处的元素)
        Object o = list.get(0);
        System.out.println(o);//张无忌

        //取子集合(指定索引,含左不含右)
        System.out.println(list);//[张无忌, rose, jack, 黄老邪]
        List list1 = list.subList(0, 2);
        System.out.println(list1);//[张无忌, rose]

    }
}

List的三种遍历方式

List排序练习

/**
 * @author: 程序员飞扬
 * @description:将list集合按指定元素大小排序
 */
public class ListExercise02 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Book3("红楼梦",99));
        list.add(new Book3("三国",48));
        list.add(new Book3("西游记",66));
        list.add(new Book3("水浒传",28));
        System.out.println("=========排序前==========");
        for (Object o : list) {
            System.out.println(o);
        }

        sort(list);
        System.out.println("=========排序后==========");
        for (Object o : list) {
            System.out.println(o);
        }
    }

    //冒泡排序
    public static void sort(List list){
        int size = list.size();
        for (int i = 0; i < size-1; i++) {
            for (int j = 0; j < size-1-i; j++) {
                Book3 book3 = (Book3)list.get(j);
                Book3 book32 = (Book3)list.get(j+1);
                if(book3.getPrice()>book32.getPrice()){
                    list.set(j,book32);
                    list.set(j+1,book3);
                }
            }
        }
    }
}

class Book3{
    private String name;
    private double price;

    public Book3(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "名称:" + name + "\t" + "价格:" + price;
    }
}

输出:

=========排序前==========

名称:红楼梦 价格:99.0

名称:三国 价格:48.0

名称:西游记 价格:66.0

名称:水浒传 价格:28.0

=========排序后==========

名称:水浒传 价格:28.0

名称:三国 价格:48.0

名称:西游记 价格:66.0

名称:红楼梦 价格:99.0

1.ArrayList

ArrayList注意事项

ArrayList源码分析

ArrayList底层结构和源码分析:

分析案例:

1)不指定大小

ArrayList list = new ArrayList();

/**
 * @author: 程序员飞扬
 * @description:
 */
public class ArrayListSource {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();//1. 创建空数组。容积10
        //ArrayList list = new ArrayList(8);
        for (int i = 1; i <= 10 ; i++) {//2. 从第二次循环开始,2~10之间不会再扩容
            list.add(i);
        }
        for (int i = 11; i <= 15 ; i++) {//3. 需要的容积大于10了,执行扩容,此时容积为15(1.5倍扩容机制)
            list.add(i);
        }
        list.add(100);//扩容,此时容积为22
        list.add(200);
        list.add(null);

        for (Object o : list) {
            System.out.println(o);
        }
    }
}

第一步:调用无参构造器,创建空数组

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

第二步:确认是否要扩容,然后再赋值

第三步:

①确定最小容积,第一次扩容为10

private static final int DEFAULT_CAPACITY = 10;

②真正的扩容方法

第四步:调用真正的扩容方法

2)指定大小

ArrayList list = new ArrayList(8);

第一步:调用构造器

下一步,流程与上诉相同,当容积不满足需要时,调用grow方法扩容

2.Vector

Vector介绍

Vector源码分析

第一步:调用构造器,默认容积10

第二步:确认容积大小,判断是否要扩容

如果需要真正的扩容:

ArrayList和Vector比较

3.LinkedList

LinkedList介绍

模拟双向链表

/**
 * @author: 程序员飞扬
 * @description:模拟双向链表
 */
public class LinkedList01 {
    public static void main(String[] args) {
        Node node1 = new Node("唐僧");
        Node node2 = new Node("猴子");
        Node node4 = new Node("老沙");

        //唐僧 -> 猴子 -> 老沙
        node1.next = node2;
        node2.next = node4;

        //老沙 -> 猴子 -> 唐僧
        node4.pre = node2;
        node2.pre = node1;

        Node first = node1;
        Node last = node4;

        //从头到尾遍历
        System.out.println("===从头到尾遍历===");
        while(true){
            if(first == null){
                break;
            }
            System.out.println(first);
            first = first.next;
        }

        System.out.println("===从尾到头遍历====");
        //从尾到头遍历
        while(true){
            if(last == null){
                break;
            }
            System.out.println(last);
            last = last.pre;
        }

        //插入元素
        Node node3 = new Node("八戒");
        node3.next = node4;
        node3.pre = node2;
        node2.next = node3;
        node4.pre = node3;

        //增加元素后从头到尾遍历
        System.out.println("==增加元素后从头到尾遍历===");
        first = node1;
        last = node4;
        while(true){
            if(first == null){
                break;
            }
            System.out.println(first);
            first = first.next;
        }

        System.out.println("===增加元素后从尾到头遍历====");
        //从尾到头遍历
        while(true){
            if(last == null){
                break;
            }
            System.out.println(last);
            last = last.pre;
        }
    }
}

class Node{
    public Object item;
    public Node next;
    public Node pre;

    public Node(Object item) {
        this.item = item;
    }

    public String toString(){
        return "Node name=" + item;
    }
}

输出:

===从头到尾遍历===

Node name=唐僧

Node name=猴子

Node name=老沙

===从尾到头遍历====

Node name=老沙

Node name=猴子

Node name=唐僧

==增加元素后从头到尾遍历===

Node name=唐僧

Node name=猴子

Node name=八戒

Node name=老沙

===增加元素后从尾到头遍历====

Node name=老沙

Node name=八戒

Node name=猴子

Node name=唐僧

LinkedList源码分析

第一步:调用构造器

第二步:执行方法,进入linkLast算法

操作链表的方法重点在具体执行的方法。

/**
 * @author: 程序员飞扬
 * @description:
 */
public class LinkedList02 {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.add(1);
        linkedList.add(2);
        linkedList.add(3);
        linkedList.add("赵灵儿");
        System.out.println(linkedList);

        linkedList.removeFirst();
        linkedList.remove(0);
        linkedList.remove(new Integer(3));
        linkedList.remove("赵灵儿");
        System.out.println(linkedList);


        linkedList.add("赵灵儿");
        System.out.println(linkedList);
        linkedList.set(0,"李逍遥");
        System.out.println(linkedList);

        Object o = linkedList.get(0);
        System.out.println(o);


    }
}

ArrayList和LinkedList比较

List集合选择

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员飞扬

赠人玫瑰,手有余香,感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值