美文网首页JavaJAVA
Java集合之List

Java集合之List

作者: AbstractCulture | 来源:发表于2020-07-19 23:10 被阅读0次

    List的特点

    • 有序。我们经常使用的List如:ArrayListLinkedList都是属于List接口下的数据结构。
    • 其中,ArrayList动态数组LinkedList是基于双向链表实现的有序序列。
    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

    集合操作:交集,差集

    • 交集,retainAll,如果s1和s2是有交集的,那么s1中不在交集部分的数据就会被删除掉.
            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));
    
    交集
    • 差集,removeAll,删除s1中在s2不存在的数据。
            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

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

    相关文章

      网友评论

        本文标题:Java集合之List

        本文链接:https://www.haomeiwen.com/subject/rdlrkktx.html