Java之List集合

        List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所以插入删除数据速度慢。

特征:有序列表,允许存放重复的元素,通过索引下标进行取值和删除;(是个接口)

1. List集合下面的实现类

有很多实现类,列举的是比较重要的,开发时用的比较多的

  • ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)

  • LinkedList:双向链表实现,增删快,查询慢 (线程不安全)

  • Vector:数组实现,重量级 (线程安全、使用少)

2. List集合下面的方法

package com.cjw.b_list;
import java.util.ArrayList;
import java.util.List;
public class Demo1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("张三");
        //有序的  可重复的
        System.out.println(list);//[张三, 李四, 王五, 张三]
        list.add(2, "狗蛋");
        System.out.println(list);
        List<String> list1 = new ArrayList<>();
        list1.add("麻子");
        list1.add("赵四");
        list1.add("李武");
        list.addAll(1, list1);
        System.out.println(list);
        System.out.println(list.remove(0));//在删除
        System.out.println(list);//目的是删除以后的集合的数据展示一下
        //[麻子, 赵四, 贝贝, 李四, 狗蛋, 王五, 张三]
        System.out.println(list.set(2, "彩云"));//贝贝
        System.out.println(list);//修改之后的集合
        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
        System.out.println(list.get(3));
        //System.out.println(list.get(89));
        System.out.println(list.indexOf("麻子"));//0
        list.add(2, "张三");
        System.out.println(list.lastIndexOf("张三"));//7
        System.out.println(list);
        List<String> strings = list.subList(3, 5);
        System.out.println(strings);

    }
}

3. 遍历List集合的三种方法

  •  for循环
  • 增强for循环
  • 迭代器

3.1for循环

package com.zjz.b_list;
import java.util.ArrayList;
import java.util.List;
public class Demo2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("张三");
        System.out.println(list);
        for (int i = 0; i < list.size(); i++) {
            //通过索引获取元素
            System.out.println(list.get(i));
        }
    }
}

3.2增强for循环 

package com.zjz.b_list;

import java.util.ArrayList;
import java.util.List;

public class Demo2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("张三");
        System.out.println(list);
        //for循环
//        for (int i = 0; i < list.size(); i++) {
//            //通过索引获取元素
//            System.out.println(list.get(i));
//        }
        增强for循环
        for (String s : list) {
            System.out.println(s);
        }
        //迭代器

    }
}

3.3迭代器

package com.zjz.b_list;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Demo3 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("张三");
        System.out.println(list);
        ListIterator<String> sli = list.listIterator();
        while (sli.hasNext()) {
            System.out.println(sli.next());
        }
        //此时光标已经在最下面了
        while (sli.hasPrevious()) {
            System.out.println(sli.previous());
        }

    }
}

 4. ArrayList

ArrayList底层是数组,可以扩容的。

是构造一个初始容量为10的空列表,超过10以后会自动扩容,扩容1.5倍

ArrayList是按照添加的先后顺序排列,当然,他也提供了sort方法,如果需要对ArrayList进行排序,只需要调用这个方法,提供Comparator比较器即可

(ArrayList的方法和List下面的方法用处一致,开发时够用了)

特征:查询快,增删慢

5. LinkedList

LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素。按照插入的先后顺序排序,不提供sort方法对内部元素排序。

(ArrayList的方法和List下面的方法用处一致,开发时够用了)

6.ArrayList、LinkedList和Vector的区别

ArrayList和Vector 底层是数组,但是Vector是线程安全的,所以效率低,开发中不用Vector

接下来介绍ArrayList和linkedList区别:

1.ArrayList底层是数组 LinkedList底层是双向链表

ArrayList 的特征:

        查询快,底层是索引,有序的通过内存有序地址,直接找到 时间复杂度 O(1)增删慢: 增加数据和删除数据有可能扩容,每次扩1.5倍,扩容的话,浪费内存浪费时间O(n)

LinkedList的特征:

        查询慢: 底层是二分法查找的算法 时间复杂度是log以2为底n的对数        增删快: 直接找前置结点 Node prev和后继结点 Node next 时间复杂度是O(1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值