Java基础(九)

前面的话
博客主页:hyhWTX的博客主页

欢迎关注🖱点赞🎀收藏⭐留言✒

本文由hyhWTX原创,csdn首发!

二十三.List集合

一.List接口

java.util.List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地将实现了List接口的对象称为List集合,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

List接口的特点:

  1. 它是一个元素存有序的集合。例如,存元素的顺序是11、22、33,那么在集合中的元素存储就是按照11、22、33的顺序存储的。
  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
  3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复元素。

源码示例:

package Day12.List;

/**
 * @author hyhWTX
 * @version 1.0
 * @ClassName ArraylistDemo
 * @date 2022年07月08日 13:39
 * @Description: Arraylist集合的特点
 */



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

/**
 * list接口中常有的索引的方法(特有)
 *      public void add(int index. E element): 将指定的元素,添加到该集合中的指定位置上。
 *
 *      public E get (int index):返回集合中指定位置的元索。
 *
 *      public E remove(int index):移除列表中指定位置的元素。返回的是被移除的元素。
 *
 *      public E set(int index,E element):用指定元素昔换集合中指定位置的元素,返回值的更新前的元素。
 *
 * 注意:
 *  操作索引的时候,一定要防止索引越界异常。
 *  IndexOutOfBoundsException: 集合一般情况下会有这个错误
 *  
 *
 */
public class ArraylistDemo {
    public static void main(String[] args) {
        //创建一个list集合
       List<String> list = new ArrayList<>();
       //使用add方法往集合中添加元素
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("a");
        //打印输出集合
        System.out.println(list);//[a, b, c, d, a],不死地址,重写了Srtring方法

        //在c和d之间添加元素
        list.add(3,"666");
        System.out.println(list);
        //移除元素
        String removeEE = list.remove(2);
        System.out.println("移除的元素是:"+removeEE);
        System.out.println(list);


        //替换元素
        String setE = list.set(4, "A");
        System.out.println(list);
        
        //便利list
        //使用普通的循环
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }

        System.out.println("=================");

        //使用迭代器
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
        System.out.println("==================");
        //使用增强for
        for (String s : list) {
            System.out.println(s);
        }

        list.get(5);//IndexOutOfBoundsException: Index: 5,
        //越界异常
    }
}

二.List的子类

ArrayList集合:

java.util.ArrayList集合数据存储的结构是数组结构,元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据,遍历数据,所以ArrayList是最常用的集合。

注意:很多开发时候的对于ArrayList的完成需求的用法是不严谨不被提倡的。

LinkedList集合:

java.util.LinkedList集合数据存储的结构是链表结构,方便元素添加、删除集合。

LinkedList是一个双向链表。
在这里插入图片描述

实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量对于首尾操作的方法,这些方法了解即可。

源码实例:

package Day12.List;

/**
 * @author hyhWTX
 * @version 1.0
 * @ClassName LinkedListDemo
 * @date 2022年07月08日 16:28
 * @Description: LinkedList集合的特点
 */


import java.util.LinkedList;

/**
 * 特点:
 *  1.底层是一个链表结构的,查询慢,增删快
 *  2.里面包含了大量的操作首尾元素的方法
 *  注意:使用LinkedList集合特有的方法,不能使用多态
 *
 *  - public void addFirst(E e):将指定元素插入此列表的开头。
 *  - public void addLast(E e):将指定元素插入此列表的结尾。
 *  - public E getFirst():返回此列表的第一个元素
 * - public E getLast():返回此列表的最后一个元素。。
 * - public E removeFirst():移除并返回此列表的第一个元素。
 *  - public E removeLast():移除并返回此列表的最后一个元素
 * - public E pop():从此列表所表示的堆栈处弹出一个元素。
 * - public void push(E e):将元素推入此列表所表示的堆栈。
 * - public boolean isEmpty():如果列表不包含元素,则返回true
 */

public class LinkedListDemo {
    public static void main(String[] args) {
        show01();
        show02();
        show03();
    }
    private static void show01(){
        //创建LinkedList集合对象
        LinkedList<String> linked = new LinkedList<>();
        //使用add方法向集合中添加元素
        linked.add("a");
        linked.add("b");
        linked.add("c");
        System.out.println(linked);

        //public void addFirst(E e):将指定元素插入此列表的开头。
        //linked.addFirst("www");
        linked.push("www");
        System.out.println(linked);

        // public void addLast(E e):将指定元素插入此列表的结尾。等价于addFirst方法
        linked.addLast("mmm");
        System.out.println(linked);
    }
    // - public E getFirst():返回此列表的第一个元素
    // - public E getLast():返回此列表的最后一个元素。。
    private static void show02() {
        //创建LinkedList集合对象
        LinkedList<String> linked = new LinkedList<>();
        //使用add方法向集合中添加元素
        linked.add("a");
        linked.add("b");
        linked.add("c");

        //linked.clear();//清空元素,NoSuchElementException会报列表为空的异常
        if (!linked.isEmpty()) {//判断列表是否为空,为空不执行,不为空执行
            String first = linked.getFirst();
            System.out.println(first);
            String last = linked.getLast();
            System.out.println(last);
        }
    }
    private static void show03() {
        //创建LinkedList集合对象
        LinkedList<String> linked = new LinkedList<>();
        //使用add方法向集合中添加元素
        linked.add("a");
        linked.add("b");
        linked.add("c");
        System.out.println(linked);
        String f = linked.removeFirst();
        System.out.println("移除的第一个元素为:"+f);
        String last = linked.removeLast();
        System.out.println("移除的最后一个元素为:"+last);
        System.out.println(linked);
    }
}

Vector集合

  • public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, Serializable
    

    Vector类实现了可扩展的对象数组。像数组一样,它包含可以使用整数索引访问的组件。但是, Vector的大小可以根据需要增长或缩小,以适应在创建Vector之后添加和删除项目。

    每个向量尝试通过维护capacitycapacityIncrement优化存储capacityIncrementcapacity总是至少与矢量大小一样大; 通常较大,因为当向量中添加组分时,向量的存储空间大小capacityIncrement 。 应用程序可以在插入大量组件之前增加向量的容量; 这减少了增量重新分配的数量。

    The iterators returned by this class’s个 iteratorlistIterator方法是快速失败的 :如果向量在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身removeadd方法,迭代器都将抛出一个ConcurrentModificationException 。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。 由elements返回的Enumerations 不是故障快速的。

    请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器尽力投入ConcurrentModificationException 。 因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。

    从Java 2平台v1.2,这个类被改造为实现List接口,使其成为成员Java Collections Framework 。 与新集合实现不同, Vector是同步的。 如果不需要线程安全的实现,建议使用ArrayList代替Vector

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值