zoukankan      html  css  js  c++  java
  • Java 集合-List接口和三个子类实现

    • List

    List:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。

    常用方法:

    List中的一些特有方法测试:

        public void demo2()
        {
            List list = new ArrayList();
            list.add("hello");
            list.add("world");
            list.add("!");
    
            //在指定位置进行添加
            list.add(1, "my");
            // list.add(12,"错误") 会发生数组的越界
    
            //删除指定位置的值
            list.remove(1);
    
            //修改指定位置的值
            list.set(1, "test");
    
            System.out.println(list);
        }
    

    List的特有遍历方法:

        public void demo2()
        {
            List list = new ArrayList();
            list.add("hello");
            list.add("world");
            list.add("!");
    
            //List的特有遍历功能
            for(int i=0;i<list.size();++i)
            {
                System.out.println(list.get(i));
            }
        }
    

    List的特有迭代器ListIterator:该迭代器继承了Iterator接口

    常用方法:

    ListIterator中还提供了逆向遍历,不过需要先正向遍历之后才可以逆向,所以没有意义。一般不使用。

    //报错代码    
    public void demo3()
        {
            List list = new ArrayList();
            list.add("hello");
            list.add("world");
            list.add("!");
    
            Iterator it = list.iterator();
            while(it.hasNext())
            {
                String s = (String) it.next();
                if("world".equals(s)) list.add("java");
            }
        }
    

    这样写的话,会报ConcurrentModificationException的错误,也就是当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

    产生的原因是:迭代器是依赖于集合而存在的,在判断成功后,集合中新添加了元素但是迭代器却是不知道的,所以会报错。

             或者说通过迭代器遍历元素的时候,是不能通过集合修改元素的。

    解决方法:迭代器迭代元素,迭代器修改元素(需要使用ListIterator);

         集合遍历元素,集合修改元素(for+get);

        public void demo3()
        {
            List list = new ArrayList();
            list.add("hello");
            list.add("world");
            list.add("!");
    
            ListIterator it = list.listIterator();
            while(it.hasNext())
            {
                String s = (String) it.next();
                if("world".equals(s)) it.add("java");
            }
            System.out.println(list);
        }
    

    这里的添加是添加在刚才迭代的元素后面。

    • List的三个子类

    1、ArrayList:底层数据结构是数组,查询块,增删慢。

                线程不安全,效率高。

    2、Vector:底层数据结构是数组,查询块,增删慢。

                 线程安全,效率低。

    3、LinkedList:底层数据结构是双向链表,查询慢,增删块。

                   线程不安全,效率高。

    ~ ArrayList

    List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。

    注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。

    *构造方法

    *常用方法

    ~ Vector(基本不用了)

    Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。另外,Vector是线程安全的。

    *构造方法

    *常用方法

        public void demo4()
        {
            Vector v = new Vector();
    
            v.addElement("Hello");
            v.addElement("World");
            v.addElement("!");
    
            //遍历
            for(int i=0;i<v.size();++i)
            {
                String s = (String) v.elementAt(i);
                System.out.println(s);
            }
    
            System.out.println("---------------");
    
            Enumeration en= v.elements();
            while(en.hasMoreElements())
            {
                System.out.println(en.nextElement());
            }
        }
    

     ~ LinkedList

    List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 getremoveinsert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列

    此类实现 Deque 接口,为 addpoll 提供先进先出队列操作,以及其他堆栈和双端队列操作。注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。

    *构造方法

    *常用方法

    由于有addfirst,addlast方法,getfirst,getlast方法,所以可以用来做为双端队列。并且有pop,push方法,所以可以用来作为堆栈。

  • 相关阅读:
    [zz]libvirt中CPU和内存的细粒度管理机制
    SAP 模块中文解释
    邪恶的Php一句话木马 assert函数制作简单木马
    PHP开发中三维数组的应用
    返回本机时间或服务器时间
    向SQL中插入数据
    Word的字体
    人生如锅
    打开指定的文件
    计算最大序号
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/7755302.html
Copyright © 2011-2022 走看看