zoukankan      html  css  js  c++  java
  • List

    List 接口存储一组不唯一(可以重复),有序(插入顺序)的对象

    01. ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
    通过看ArrayList的源码得知:
        /* Constructs an empty list with an initial capacity of ten.
           构造一个初始容量为十的空列表
        */
        public ArrayList() {
        this(10);  调用带参的构造,参数为10
        }
    ArrayList创建的时候,数组初始化长度为10!
    List list=new ArrayList(-1);     这句话会运行错误! 看源码得知!
        /**
         * Constructs an empty list with the specified initial capacity.
         * @param   initialCapacity   the initial capacity of the list 
         * @exception IllegalArgumentException if the specified initial capacity
         *            is negative
         */
        public ArrayList(int initialCapacity) {
        super();
            if (initialCapacity < 0)  //参数小于0!会抛出异常信息
                throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
        this.elementData = new Object[initialCapacity];
        }
    List list=new ArrayList();   //初始化长度为10
    list.add(1);
    .....
    list.add(11);   //这时候集合会自动扩容!返回一个新的数组长度 =原数组的长度*1.5+1,看源码得知!
     public void ensureCapacity(int minCapacity) {
        modCount++;
        int oldCapacity = elementData.length;
        if (minCapacity > oldCapacity) {
            Object oldData[] = elementData;
            int newCapacity = (oldCapacity * 3)/2 + 1;
                if (newCapacity < minCapacity)
            newCapacity = minCapacity;
                // minCapacity is usually close to size, so this is a win:
                elementData = Arrays.copyOf(elementData, newCapacity);
        }
        }

    创建一个新闻实体类

    public class News {
        private int id;  //新闻编号
        private String title;  //新闻标题
        
        @Override
        public String toString() {
            return "新闻 [编号=" + id + ", 标题=" + title + "]";
        }
        
        public News() { //无参构造
            super();
        }
        public News(int id, String title) { //带参构造
            super();  
            this.id = id;
            this.title = title;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        
        public static void main(String[] args) {
            News news=new News();
            /*
             * 直接输出对象 默认走Object类中的toString()
             * News类中重写了这个toString() 就会走本类的!
             */
            System.out.println(news);
        }
    }

    创建测试类

    public class ArrayListTest {
    
        public static void main(String[] args) {
            
            List nums=new ArrayList();
            nums.add(1);
            nums.add(1);
            nums.add(1);
            nums.add(1);
            System.out.println(nums.size());
            
            /*
             * 创建一个ArrayList集合
             * 存储不唯一(允许重复),有序的数据!
             * ArrayList是实现了可变大小的数组!
             * 随机访问和遍历的效率高!
             */
            List list=new ArrayList();
            //往集合中添加 元素(新闻对象)
            News news1=new News(1, "新闻1");
            News news2=new News(2, "新闻2");
            News news3=new News(3, "新闻3");
            list.add(news1);
            list.add(news2);
            list.add(news3);
            //01.打印出集合的长度
            System.out.println("新闻集合的大小:"+list.size());
            //02.查询下标为2的新闻信息
            System.out.println(list.get(2));
            //03.删除下标为1的新闻
            list.remove(1);
            //04.通过对象删除
            list.remove(news3);
            //05.查询集合中是否包含news3
            System.out.println("是否包含news3===>"+list.contains(news3));
            //新增加一个对象
            list.add(new News(4, "新闻4"));
            //06.在指定的位置新增一个对象
            list.add(0, new News(5,"新闻5"));
            System.out.println("*************************");
            //打印新闻的标题
            for (int i = 0; i < list.size(); i++) {
                /*
                 * 根据集合的下标获取新闻的信息
                 * get(int index)返回值是Object
                 * 必须向下转型为News
                 */
                News news=(News) list.get(i);
                System.out.println(news.getTitle());
            }
            System.out.println("*************************");
            //07.把集合转换成数组
            Object[] array = list.toArray();
            for (int i = 0; i < array.length; i++) {
                News news=(News) array[i];
                System.out.println("新闻的标题是:"+news.getTitle());
            }
            System.out.println("*************************");
            //08.通过for加强进行遍历
            for (Object object : list) {
                News news=(News) object;
                System.out.println("新闻的标题是:"+news.getTitle());
            }
            System.out.println("*************************");
            /*
             * 09.通过迭代器iterator接口
             *      001.next():获取序列中的下一个元素
             *      002.hasNext():检查序列中是否还有元素
             *      003.remove():删除元素
             */
            Iterator it = list.iterator();
              //判断集合中是否有下一个元素
            while(it.hasNext()){
                News news=(News) it.next();
                System.out.println("新闻的标题是:"+news.getTitle());
            }
            //10.清空整个集合
            list.clear();
            //11.判断集合是否为空
            System.out.println("集合是否为空==>"+list.isEmpty());
            System.out.println(list.size());  //  0
        }
    }

    02.LinkedList:采用链表存储方式。插入、删除元素时效率比较高

    public class LinkedListTest {
    
        public static void main(String[] args) {
            //创建一个LinkedList集合
            LinkedList list=new LinkedList();
            //创建几个新闻对象
            News news1=new News(1, "新闻1");
            News news2=new News(2, "新闻2");
            News news3=new News(3, "新闻3");
            News news4=new News(4, "新闻4");
            //新增数据
            list.add(news1); //在一个位置
            list.addFirst(news2); //news2会顶替news1在集合中的位置  news1位于第2位
            list.addLast(news4); //news4在第三个位置
            list.add(news3);  //第4个位置
            //遍历整个集合
            for (Object object : list) {
                News news=(News) object; //转换成新闻对象才能调用对应方法
                System.out.println("新闻的标题:"+news.getTitle());
            }
            //通过indexOf(Object o) 获取对象在集合中的下标
            int index=list.indexOf(news4);
            list.remove(index);//根据下标删除对象
            //看是否还包含news4
            System.out.println("是否还包含news4==>"+list.contains(news4));
            //删除集合中的第一个元素
            list.removeFirst();
            for (Object object : list) {
                System.out.println(object); //不需要强制类型转换  默认走的是重写之后的toString()
            }
            //获取集合中的第一个元素
            News news=(News) list.getFirst();
            System.out.println("第一个元素的新闻标题:"+news.getTitle());
            //获取集合中的最后一个元素
            News newsz=(News) list.getLast();
            System.out.println("最后一个元素的新闻标题:"+newsz.getTitle());
        }
    }

    03.ArrayList和LinkedList的区别

             /*
             * ArrayList和LinkedList的区别
             * ArrayList:采用数组的形式来保存数据!这些数据被放在内存中开辟连续的空间!
             *           每个数据的位置都有下标! 
             *           比如说:
             *           现在集合长度为50! 现在想删除下标为2的元素!
             *           删除之后,底层还要做什么操作?
             *           下标为2之后的元素都要前移??
             *           
             *           现在想在下标为3的位置 新增 元素!
             *           下标3的元素之后的数据全部后移??
             *           所以 新增,删除效率慢!
             *           因为是数组结构,所以遍历,查询效率高!           
             * LinkedList:链表式结构!存储在集合中的每个对象都存放在相互独立的空间!
             *            比如说: 
             *             现在集合长度为50! 
             *             第1个元素记录第2个元素的位置
             *             第2个元素记录第3个元素的位置
             *             。。。。
             *             第49个元素记录第50个元素的位置
             *             我们想删除第3个元素!
             *             只需要让 第2个元素记录第4个元素的位置!
             *             之后的元素有影响吗?  没有
             *             
             *             在第2个元素和第3个元素之间新增一个元素x
             *             这时候只需要 第2个元素 记录x的位置
             *             x记录第三个元素的位置
             *             新增,删除效率高!
             *             因为没有下标,所以查询遍历的效率低!
             */
  • 相关阅读:
    [转]在nodejs使用Redis缓存和查询数据及Session持久化(Express)
    [转]最常用的商务职场英语邮件100个句式
    [转]玩转Angular2(4)--制作左侧自动定位菜单
    [转]Angular开发(十八)-路由的基本认识
    Consul之:服务注册与发现
    Consul之:key/value存储
    服务容错保护断路器Hystrix之六:服务熔断和服务降级
    延时队列:Java中的DelayQueue
    分布式延迟消息队列实现分析与设计
    基于redis的延迟消息队列设计
  • 原文地址:https://www.cnblogs.com/areyouready/p/6834668.html
Copyright © 2011-2022 走看看