- 浏览: 766636 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
webcover:
最新的中文网络记事本: 破笔记
网络记事本:http://w ...
五个最佳的免费网络记事本 -
fred_nxh:
很好,长见识了
java中堆(heap)和堆栈(stack)有什么区别 -
efeige:
兄弟,请问一下,为什么我的2003系统 网站属性 里面没有“服 ...
启用IIS Gzip 页面压缩技术 加速网页的浏览速度 -
252401762:
同样的问题啊,不知道楼主是否已经转做售前了
售前和 开发的选择 -
yuan:
膜拜玩静电的现在呢?
来回顾一下,当年的“发烧史”吧:
ArrayList和LinkedList的用法区别
(2009-10-10 18:02:21)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。
发表评论
-
ocx插件插入网页实现自动更新与安装注册
2010-07-27 16:17 6649ocx插件插入网页实现 ... -
JIRA
2010-04-02 16:28 1211JIRA 百科名片 JIRA是集项目计划、任务分配、需求管 ... -
Java 中Vector、ArrayList和LinkedList 的区别时间
2010-03-17 10:25 1732Java 中Vector、ArrayList和LinkedLi ... -
多层架构的Web开发框架模型
2010-03-14 00:31 1948摘要:在经典的J2EE四层体系结构的基础上增加数据持久层,提出 ... -
Java语言编码规范(Java Code Conventions
2010-03-08 01:17 8301 介绍(Introduction)1.1 为什么要有编码规范 ... -
IT 的规划
2010-02-21 21:07 764本文说的这位网友,在I ... -
记忆学
2010-02-10 00:50 676http://bbs.jiyifa.cn/read.php?t ... -
java析构函数替代者finalize()解说
2010-01-21 22:18 2556java析构函数替代者finali ... -
Java的GC机制总结(0) ---finalize()方法
2010-01-21 22:00 1216其实了解JAVA的人,都知道JAVA的GC机制是其的一大优点, ... -
Java认证考试
2010-01-14 12:30 849Java认证考试 关于Java方面,Sun推出四项认证:Su ... -
集合框架
2010-01-13 23:24 654java 集合框架 对象的集合 如果程序的 ... -
Java集合框架使用总结
2010-01-13 21:31 668Java集合框架使用总结 ... -
关于JAVA中的线程安全
2010-01-13 10:34 1549关于JAVA中的线程安全 ... -
Java 理论与实践: 并发集合类
2010-01-13 01:27 839DougLea的 util.concurrent 包除了包含许 ... -
java main 主函数
2010-01-10 14:28 2328java主函数一般定义如下:public static ... -
java新式for循环
2009-12-29 15:51 797java新式for循环 2008-08-04 13:48:2 ... -
2009年的Java技术发展趋势展望
2009-11-08 21:28 765已经有14岁的Java在日新月异的IT技术领域内不算年轻,但它 ... -
MyEclipse要注册
2009-11-07 18:37 1693yEclipse怎么注册都不知道。我说他没有注册,他硬要说已经 ... -
浅谈设计模式在JAVA中的具体运用
2009-10-27 23:32 948浅谈设计模式在JAVA ... -
BBSCS 代码阅读
2009-10-26 18:38 677发布的时候,出现乱码================== 如何 ...
相关推荐
### ArrayList、Vector、LinkedList 的区别与用法详解 在Java编程中,选择合适的数据结构对于程序的性能至关重要。本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解...
此外,对于Java Web开发,了解Tomcat、Cookie、Session以及localStorage和sessionStorage的区别和用法也是至关重要的。Tomcat是一款广泛使用的开源Java Servlet容器,它支持Servlet和JSP标准,是许多Java Web应用的...
ArrayList类是Java.util包中的一个成员,继承自AbstractList并实现了List接口,因此它支持随机访问,但插入和删除操作可能比基于链表的List实现(如LinkedList)效率低。 1. **ArrayList的概念** ArrayList是一个...
此外,ArrayList的查询效率不如LinkedList,因为ArrayList是通过索引访问,而LinkedList是通过节点遍历,所以在频繁插入和删除的情况下,LinkedList可能更为合适。 总之,ArrayList是Java中一种常用的列表数据结构...
Collection, List, Set 和 Map 用法和区别 Collection 是 Java 中的一种对象集合,提供了许多有用的方法来操作集合元素,例如添加、删除、遍历等。Collection 是一个接口,下面有两个子接口:List 和 Set。 List ...
最后,值得注意的是ArrayList与LinkedList之间的区别。LinkedList提供了更快的插入和删除速度,但访问元素的速度较慢,因为它需要从头或尾部开始遍历。因此,在选择容器类型时,需要根据应用场景来权衡。 总的来说...
这里我们将深入探讨ArrayList的用法和源码解析。 首先,ArrayList的主要优点在于它的灵活性。由于它是动态的,当需要添加或删除元素时,ArrayList会自动调整其容量以适应变化。这意味着你可以在任何位置插入或移除...
2. **ArrayList和LinkedList的区别** - **ArrayList**:基于动态数组实现,适合于随机访问和修改元素。由于它使用数组存储,所以插入和删除元素时需要移动大量元素,效率较低。 - **LinkedList**:基于链表结构,...
Java 集合框架中 List、Set、Map 的用法和区别 Java 集合框架(Java Collections Framework)是 Java 语言中的一个重要组件,提供了一些基本的数据结构和算法来操作和存储数据。其中,List、Set、Map 是三个非常...
通过学习这个项目,你不仅能了解ArrayList和LinkedList的基本用法,还能深入理解它们的实现细节,从而在实际编程中灵活运用,提高程序效率。同时,这也是对数据结构基础的巩固,有助于提升编程能力。
- 对于大规模数据的增删操作,考虑使用LinkedList,因为ArrayList的插入和删除操作在中间位置时效率较低。 了解并熟练运用这些知识点,能够帮助你在实际编程中更好地管理和操作ArrayList,提高代码的效率和可维护...
在Java编程语言中,`ArrayList`是`java.util`包中的一个类,它实现了可变大小的数组,也就是我们常说的动态数组。`ArrayList`是`List`...了解并熟练掌握`ArrayList`的特性和用法,对于编写高质量的Java代码至关重要。
Java中的ArrayList、LinkedList、HashSet和TreeSet等都是Collection的子接口或实现类。 **List接口** List接口继承自Collection,它是一个有序的容器,允许有重复元素。List接口提供了索引访问,可以通过索引来获取...
【Java ArrayList 使用与分析】 ArrayList 是 Java 集合框架中的一个重要组成部分,它是一个基于数组实现的可变大小的列表。...了解和熟练掌握 ArrayList 的用法对编写高性能的 Java 应用程序至关重要。
Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。...了解集合类的特点和用法可以帮助我们更好地编写代码。
ArrayList和LinkedList的区别和删除时注意的点 7. Proxy 静态代理和动态代理 8. Reflection java 反射 9. Sort 多种排序方法 10. Sync synchronized 和 lock 的用法 11. Thread Thread创建、ThreadLocal用法、Deamon...
在Java编程语言中,集合框架是处理对象组织和操作的...在多线程环境中,线程安全的实现如Vector和Hashtable是必要的,但在单线程或性能要求较高的情况下,非线程安全的实现如ArrayList、LinkedList和HashMap通常更优。
chapter7可能会详细讲解这些接口和类的特性和用法,比如ArrayList与LinkedList的区别,HashSet和TreeSet的元素排序规则,以及HashMap和TreeMap如何存储键值对。 再者,Java的IO流系统提供了读写数据的能力,分为...
本文将深入探讨LinkedList的原理和使用方法。 首先,LinkedList是一个双向链表,意味着每个元素(节点)都有指向前后元素的引用。这与ArrayList不同,ArrayList是基于数组实现的,对元素的添加和删除操作在数组末尾...
1. **List接口与ArrayList、LinkedList的区别** - List接口定义了有序集合,提供了按索引访问元素的方法。ArrayList基于动态数组实现,适用于随机访问,插入和删除操作相对较慢。LinkedList基于双向链表,插入和...