`
jiagyao
  • 浏览: 99349 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ArrayList和LinkedList ,stringBuffer和StringBuilder的用法区别

阅读更多
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);


    /**//*分别insert200000条数据到linkedlist和arraylist
    *由于是在末尾插入数据,arraylist的速度比linkedlist的速度反而要快
    */
    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);
    }


/**//*delete linkedlist和arraylist中的200000条数据
    *由于是在末尾删除数据,arraylist的速度比linkedlist的速度反而要快
    */
    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。



分享到:
评论

相关推荐

    阿里巴巴 java面试题

    涵盖 Java 集合框架、Hashtable 与 HashMap 的区别、ArrayList 和 LinkedList 的区别、Properties 类的特点、线程安全、Struts2 框架、反射机制、线程池、Tomcat 配置、Java 优化、Servlet 规范、StringBuffer 与 ...

    Java初级开发技术面试题.docx

    Java 作为一门流行的编程语言,其面试题涵盖了多个方面,本文将从 String 和 StringBuffer、StringBuilder 的区别、Java 的堆、栈、方法区、==、toString 方法和 equals 方法、ArrayList 和 LinkedList 的区别、...

    面试必问Java面试题,对标初级Java

    15.String、StringBuffer、StringBuilder区别以及使用场景 16.重载和重写的区别(区别无参构造和有参) 17.Java中异常处理机制 18.java中==equals有哪些区别 19.ArrayList和LinkedList有什么区别 20.Java面向对象有...

    JavaSE.docx

    JavaSE/docx JavaSE 是 Java 标准版,涵盖了 Java 基础知识点。下面是根据提供的文件信息,...* String、StringBuffer 和 StringBuilder 的异同 * Java 数组与集合的比较 * ArrayList 与 LinkedList 的比较存储结构

    Java重点面试题 – 针对java面试过程中经常遇到的一些试题进行总结.docx

    Java编程语言在面试中常常涉及一系列关键概念,这些概念包括方法的重载(overload)与覆盖(override)、接口与抽象类的区别、String、StringBuffer与StringBuilder的特性比较、ArrayList、LinkedList与Vector的差异、...

    阿里巴巴Java方向面试题汇总(含答案).pdf

    在 Java 面试中,了解 String、 StringBuffer 和 StringBuilder 的区别是非常重要的。String 是不可变的,因为它在 JDK 中被声明为 final 类,而 StringBuffer 和 StringBuilder 是可变的,因为它们的字符内容可以...

    面试的经典程序(String,StringBuffer,list,Connections)

    `ArrayList`基于数组实现,提供快速的随机访问,而`LinkedList`使用双向链表,插入和删除操作更高效。`List`接口的常用方法包括`add()`添加元素,`remove()`移除元素,以及`get()`获取指定位置的元素。 最后,提到...

    Java基础高频的面试题,看这一篇就够了

    1. ArrayList和LinkedList的区别 * ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。 * 对于随机访问ArrayList要优于LinkedList。 * 对于插入和删除操作,LinkedList要优于ArrayList。 2. TreeSet和...

    基础深化和提高-常用类

    ArrayList、LinkedList、HashMap、HashSet等:用于存储和操作集合数据,提供了丰富的方法来管理数据的增删改查操作。 IO类: FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等:用于进行文件...

    阿里java常考面试题及汇总答案.docx

    一、关于String、StringBuffer和StringBuilder的区别: - String是不可变对象,一旦创建就无法改变,这归因于其final类的特性,提供高效且安全的字符串操作。 - StringBuffer和StringBuilder都是可变的字符串类,...

    Java初级面试题.docx

    这里我们将深入探讨Java中创建线程的方式、线程池的状态、JDK、JRE、JVM的区别、对象的哈希码与equals方法的关系、字符串类的区别、泛型中的extends和super、==与equals方法的区别、重载与重写的概念,以及集合框架...

    2019互联网meet第2季1

    总结以上,String适用于字符串不变性需求,StringBuilder用于单线程环境下的字符串操作,StringBuffer用于多线程环境,ArrayList适合快速随机访问,LinkedList适合频繁插入和删除,session用于服务器端的身份验证,...

    职来职往Java万字入门面试题

    以及hashCode()和equals()的关系,String、StringBuffer、StringBuilder的区别,泛型中extends和super的含义,==和equals方法的区别,重载与重写的概念,List和Set的特性,ArrayList与LinkedList的不同,以及String...

    BATjava面试含答案

    2. ArrayList 和 LinkedList 的使用场景不同,ArrayList 适合查询较多的场合,LinkedList 适合插入较多的场合。 3. Vector 是 List 接口下线程安全的集合,但是它已经被废弃了。 4. 使用 List 自身的 sort 方法,...

    淘宝java面试题.pdf

    以下是对【标题】“淘宝java面试题.pdf”中提及的两个知识点——`String`、`StringBuffer`、`StringBuilder`的区别以及`Vector`、`ArrayList`、`LinkedList`的区别进行详细解释: 一、`String`、`StringBuffer`、`...

    一些面试中出现率比较高的题

    2016,一些面试中出现率比较高的题,(来自蘑菇天堂) ...ArrayList和LinkedList有什么区别 类的实例化顺序、比如父类静态数据、构造函数、字段、子类静态数据、构造函数、字段、他们的执行顺序。。。。

    java面试题.pdf

    4. String、StringBuffer、StringBuilder 的区别:String 是不可变字符串,StringBuffer 和 StringBuilder 是可变字符串,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。 5. 重载和重写的区别:重载...

    java面试题-读书笔记-面试失败一次就记录一次的坑-不知不觉已经这么多了.docx

    1. **String, StringBuffer, StringBuilder的区别** - **String** 是一个不可变类,意味着一旦创建,其内容就不能更改。这是由于String在Java中被声明为final,确保了它的不可变性。 - **StringBuffer** 和 **...

    javacore测试题及参考答案

    StringBuffer 和 StringBuilder 提供了可变字符串,适合在多线程或频繁修改字符串时使用。StringBuilder 是非线程安全的,而 StringBuffer 在多线程环境中更安全,但在单线程环境下,StringBuilder 效率更高。 4. *...

Global site tag (gtag.js) - Google Analytics