Java中List集合

什么是List集合?

List集合代表一个元素有序、可重复的集合,集合中的每个元素都有其对应的顺序索引。可以通过索引来访问指定位置的集合元素。默认暗元素的添加顺序设置元素的索引,索引从0开始。

java8中改进的List接口和Listlterator接口

  • void add(int index,Object element):将元素element插入到List集合的index处;
  • boolean addAll(int index,Collection c):将集合c所包含的所有元素插入到List集合的index处。
  • Object get(int index):返回集合index索引处的元素。
  • int indexOf(Object o):返回对象o在List集合中第一次出现的位置索引。
  • int lastIndexOf(Object o):返回对象o在集合中最后一次出现的位置。
  • Object remove(int index):删除并返回index索引处的元素。
  • Object set(int index ,Object element):将index出的元素替换成element对象。如果索引超出范围,则不会改变list。
  • List subList(int fromIndex,int toIndex):返回从索引fromIndex到索引toIndex出所有集合元素组成的子集合,含头不含尾。
  • void replaceAll(UnaryOperator operator):根据operator指定的计算规则重新设置List集合的所有元素。
  • void sort(Comparator c):根据Comparator参数对List集合的元素进行排序。

Java8为List集合增加了sort()和replaceAll()两个常用的默认方法,其中sort方法需要一个Cmpatator对象来控制元素排序,程序可使用Lambda表达式来作为参数。而replaceAll()方法则需要一个UnaryOperator来替换所有集合元素UnaryOperator也是一个函数式接口,所以可以使用Lambda表达式作为参数。

        List books= new ArrayList();

        books.add("Java");
        books.add("Python");
        books.add("C++");
        books.add("go语言");

        //使用目标类型为Comperator的Lambda表达式来对List集合进行排序
        //比较对象字符串长度
        books.sort((a,b)->((String)a).length()-((String)b).length());
        System.out.println(books);//[C++, Java, go语言, Python]

        //使用目标类型为UnaryOperator的Lambda表达式来替换集合中的所有元素
        //替换每个字符串为字符串长度
        books.removeAll(ele->((String)ele).length());

迭代
与Set只提供一个iterator()方法不同,List额外提供了一个listIterator()方法,该方法发法返回ListIterator对象。

  • boolean hasPrevious():返回迭代器关联的集合是否还有上一个元素。
  • Object previous():返回该迭代器的上一个元素。
  • void add(Object o):在指定位置插入一个元素。

与普通Iterator相比listIterator增加了向前迭代的功能,而且还提供了add方法向List集合中添加元素。

        List books= new ArrayList();

        books.add("Java");
        books.add("Python");
        books.add("C++");
        books.add("go语言");

        ListIterator lit = books.listIterator();
        while (lit.hasNext()){
            System.out.println(lit.next());
            lit.add("------分隔符---------");
        }
        System.out.println("——-----下面开始反推迭代———----");
        while (lit.hasPrevious()){
            System.out.println(lit.previous());
        }
        /*Java
        Python
        C++
        go语言
        ——-----下面开始反推迭代———----
        ------分隔符---------
        go语言
        ------分隔符---------
        C++
        ------分隔符---------
        Python
        ------分隔符---------
        Java*/

ArrayList和Vector实现类

ArrayList和Vector作为List类的两个实现类,完全支持前面介绍的List接口的全部功能。
ArrayList和Vector类封装了一个动态的、允许再分配的数组。ArrayList或Vector对象使用initalCapacity参数来设置该数组的长度,当向这两个对象中添加元素时,initalCapacity会自动增加。通常无序关心这个参数,但是如果向ArrayList或Vector集合中添加大量元素时可使用ensureCapacity(int minCapacity)方法一次性地增加initalCapacity。这样减少分配次数,提高性能。

如果知道集合需要保存元素个数,则可以在创建时指定initCapacity,如果不指定。默认为10。

除此之外还提供了两个方法来重新分配Object()数组:

  • void ensureCapacity(int minCapacity):将ArrayList和Vector集合的Object[]数组长度增加大于或等于minCapacity值。
  • void trimToSize():调整集合的Object[]数组长度为当前元素的个数。调用该方法可以减少集合对象占用的存储空间。

ArrayList和Vector的区别
ArrayList是线性不安全的,不同步,但是性能比较后者好;
Vector是线性安全的,同步,性能较差,以前的Vector的方法名较长。
建议优先考虑ArrayList实现类。

Vector还提供了一个Stack子类,它用于模拟"栈"这种数据结构。

提供如下方法:

  • Object peek():返回“栈”的第一个元素,但并不将该元素"pop"出栈;
  • Object pop():返回“栈”的第一个元素,并将该元素“pop”出栈。
  • void push(Object item):将一个元素“push”出栈,最后一个进“栈”的元素总是位于“栈”顶。

固定长度的List

操作数组的工具类:Arrays,该工具类里提供了asList(Obeject…a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合。这个List集合是Arrays的内部类ArrayList的实例。

Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。

        List list = Arrays.asList("python", "java", "C++");

        //获取fixedList的实现类,将输出Array$ArrayList
        System.out.println(list.getClass());

        //使用方法引用遍历集合元素
        list.forEach(System.out::println);
        //增加删除元素会引发UnsupportedOperationException异常
        list.add("go语言");
        list.remove("python");
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值