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。
分享到:
相关推荐
2. Vector和ArrayList、LinkedList区别? Hashtable 和 HashMap之间的区别 LinkedList内部以链表形式存储数据。 ArrayList内部以数组形式存储数据。 ? Vector同ArrayList,不过它与ArrayList比较起来是thread-safe...
1、注释尽可能全面,2、多次使用的相同变量最好归纳成常量,3、尽量少的在循环中执行方法调用,4、常量的定义可以放到接口中,5、ArrayList和LinkedList的选择, 6、String,StringBuffer和StringBuilder, 7、...
15.String、StringBuffer、StringBuilder区别以及使用场景 16.重载和重写的区别(区别无参构造和有参) 17.Java中异常处理机制 18.java中==equals有哪些区别 19.ArrayList和LinkedList有什么区别 20.Java面向对象有...
JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节。 String类能被继承吗,为什么。 String,Stringbuffer,StringBuilder的区别。 ArrayList和LinkedList有什么区别。
1. java.util.*包的UML结构图。 2. Vector和ArrayList、LinkedList区别? Hashtable 和 HashMap之间的区别 3. String、StringBuffer,StringBuilder之间区别。
ArrayList、LinkedList、HashMap、HashSet等:用于存储和操作集合数据,提供了丰富的方法来管理数据的增删改查操作。 IO类: FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等:用于进行文件...
2016,一些面试中出现率比较高的题,(来自蘑菇天堂) ...ArrayList和LinkedList有什么区别 类的实例化顺序、比如父类静态数据、构造函数、字段、子类静态数据、构造函数、字段、他们的执行顺序。。。。
38、run()和start()方法区别 39、如何控制某个方法允许并发访问线程的个数? 40、在Java中wait和seelp方法的不同 41-50题 41、谈谈wait/notify关键字的理解 42、什么导致线程阻塞?线程如何关闭? 43、如何...
JAVA面试题总览, 包含如下: ...4. ArrayList和LinkedList有什么区别。 5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字 段,当new的时候,他们的执行顺序。
在ArrayList和LinkedList尾部添加元素,谁的效率更高 如果HashMap或者hashTable的key是一个自定义的类该怎么办 为什么重写equals还要重写hashCode? 介绍一下volatile jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java...
(String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别、HashMap的底层...
LinkedList 优势,什么时候⽤,和arraylist的区别 等等 基本类型和包装类型的区别,涉及⾃动装箱和拆箱,怎么做的,原理 String ,StringBuffer,StringBuilder哪个是安全的 字符串编码的区别,被问到过,我觉得⽐较...
(String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别、HashMap的底层...
9、 String、StringBuffer、StringBuilder 的区别 10、 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 .............................................. ...............................................
4.4.2 使用StringBuilder和StringBuffer进行字符串连接 4.4.3 尽早释放无用对象的引用 4.4.4 尽量少用静态变量 4.4.5 避免在经常调用的方法、循环中创建Java对象 4.4.6 缓存经常使用的对象 4.4.7 尽量不要使用...
StringBuffer 1 StringBuilder 1 Boolean 2 Byte 2 Double 2 Float 2 Integer 2 Long 2 Short 2 Thread 2 ThreadLocal 2 Enum 3 Throwable 3 Error 3 Exception 3 Class 4 ClassLoader 4 Compiler 4 System 4 ...
003 Java中String、StringBuffer、StringBuilder的区别 004 Java中ArrayList与LinkedList的区别 005 Java的类的实例化顺序 006 Java 非线程安全的HashMap如何在多线程中使用 007 Java的参数传递是值传递还是引用传递...
(String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别、HashMap的底层...
StringBuilder/StringBuffer 正则表达式 ArrayList 和 LinkedList 对比:数组实现,按下标查找效率高,删除添加效率低; 链表实现,查找效率低,删除添加效率高(重新设置链表头尾) 13 .HashMap结构和原理 结构:...