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循环。

  • 相关阅读:
    QT正则表达式
    unix网络编程笔记
    网页书签
    trie tree(字典树)
    C++网络爬虫抓取图片
    网络编程——客户端简单流程
    OpenCV系列--摄像头控制的简单代码
    订单号生成雪花算法
    docker 运行tomcat项目
    docker 打包springboot镜像并启动
  • 原文地址:https://www.cnblogs.com/lxq0309/p/3655742.html
Copyright © 2011-2022 走看看