• Java中的容器 I————浅谈List


    一.List接口的继承关系

    List接口是Collection接口的子接口,而ArrayList和LinkedList以及Vector是其实现类。

    List的特点是可以将元素维护在特定的序列中,可以再List 插入和删除元素。

    二.两个实现类ArrayList和LinkedList

    ArrayList:擅长随机访问,但是插入和删除消耗较慢,原因:底层维护的是一个Object数组

    源码如下:

        /**
         * The array buffer into which the elements of the ArrayList are stored.
         * The capacity of the ArrayList is the length of this array buffer. Any
         * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
         * will be expanded to DEFAULT_CAPACITY when the first element is added.
         */
        transient Object[] elementData; // non-private to simplify nested class access

    LinkedList:擅长插入,删除。但是不擅长随机访问,原因底层是一个链表

    头结点的代码:

       /**
         * Links e as first element.
         */
        private void linkFirst(E e) {
            final Node<E> f = first;
            final Node<E> newNode = new Node<>(null, e, f);
            first = newNode;
            if (f == null)
                last = newNode;
            else
                f.prev = newNode;
            size++;
            modCount++;
        }

    三.List接口实现的常用方法

    首先在了解List之前先来了解ArrayList和LinkedList的构造函数

    通常情况下我们都是直接不像构造器里传参数,那么此时他们的默认长度为10,此后每一次扩容为1.5倍,即每次加5.

    当你初始化时传入一个数字,那么它将设置该数值为初始长度,代码如下:

    ArrayList<Node> arr1 = new ArrayList<>(1);//指派出的长度,当不满足是在自动分配

    当然你也可以通过Arrays.asList方法来传入List对象来实现,代码如下:

    List<Node> arr = new ArrayList<>(Arrays.asList(new Node(),new Node()));//可以在初始化时就创建

    以下为List实现的方法:

    1.add()————增加方法。

    arr1.add(new Node(1,"a"));//添加元素
    arr1.add(new Node(2,"b"));//添加元素
    arr1.add(new Node(1,"a"));//添加一个相同重复的元素

    2.get()————获取元素。

    System.out.println(arr1.get(0));

    3.remove————移除一个元素的方法(equals匹配)

    System.out.println(arr1.remove(new Node(1,"a")));//true  Node类重写了equals方法所以可以被删除,且删除第一个遇到匹配的

    4.removeAll————移除所有匹配相同的元素方法(equals匹配)

    arr4.removeAll(Arrays.asList(new Node()));//使用equals来判断删除所有的

    5.indexOf————返回匹配元素在集合中的第一次相遇的元素位置(equals匹配),没有匹配到时将返回-1

    System.out.println(arr1.indexOf(new Node(1,"a")));//返回在arr中的序列没有返回-1

    6.addAll————将collection接口实现的子类对象加入到集合中,这也就是说你可以将Set集合和Queue中的元素加入到List集合中

    //在ArrayList中插入Set集合
    Set<Node> set=new HashSet<>();
    Collections.addAll(set, new Node(3,"c"),new Node(4,"d"));//初始化set集合
    arr1.addAll(set);

    7.subList————分割出子集合,返回类型为List,注意当使用List的实现类来操作是注意向下转型异常。

    //获取子集合,使用linkedList  subList返回的类型为List,不能直接使用,不能实现向下转型,使用多态解决
     List<Node> arr2=new LinkedList<>();
     arr2=arr1.subList(0, 2);//subList返回类型为List  向下转型会出现异常,只有使用多态才能完成操作
     System.out.println(arr2);
    //获取子集和使用arrayList
     List<Node> arr3= arr1.subList(0, 2);

     8.————排序问题和引用问题

    List<Node> arr3= arr1.subList(0, 2);
    System.out.println("在没有排序之前子串str3为:");
    System.out.println(arr3);
    Collections.sort(arr3);
    System.out.println("在排序之后子串str3为:");
    System.out.println(arr3);
    System.out.println(arr1);//子串排序后其母串也排序

     

    首先想要实现sort方法,元素类必须实现comparable接口

    发现当我们,子集完成排序后母集中子集部分也完成排序。

    原因就是我们的subList()只是在堆里直接引用了母集的部分元素,他们指向的对象还是相同的,所以当你对子集做出改变时母集也会改变。

  • 相关阅读:
    Spring事务传播机制
    关于MyBatis-Like的模糊查询,">"、"<"等需转义字符描述
    MyBatis中if
    报错(持续.....)
    爬虫报错(持续.....)
    django的timezone问题
    dispatch
    django + uwsgi + nginx 实现高并发环境部署 及 报错处理
    虚拟机问题(持续更新.......)
    Tornado
  • 原文地址:https://www.cnblogs.com/SAM-CJM/p/9374396.html
Copyright © 2020-2023  润新知