`
pterodactyl
  • 浏览: 766636 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ArrayList和LinkedList的用法区别

    博客分类:
  • java
阅读更多

ArrayList和LinkedList的用法区别

(2009-10-10 18:02:21)
<script></script>标签:

it

分类:C/C++

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
    这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。  这一点我做了实验。在分别有200000条“记录”的ArrayList和LinkedList的首位插入20000条数据,LinkedList耗时约是ArrayList的20分之1。

for(int m=0;m<20000;m++)...{
        linkedlist.add(m,null);      //当在200000条数据之前插入20000条数据时,LinkedList只用了1125多ms.这就是LinkedList的优势所在
        }
        long time4 = new Dte().getTime();
        System.out.print("batch linkedlist add:");
        System.out.println(time4 - time3);
        for(int n=0;n<20000;n++)...{
        arraylist.add(n, null);  //当在200000条数据之前插入20000条数据时,ArrayList用了18375多ms.时间花费是arraylist的近20倍(视测试时机器性能)
        }
        long time5 = new Date().getTime();
        System.out.print("batch arraylist add:");
        System.out.println(time5 - time4);

4.查找操作indexOf,lastIndexOf,contains等,两者差不多。
5.随机查找指定节点的操作get,ArrayList速度要快于LinkedList.
这里只是理论上分析,事实上也不一定,ArrayList在末尾插入和删除数据的话,速度反而比LinkedList要快。我做过一个插入和删除200000条数据的试验。

        long time1 = new Date().getTime();
        String s1 = (String) linkedlist.get(100000);//  总记录200000,linkedlist加载第100000条数据耗时15~32ms不等
        long time2 = new Date().getTime();
        System.out.println(time2 - time1);
        String s2 = (String) arraylist.get(100000);//  总记录200000,linkedlist加载第100000条数据耗时0ms
        long time3 = new Date().getTime();
        System.out.println(time3 - time2);
 

   
    public static void insertList(LinkedList linklist, ArrayList arraylist) ...{
        long time1 = new Date().getTime();
        System.out.println(time1);
        for (int i = 0; i < 200000; i++) ...{
            linklist.add(i, "linklist" + i);
        }
        long time2 = new Date().getTime();
        System.out.println(time2 - time1);
        for (int j = 0; j < 200000; j++) ...{
            arraylist.add(j, "arraylist" + j);
        }
        long time3 = new Date().getTime();
        System.out.println(time3 - time2);
    }



    public static void deleteList(LinkedList linklist, ArrayList arraylist) ...{
        long time1 = new Date().getTime();
        System.out.println(time1);
        for (int i = 199999; i >= 0; i--) ...{
            linklist.remove(i);
        }
        long time2 = new Date().getTime();
        System.out.println(time2 - time1);
        for (int j = 199999; j >= 0; j--) ...{
            arraylist.remove(j);
        }
        long time3 = new Date().getTime();
        System.out.println(time3 - time2);
    }

    public static void main(String args[]) ...{
        LinkedList linkedlist = new LinkedList();
        ArrayList arraylist = new ArrayList();
        insertList(linkedlist, arraylist);

                                        //以下代码省略

插入:
LinkedList 578ms
ArrayList 437ms
删除:
LinkedList 31ms
ArrayList 16ms

 

比较一下ArrayList和LinkedList:
1.ArrayList是基于数组,LinkedList基于链表实现。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
4.查找操作indexOf,lastIndexOf,contains等,两者差不多。
这里只是理论上分析,事实上也不一定,比如ArrayList在末尾插入和删除数据就不设计到数据移动,不过还是
有这么个建议:随机访问比较多的话一定要用ArrayList而不是LinkedList,如果需要频繁的插入和删除应该
考虑用LinkedList来提高性能。

如果z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。 

每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 例如:如果 sb 引用 StringBuilder 的一个实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。java.lang.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。 append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

String / StringBuffer /StringBuilder,在字符串连接操作上性能依次加强,我曾经做过一个实验,连续进行10000次的字符串操作,三者速度上的差距是惊人的。在确切知道是不变字符串的情况下,还是用String最好,因为Java语言中String采用了享元模式(Flyweight),在JVM中只存在一份相同的String 。在确定循环次数时,尽量使用for循环,在循环嵌套中尽量将大循环放到外层,小循环放到内层,这点与VB等语言恰好相反,经过代码测试的,不过还不知道原因。总之,在VB等微软系列语言中用小套大会快很多,而在JAVA中用大套小会快很多!当然这是指两者能互相替换的时候,比如二维数组遍觅等!

如果字符串特别长,采用charAt逐一获取特定位置的字符是非常耗时的。因为每次获取制定索引位置的字符都要引起新的检索过程,更好的办法是将字符串通过调用toCharArray方法转换成字符数组,然后通过数组索引值获得指定位置的字符。

对于boolean值,避免不必要的等式判断将一个boolean值与一个true比较是一个恒等操作(直接返回该boolean变量的值). 移走对于boolean的不必要操作至少会带来2个好处: 1)代码执行的更快 (生成的字节码少了5个字节); 2)代码也会更加干净。

关于使用SESSION问题上,尽量不要将大对象放到HttpSession或其他须序列化的对象中,并注意及时清空Session。

分享到:
评论

相关推荐

    ArrayList Vector LinkedList 区别与用法.

    ### ArrayList、Vector、LinkedList 的区别与用法详解 在Java编程中,选择合适的数据结构对于程序的性能至关重要。本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解...

    ArrayList、ArrayDeque与LinkedList区别md,学习代码

    此外,对于Java Web开发,了解Tomcat、Cookie、Session以及localStorage和sessionStorage的区别和用法也是至关重要的。Tomcat是一款广泛使用的开源Java Servlet容器,它支持Servlet和JSP标准,是许多Java Web应用的...

    Java中ArrayList类的用法.docx

    ArrayList类是Java.util包中的一个成员,继承自AbstractList并实现了List接口,因此它支持随机访问,但插入和删除操作可能比基于链表的List实现(如LinkedList)效率低。 1. **ArrayList的概念** ArrayList是一个...

    Java中ArrayList类的用法.pdf

    此外,ArrayList的查询效率不如LinkedList,因为ArrayList是通过索引访问,而LinkedList是通过节点遍历,所以在频繁插入和删除的情况下,LinkedList可能更为合适。 总之,ArrayList是Java中一种常用的列表数据结构...

    Collection,List,Set和_Map用法和区别

    Collection, List, Set 和 Map 用法和区别 Collection 是 Java 中的一种对象集合,提供了许多有用的方法来操作集合元素,例如添加、删除、遍历等。Collection 是一个接口,下面有两个子接口:List 和 Set。 List ...

    ArrayList演示

    最后,值得注意的是ArrayList与LinkedList之间的区别。LinkedList提供了更快的插入和删除速度,但访问元素的速度较慢,因为它需要从头或尾部开始遍历。因此,在选择容器类型时,需要根据应用场景来权衡。 总的来说...

    Java中ArrayList类的用法与源码完全解析

    这里我们将深入探讨ArrayList的用法和源码解析。 首先,ArrayList的主要优点在于它的灵活性。由于它是动态的,当需要添加或删除元素时,ArrayList会自动调整其容量以适应变化。这意味着你可以在任何位置插入或移除...

    java中List的用法.pdf

    2. **ArrayList和LinkedList的区别** - **ArrayList**:基于动态数组实现,适合于随机访问和修改元素。由于它使用数组存储,所以插入和删除元素时需要移动大量元素,效率较低。 - **LinkedList**:基于链表结构,...

    List,set,Map 的用法和区别

    Java 集合框架中 List、Set、Map 的用法和区别 Java 集合框架(Java Collections Framework)是 Java 语言中的一个重要组件,提供了一些基本的数据结构和算法来操作和存储数据。其中,List、Set、Map 是三个非常...

    Lists-Java:来自数据结构学科。 我们在Java上实现了arraylist和链表

    通过学习这个项目,你不仅能了解ArrayList和LinkedList的基本用法,还能深入理解它们的实现细节,从而在实际编程中灵活运用,提高程序效率。同时,这也是对数据结构基础的巩固,有助于提升编程能力。

    java arrayList遍历的四种方法及Java中ArrayList类的用法

    - 对于大规模数据的增删操作,考虑使用LinkedList,因为ArrayList的插入和删除操作在中间位置时效率较低。 了解并熟练运用这些知识点,能够帮助你在实际编程中更好地管理和操作ArrayList,提高代码的效率和可维护...

    集合ArrayList测试集合ArrayList测试集合ArrayList测试

    在Java编程语言中,`ArrayList`是`java.util`包中的一个类,它实现了可变大小的数组,也就是我们常说的动态数组。`ArrayList`是`List`...了解并熟练掌握`ArrayList`的特性和用法,对于编写高质量的Java代码至关重要。

    Java集合Collection、List、Set、Map使用详解

    Java中的ArrayList、LinkedList、HashSet和TreeSet等都是Collection的子接口或实现类。 **List接口** List接口继承自Collection,它是一个有序的容器,允许有重复元素。List接口提供了索引访问,可以通过索引来获取...

    java ArrayList的使用与分析

    【Java ArrayList 使用与分析】 ArrayList 是 Java 集合框架中的一个重要组成部分,它是一个基于数组实现的可变大小的列表。...了解和熟练掌握 ArrayList 的用法对编写高性能的 Java 应用程序至关重要。

    java集合类详解(set list ArrayList等java集合类详述)

    Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。...了解集合类的特点和用法可以帮助我们更好地编写代码。

    蓝桥杯leetcode-JavaBase:Java一些类测试用例

    ArrayList和LinkedList的区别和删除时注意的点 7. Proxy 静态代理和动态代理 8. Reflection java 反射 9. Sort 多种排序方法 10. Sync synchronized 和 lock 的用法 11. Thread Thread创建、ThreadLocal用法、Deamon...

    map,list,set,stack,queue,vector等区别和特点1

    在Java编程语言中,集合框架是处理对象组织和操作的...在多线程环境中,线程安全的实现如Vector和Hashtable是必要的,但在单线程或性能要求较高的情况下,非线程安全的实现如ArrayList、LinkedList和HashMap通常更优。

    chapter7.zip

    chapter7可能会详细讲解这些接口和类的特性和用法,比如ArrayList与LinkedList的区别,HashSet和TreeSet的元素排序规则,以及HashMap和TreeMap如何存储键值对。 再者,Java的IO流系统提供了读写数据的能力,分为...

    Java中集合LinkedList的原理与使用方法

    本文将深入探讨LinkedList的原理和使用方法。 首先,LinkedList是一个双向链表,意味着每个元素(节点)都有指向前后元素的引用。这与ArrayList不同,ArrayList是基于数组实现的,对元素的添加和删除操作在数组末尾...

    10个Java经典的List面试题!.zip

    1. **List接口与ArrayList、LinkedList的区别** - List接口定义了有序集合,提供了按索引访问元素的方法。ArrayList基于动态数组实现,适用于随机访问,插入和删除操作相对较慢。LinkedList基于双向链表,插入和...

Global site tag (gtag.js) - Google Analytics