美文网首页
10,java ArrayList 类

10,java ArrayList 类

作者: 滔滔逐浪 | 来源:发表于2019-01-10 09:28 被阅读0次

    ArrayList是一个基于数组上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。

    遍历

    package com.itlwc;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("lwc");
            list.add("nxj");
            // 遍历方法一
            Iterator<String> ite1 = list.iterator();
            while (ite1.hasNext()) {
                String str = ite1.next();
                System.out.println(str);
            }
            System.out.println("---------------------");
            // 遍历方法二(方法一的变形)
            for (Iterator<String> ite2 = list.iterator(); ite2.hasNext();) {
                String str = ite2.next();
                System.out.println(str);
            }
            System.out.println("---------------------");
            // 遍历方法三
            for(String s : list){
                System.out.println(s);
            }
        }
    }
    

    /*
    打印结果:
    lwc
    nxj
    ---------------------
    lwc
    nxj
    ---------------------
    lwc
    nxj
    */

    总结

    ArrayList依赖于数组实现的,初始长度为10的Object[],并且可随需要而增加的动态数组当元素超过10,那么ArrayList底层会新生成一个数组,长度为原来的1.5倍+1,然后将原数组内容复制到新数组中,并且后续增加的内容会放到新数组中,当新数组无法容纳增加的元素,重复该过程。

    ArrayList对随机访问性能很好,但进行大量插入,删除操作,性能很差,因为操作之后后续元素需要移动。

    实例

    public class ArrayListReview {
        public static void main(String[] args) {
            ArrayList<Info> infosList=new ArrayList<>();
            infosList.add(new Info(0, "aaa"));
            infosList.add(new Info(1, "bbb"));
            infosList.add(new Info(2, "ccc"));
            infosList.add(new Info(3, "ddd"));
            infosList.add(1, new Info(4, "eee")); // 按索引插入到指定位置
    
            // foreach遍历输出
            for (Info info : infosList) {
                System.out.println(info);
            }
            System.out.println("------------------------");
    
            // 截取字串
            List<Info> subList = infosList.subList(1, 3);
            subList.add(new Info(30, "fly"));
            printList(subList);
    
            ArrayList<Info> newInfosList=new ArrayList<>();
            newInfosList.add(new Info(11, "qqq"));
            newInfosList.add(new Info(12, "www"));
    
            ArrayList<String> ss=new ArrayList<>();
    //      infosList.addAll(newInfosList);  // 添加一个指定集合到原集合最后,注意两个集合的泛型参数一致
            infosList.addAll(2,newInfosList); // 将指定集合插入到指定位置
            //printList(infosList);
    
            Info info = infosList.get(2);  // 取出指定位置的元素
            System.out.println(info);
    
            infosList.set(0, new Info(10, "rrr"));   // 替换指定索引位置的元素
            //printList(infosList);
    
            int index = infosList.indexOf(info);  //根据元素获取元素第一次出现的索引,不存在则返回-1
            int lastIndex = infosList.lastIndexOf(info); // 取出元素的最后一个匹配项的索引
            int indexOf = infosList.indexOf(new Info(4,"eee")); // 重写了Info类的hashCode与equals方法,用于判断两个对象是否相同
            System.out.println("index="+indexOf);
            //printList(infosList);
    
            // 通过反射拿到的removeRange方法
            removeRange(infosList, 1, 3);
            //printList(infosList);
    
            // listIterator从前往后迭代
            ListIterator<Info> listIterator = infosList.listIterator();
            while(listIterator.hasNext()){
                // 最后抛出错误,java.util.NoSuchElementException,不要每次取都掉用next方法,它每调用一次,迭代器指针向前移动一位
    //          System.out.println("id="+listIterator.next().getId()
    //                  +"adress="+listIterator.next().getAdress()); 
    
                Info next = listIterator.next();  // 正确做法,调用一次要取出元素,然后操作属性
                System.out.println("id="+next.getId()
                        +" adress="+next.getAdress()); 
            }
    
            // 往前迭代,必须在往后迭代之后用
            while(listIterator.hasPrevious()){  // 当有上一个元素时
                Info previous = listIterator.previous();  // 获取上一个元素
                System.out.println("id="+previous.getId()+" adresss="+previous.getAdress());
            }
    
            // 通过数组来转化成一个List,虽然可以把数组转成集合,但是集合的长度不能改变。
            String[] a=new String[]{"hello","world","just","do","it"};
            List<String> asList = Arrays.asList(a);
            //asList.add("gogogo");  //不可修改asList,会抛出UnsupportedOperationException
    
            // 泛型使用 
    //      ArrayList<Object> l=new ArrayList<String>();// 不行
    //      ArrayList<ArrayList> lll=new ArrayList<List>(); // 不行
    //      ArrayList<List> lll=new ArrayList<ArrayList>(); // 不行
    //      ArrayList l=new ArrayList<String>(); // 可行
    //      ArrayList<String> l=new ArrayList<>(); // 可行
    //      ArrayList ll=new ArrayList();  // 可行
        }
    
        // 打印输出
        public static <E> void printList(List<E> list) {
            for (E e : list) {
                System.out.println(e);
            }
            System.out.println("------------------------");
        }
    }
    
    

    相关文章

      网友评论

          本文标题:10,java ArrayList 类

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