List集合

  • List集合是一个元素有序,可重复的集合,集合中每个元素都有其对应的顺序索引
  • List集合允许重复使用元素,可以通过索引来访问指定位置的集合元素
  • List集合默认按照元素的添加顺序设置元素的索引,索引从0开始
  • 以下是List接口的一些特殊方法体现
import java.util.ArrayList;
import java.util.List;

public class ListTest {
    public static void main(String[] args) {
    List l = new ArrayList();
        l.add("yjh728");
        l.add("YJH");
        l.add("728");
        l.add("728");
        System.out.println(l);
        //remove()函数只会删除第一个相同的元素,不会删除所有相同的元素
        l.remove("728");
        System.out.println(l);
        //List新增的一种遍历方式
        for (Object obj : l) {
            System.out.println((String) obj);
        }
        System.out.println(l);
        l.add(1, "728");
        System.out.println(l);
        //输出某索引处元素
        System.out.println(l.get(2));
        //输出某元素第一次出现的索引值
        System.out.println(l.indexOf("728"));
        //输出某元素最后一次出现的索引值
        System.out.println(l.lastIndexOf("728"));
        //对指定索引出元素进行替换
        l.set(1, "0728");
        System.out.println(l);
        //两个元素相等(equals返回true)即删除
        l.remove("0728");
        System.out.println(l);
        //截取一个List集合,从第一个参数开始(包括), 第二个参数截至(不包括)
        System.out.println(l.subList(0, 2));
    }
    /*
    运行结果:
    [yjh728, YJH, 728, 728]
    [yjh728, YJH, 728]
    yjh728
    YJH
    728
    [yjh728, YJH, 728]
    [yjh728, 728, YJH, 728]
    YJH
    1
    3
    [yjh728, 0728, YJH, 728]
    [yjh728, YJH, 728]
    [yjh728, YJH]
    */
}
  • Java8为List结合增加了sort()和replaceAll()两个常用的默认方法
import java.util.ArrayList;
import java.util.List;

public class ListTest {
    public static void main(String[] args) {
        List l = new ArrayList();
            l.add("yjh728");
            l.add("YJH");
            l.add("728");
            //为List集合设置排序方法,参数为Compator,是一个函数式接口,Java8新增的方法

            l.sort((o1, o2) -> ((String) o1).length() - ((String) o2).length());
            System.out.println(l);
            //替换全部元素,参数是UnaryOperator,也是一个函数式接口,以Lambda表达式作为替换规则
            //Java8新增的方法
            l.replaceAll(ele -> ((String) ele).length());
            System.out.println(l);
    }
    /*
    运行结果:
    [yjh728, YJH, 728]
    [YJH, 728, yjh728]
    [3, 3, 6]
    */
}
  • List相对于Set额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,该类在Iterator类的基础上增加了向前迭代的功能
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIteratorTest {
    public static void main(String[] args) {
        List l = new ArrayList();
        l.add("yjh");
        l.add("728");
        l.add("YJH728");
        ListIterator lt = l.listIterator();
        // ConcurrentModificationException异常
        // 使用ListIterator或Iterator迭代器后不能对集合列表直接进行操作,只能通过迭代器来进行列表的修改
        // l.add("99");
        while (lt.hasNext()) {
            System.out.println((String) (lt.next()));
            lt.add("========================");
        }
        System.out.println("下面开始反迭代");
        while (lt.hasPrevious()) {
            System.out.println((String) (lt.previous()));
        }
        System.out.println(l);
    }
    /*
    运行结果:
    yjh
    728
    YJH728
    下面开始反迭代
    ========================
    YJH728
    ========================
    728
    ========================
    yjh
    [yjh, ========================, 728, ========================, YJH728, ========================]
    */
}

ArrayList实现类

  • ArrayList是线程不安全的
  • ArrayList集合是List接口的典型实现,它是基于数组实现的List类
  • ArrayList类封装了一个动态的、允许在分配的Object[]数组。
  • 它的实例(对象)可以通过initialCapacity参数来设置该数组的长度
  • 创建对象时若不指定initialCapacity参数,系统自动为数组设置长度为10
  • 当元素超过数组长度时,initialCapacity会自动增加,但是当添加大量数据时会增加initialCapacity自动增加的次数,导致性能下降
  • 因此,当大量改变元素的个数时,可以通过ensureCapacity()方法和trimToSize()方法来重新分配Object[]数组
  • void ensureCapacity(int minCapacity):将赎罪长度增加大于或等于minCapacity值
  • void trimToSize()调整数组长度为当前元素的个数,可以减少集合对象占用的储存空间

Vector实现类

  • Vector是线程安全的,因此性能比ArrayList性能差
  • Vector实现类与ArrayList实现类在用法上几乎完全相同,在这里不多做叙述
  • Vector在JDK1.0就出现了,有很多的缺点,一般不建议使用Vector实现类、
  • Vector还提供了一个Stack子类,可以实现栈的功能,因出现较早,所以性能较差,仍不建议使用,若想实现栈的功能,可以选择使用ArrayDeque类

数组长度固定的List

import java.util.Arrays;
import java.util.List;

public class FixedSizeList {
    public static void main(String[] args) {
        //这个List是Arrays内部类ArrayList的实例
        //不是ArrayList实现类的实例,也不是Vector实现类的实例
        List fixedSize = Arrays.asList("yjh", "728", "yjh728");
        System.out.println(fixedSize);
        //UnsupportedOperationException异常,该集合不允许删除元素
        //fixedSize.remove(2);
        //UnsupportedOperationException异常,该集合不允许添加元素
        //fixedSize.add("990728");
    }
    //运行结果:[yjh, 728, yjh728]
}