zoukankan      html  css  js  c++  java
  • java中ArrayList和LinkedList的区别

    • 介绍

      首先来看ArrayList和LinkedList的集成类和接口的区别。

    // lang java
    public class ArrayList<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, Serializable
    
    public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Queue<E>, Cloneable, Serializable

      ArrayList实现了随机访问的接口,LinkedList实现了Quene的接口。

      ArrayList是基于数据实现的list,而LinkedList是基于链表实现的list。所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性。

    • 优缺点

      ArrayList

      优点:适合随机读取的时候,读取速度快,可以一步get(index)。

      缺点:添加值很慢——一方面,添加数据在array中间的时候,需要移动后面的数;另一方面,当长度大于初始长度的时候,每添加一个数,都会需要扩容。

      LinkedList:双向链表

      优点:添加值很快——添加在list中间也只需要更改指针;长度不固定。

      实现栈和队列方面,LinkedList要优于ArrayList。

    • 其它

      LinkedList的remove(int)和remove(Object)的方法的时间复杂度都是O(n),不是O(1).因为会有一个查找的过程。

      LinkedList的remove(int)要优于remove(Object),因为remove(int)在查找的时候,会从链表的中间查找,如果int比中间小,找前半部分,否则找后半部分(类似二分查找)。

      ArrayList的增删比LinkedList的开销更大,因为除了有查找的时间复杂度外,还有增删的移动过程。

      

    • 使用LinkedeList<Integer>实现对链表的排序(sougou笔试题)
    //LinkedList<Integer>实现链表的排序   使用插入排序
        public LinkedList<Integer> insertSortForLinkedList(LinkedList<Integer> list){
            int len=list.size();
            for(int i=1;i<len;i++){
                int j=i-1;
                int temp=list.get(i);
                list.remove(i);  //注意这里需要删除元素  
                while(j>=0&&temp<list.get(j)){
                    j--;    
                }
                list.add(j+1,temp);
            }
            return list;
        }
    • 使用LinkedeList实现栈和队列  

     Stack.java

    import java.util.*;
    
    class Stack{
        private LinkedList list;
        public Stack(){
            list=new LinkedList();
        }
        
        public Object top(){   //输出最上面的元素
            if(list.size()!=0){
                return list.getFirst();
            }
            return -1;
        }
        
        public void pop(){   //出栈
            if(list.size()!=0){
                list.removeFirst();
            }
        }
        
        public void push(Object v){ //入栈
            list.addFirst(v);
        }
        
        public int getLen(){
            return list.size();
        }
    }

    Test.java

    import java.util.*;
    
    class Test{
        public static void main(String[] args){
            Stack stack = new Stack();
            stack.push("张三");
            stack.push(3);
            stack.push("李四");
            stack.push("5");
            System.out.println("长度---"+stack.getLen());  //4
            
            /**
            //注意这样写是有问题的,因为在出栈的过程中stack.getLen()是会发生变化的
            for(int i=0;i<stack.getLen();i++){   
                System.out.println(stack.top());
                stack.pop();
                //System.out.println("长度---"+stack.getLen());  //4
            }
            **/
            
            /**
            //正确
            int i=stack.getLen()-1;
            while(i>=0){
                System.out.println(stack.top());
                stack.pop();
                i--;
            }
            **/
            //正确,但是会引来不安全操作提醒
            while(stack.getLen()>0){   
                System.out.println(stack.top());
                stack.pop();
            }
            System.out.println(stack.top());
            stack.pop();
        }
    }

      为什么while的编译时间长于for循环。

  • 相关阅读:
    XAML学习笔记之Layout(五)——ViewBox
    XAML学习笔记——Layout(三)
    XAML学习笔记——Layout(二)
    XAML学习笔记——Layout(一)
    从0开始搭建SQL Server 2012 AlwaysOn 第三篇(安装数据,配置AlwaysOn)
    从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)
    从0开始搭建SQL Server 2012 AlwaysOn 第一篇(AD域与DNS)
    Sql Server 2012 事务复制遇到的问题及解决方式
    Sql Server 2008R2升级 Sql Server 2012 问题
    第一次ACM
  • 原文地址:https://www.cnblogs.com/lxq0309/p/3655742.html
Copyright © 2011-2022 走看看