JavaJAVA

Java集合之List

2020-07-19  本文已影响0人  AbstractCulture

List的特点

  1. 数组的特点是可以随机访问,即通过数组下标对元素进行访问,对于插入与删除来说,在数组尾部进行插入与删除仍然是效率较高的,但是如果插入的数据是处于数组中间的索引位置,那么就要进行数组的移动,这个效率是非常低的。
  2. 链表插入删除是非常高效的,只需要把指针地址进行重新指向即可。而对于链表来说,想要直接访问链表中的某个索引位置,则需要从链表的头尾指针进行迭代。
    值得注意的是,ArrayListLinkedList都不是线程安全的数据结构.

listIterator

List接口提供了一个列表的专用迭代器,它支持双向移动。

        List<String> strings = Arrays.asList("a", "b", "c");
        ListIterator<String> stringListIterator = strings.listIterator();
        while (stringListIterator.hasNext()) {
            System.out.println("正序,当前元素:" + stringListIterator.next());
        }
        while (stringListIterator.hasPrevious()){
            System.out.println("倒叙,当前元素:"+stringListIterator.previous());
        }
listIterator

get和set

ArrayList中,你可以使用getset随机访问每个元素。但是对于链表结构的LinkedList来说,避免使用getset,因为它产生遍历的行为,应该使用迭代器。

拼接list-----addAll

        List<String> s1 = new ArrayList<>();
        s1.add("a");
        s1.add("b");
        s1.add("c");
        List<String> s2 = new LinkedList<>();
        s2.add("d");
        s2.add("e");
        s2.add("f");
        s1.addAll(s2);
        s1.forEach(s-> System.out.println(s));

注意:Arrays.asList()生产出来的list是不可以使用add,remove这种操作的.会抛出java.lang.UnsupportedOperationException异常.这是因为Arrays类返回的对象不是ArrayList,它是一个视图对象。任何试图改变数组大小的方法,都会抛出异常。

子范围-----subList

如果你需要访问list中的某个范围的数据。你可以使用subList方法。注意其中的索引值与真正获取到的List。可以看到,它是不包含s1.get(2)这个索引的元素的。

        List<String> s1 = new ArrayList<>();
        s1.add("a");
        s1.add("b");
        s1.add("c");
        List<String> strings = s1.subList(0, 2);
        strings.forEach(s-> System.out.println(s));
subList

清空子范围的值-----clear

        List<String> s1 = new ArrayList<>();
        s1.add("a");
        s1.add("b");
        s1.add("c");
        List<String> strings = s1.subList(0, 2);
        strings.clear();
        s1.forEach(s-> System.out.println(s));
clear

集合操作:交集,差集

        List<String> s1 = new ArrayList<>();
        s1.add("a");
        s1.add("b");
        s1.add("c");
        List<String> s2 = new LinkedList<>();
        s2.add("a");
        s2.add("b");
        s1.forEach(s-> System.out.println(s));
        //交集,影响数据源
        if(s1.retainAll(s2)){
            System.out.println("s1与s2是有交集的");
        }
        s1.forEach(s-> System.out.println(s));
交集
        List<String> s1 = new ArrayList<>();
        s1.add("a");
        s1.add("b");
        s1.add("c");
        List<String> s2 = new LinkedList<>();
        s2.add("a");
        s2.add("b");
        System.out.print("-----差集操作前: ");
        System.out.print("s1:");
        s1.forEach(s-> System.out.print(s+" "));
        System.out.print("s2:");
        s2.forEach(s-> System.out.print(s+" "));
        //交集,影响数据源
        s1.removeAll(s2);
        System.out.println();
        System.out.print("-----差集操作后: ");
        System.out.print("s1:");
        s1.forEach(s-> System.out.print(s+" "));
        System.out.print("s2:");
        s2.forEach(s-> System.out.print(s+" "));
差集

Vector

不推荐使用,可以理解为线程安全的列表.

上一篇下一篇

猜你喜欢

热点阅读