- 浏览: 1399803 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (346)
- linux (10)
- hbase (50)
- hadoop (23)
- java (52)
- java multi-thread (13)
- Oracle小记 (41)
- 机器学习 (12)
- 数据结构 (10)
- hadoop hive (16)
- java io (4)
- jms (1)
- web css (1)
- kafka (19)
- xml (2)
- j2ee (1)
- spring (6)
- ibatis (2)
- mysql (3)
- ext (3)
- lucene (3)
- hadoop pig (3)
- java nio (3)
- twemproxy (1)
- antlr (2)
- maven (6)
- mina (1)
- 列数据库 (1)
- oozie (2)
- mongodb (0)
- 报错 (0)
- jetty (1)
- neo4j (1)
- zookeeper (2)
- 数据挖掘 (3)
- jvm (1)
- 数据仓库 (4)
- shell (3)
- mahout (1)
- python (9)
- yarn (3)
- storm (6)
- scala (2)
- spark (5)
- tachyon (1)
最新评论
-
guokaiwhu:
赞啊!今晚遇到相同的问题,正追根溯源,就找到了博主!
hbase 报错gc wal.FSHLog: Error while AsyncSyncer sync, request close of hlog YouAr -
喁喁不止:
很清楚,有帮助。
hive常用函数 -
dsxwjhf:
Good job !!
kafka获得最新partition offset -
Locker.Xai:
参考了
freemaker教程 -
maoweiwer:
为啥EPHEMERAL_SEQUENTIAL类型的节点并没有自 ...
zookeeper 入门讲解实例 转
RandomAccess 是判断集合是否支持快速随即访问,以下是个测试用例:
(转发http://jianchen.iteye.com/blog/291047)
JDK中推荐的是对List集合尽量要实现RandomAccess接口
如果集合类是RandomAccess的实现,则尽量用for(int i = 0; i < size; i++) 来遍历而不要用Iterator迭代器来遍历,在效率上要差一些。反过来,如果List是Sequence List,则最好用迭代器来进行迭代。
JDK中说的很清楚,在对List特别是Huge size的List的遍历算法中,要尽量来判断是属于RandomAccess(如ArrayList)还是Sequence List (如LinkedList),因为适合RandomAccess List的遍历算法,用在Sequence List上就差别很大,常用的作法就是:
要作一个判断:
if (list instance of RandomAccess) {
for(int m = 0; m < list.size(); m++){}
}else{
Iterator iter = list.iterator();
while(iter.hasNext()){}
}
验证:
- <span style="font-size: small;">/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
- package testrandomaccess;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.RandomAccess;
- /**
- *
- * @author bolong
- */
- public class TestRandomAccess {
- // 初始化列表
- public static void initList(List list, int n) {
- for (int i = 0; i < n; i++) {
- list.add(i);
- }
- }
- //使用循环进行对列表的迭代
- public static void traverseWithLoop(List list) {
- long starttime = 0;
- long endtime = 0;
- starttime = System.currentTimeMillis();
- for (int count = 0; count <= 1000; count++) {
- for (int i = 0; i < list.size(); i++) {
- list.get(i);
- }
- }
- endtime = System.currentTimeMillis();
- System.out.println("使用loop迭代一共花了" + (endtime - starttime) + "ms时间");
- }
- //使用迭代器对列表进行迭代
- public static void traverseWithIterator(List list) {
- long starttime = 0;
- long endtime = 0;
- starttime = System.currentTimeMillis();
- for (int count = 0; count <= 1000; count++) {
- for (Iterator itr = list.iterator(); itr.hasNext();) {
- itr.next();
- }
- }
- endtime = System.currentTimeMillis();
- System.out.println("使用Iterator迭代一共花了" + (endtime - starttime) + "ms时间");
- }
- public static void traverse(List list) {
- long starttime = 0;
- long endtime = 0;
- if (list instanceof RandomAccess) {
- System.out.println("该list实现了RandomAccess接口");
- starttime = System.currentTimeMillis();
- for (int count = 0; count <= 1000; count++) {
- for (int i = 0; i < list.size(); i++) {
- list.get(i);
- }
- }
- endtime = System.currentTimeMillis();
- System.out.println("迭代一共花了" + (endtime - starttime) + "ms时间");
- } else {
- System.out.println("该list未实现RandomAccess接口");
- starttime = System.currentTimeMillis();
- for (int count = 0; count <= 1000; count++) {
- for (Iterator itr = list.iterator(); itr.hasNext();) {
- itr.next();
- }
- }
- endtime = System.currentTimeMillis();
- System.out.println("迭代一共花了" + (endtime - starttime) + "ms时间");
- }
- }
- public static void main(String[] args) {
- ArrayList arraylist = new ArrayList();
- LinkedList linkedlist = new LinkedList();
- initList(arraylist, 1000);
- initList(linkedlist, 1000);
- traverse(arraylist);
- traverse(linkedlist);
- traverseWithIterator(arraylist);
- traverseWithLoop(arraylist);
- traverseWithIterator(linkedlist);
- traverseWithLoop(linkedlist);
- }
- }
- </span>
运行程序输出的结果为:
该list实现了RandomAccess接口
迭代一共花了47ms时间
该list未实现RandomAccess接口
迭代一共花了15ms时间
使用Iterator迭代一共花了79ms时间
使用loop迭代一共花了46ms时间
使用Iterator迭代一共花了47ms时间
使用loop迭代一共花了797ms时间
结论:
根据程序输出的结果的确证明了,arraylist等实现了RandomAccessj接口的类在进行迭代时使用loop效率更高,而linkedList那些未实现该接口的类在进行迭代时使用Iterator进行迭代效率更高.
发表评论
-
java内存使用查看 转
2015-10-29 14:51 876转:http://mxsfengg.iteye.com ... -
Java线上应用故障排查之二:高内存占用
2015-08-17 16:28 0搞Java开发的,经常会碰到下面两种异常: 1、java. ... -
java filechannel
2015-08-14 15:42 1059Java NIO中的FileChannel是一个连接到文件 ... -
Java线上应用故障排查之一:高CPU占用
2015-08-06 13:58 6191转http://blog.csdn.net/blade20 ... -
java注释
2015-04-10 15:49 0Java注解是附加在代码中的一些元信息,用于一些工具在编译、 ... -
转jvm
2015-03-24 14:13 1678一、回顾JVM内存分配 ... -
java 域名转换
2014-12-22 11:05 771import java.net.InetAddres ... -
freemaker教程
2014-10-13 11:56 1985新换了工作,与想象差距也太大了 最近沦落到做报表了,我就 ... -
protocal buffers入门实例
2014-09-22 21:08 1663hadoop yarn中新的系列化protocol buf ... -
正则小计
2014-09-18 20:47 0&site=(.*?)&可以匹配site的值 ... -
在HBase中应用MemStore-Local Allocation Buffers解决Full GC问题
2014-06-13 23:05 1610译者注:上个月 ... -
java ipc 实例
2014-05-21 22:59 4888java ipc实例,仿照hadoop ipc写的实例 1 ... -
java worker thread模式
2014-03-25 22:46 1983转两个帖子 一个java wo ... -
bloom filter
2014-03-09 19:41 1959看到hadoop join和hbase都有bloo ... -
java reference
2014-03-09 17:49 718转 http://www.iteye.com/to ... -
annotation实例
2014-02-11 22:04 1144加载指定目录的所有class,通过注释区分实体类 p ... -
java获取子类 转
2014-02-11 16:58 3131获取子类 package com.tools; ... -
动态代理
2013-08-14 20:38 1088动态代理,转:http://langyu.iteye. ... -
java byte inputstream and outputstream
2013-02-18 11:47 0转http://blog.csdn.net/rcoder ... -
JVM同步浅析
2013-01-11 11:38 1658堆 (所有类的实例或 ...
相关推荐
综上所述,`RandomAccess`接口是Java集合框架中优化遍历性能的关键,尤其是在处理大量数据时。开发者应当了解这个接口并合理利用,以提高代码的执行效率。对于支持`RandomAccess`的`List`,应优先考虑使用索引访问,...
- `ArrayList`和`Vector`实现了`RandomAccess`接口,支持快速随机访问。 - `HashSet`和`HashMap`遍历顺序不确定,而`LinkedHashSet`和`LinkedHashMap`按照插入顺序遍历。 - `TreeSet`和`TreeMap`元素按自然顺序...
ArrayList和Vector都继承自AbstractList,实现了List接口,同时也实现了RandomAccess接口,表明它们支持快速随机访问。LinkedList则直接实现了List接口,没有实现RandomAccess,因为它不支持快速随机访问。 总结...
ArrayList实现了RandomAccess接口,支持高效随机访问,通过索引直接获取元素。 - **遍历效率**:使用迭代器(Iterator或ListIterator)遍历效率较低,因为需要不断检查和修改内部指针;而通过for循环或for-each循环...
它实现了 RandomAccess 接口,因此支持随机访问。ArrayList 的默认大小为 10,添加元素时使用 ensureCapacityInternal() 方法来保证容量足够,如果不够时,需要使用 grow() 方法进行扩容,新容量的大小为 ...
- `ArrayList`和`Vector`都实现了RandomAccess接口,支持快速随机访问。 - 遍历HashSet和HashMap时,顺序不确定,但添加和删除速度快。LinkedHashSet和LinkedHashMap则按插入顺序遍历。 - TreeSet和TreeMap保证...
而由于继承自AbstractList,ArrayList可以直接使用索引访问其元素,实现了RandomAccess接口,表明它支持高效的随机访问。 总之,Java.util.ArrayList是Java编程中非常重要的数据结构,它提供了一种动态、高效的方式...
在遍历List集合时,如果List实现了RandomAccess接口,使用for循环通常会比使用迭代器更高效。 #### 16. 对象实例化优化 频繁地实例化同一个类型的新对象会增加垃圾回收的负担,可以考虑使用对象池来优化。 #### 17...
在Collections工具类的某些算法中,例如二分查找,会根据对象是否实现RandomAccess接口来选择使用索引还是迭代器的方式进行查找,前者效率更高。这是因为ArrayList底层基于数组,可以通过索引直接访问,而LinkedList...
这是因为非`RandomAccess`列表的随机访问效率较低,而数组操作更快。 对于实现了`RandomAccess`接口的列表(如`ArrayList`),可以直接在列表上进行操作,因为它们支持高效的随机访问。这个优化提高了性能,避免了...
- **实现接口**:ArrayList 实现了 `java.util.List`、`java.util.RandomAccess` 和 `java.util.Iterator` 等接口,提供了丰富的操作方法。 - **性能考虑**:ArrayList 的操作速度通常比 LinkedList 快,因为它是...
1. 数据随机访问(Random Access):由于具有固定大小和连续内存分配,可以通过索引快速查找和修改特定位置上的元素。 2. 空间效率高:无需额外空间来保存链接或指针信息。 Array的缺点包括: 1. 大小固定:因为...
- **RandomAccess接口**:`ArrayList`和`Vector`都实现了这个接口,意味着它们支持快速随机访问。 - **遍历顺序**:`HashSet`和`HashMap`在遍历时顺序是不确定的,而`LinkedHashSet`和`LinkedHashMap`则按照元素的...
与Java不同的是,C++的迭代器有多种类型,如input_iterator、output_iterator、forward_iterator、bidirectional_iterator和random_access_iterator,分别对应不同的操作能力。 在面试中,了解并能熟练运用这些基本...
在`Collections.synchronizedList`的源码中,可以看到它会根据传入的列表是否实现了`RandomAccess`接口,选择不同的内部类进行包装。如果实现了`RandomAccess`,它会选择`SynchronizedRandomAccessList`,否则选择`...
其中,RandomAccess接口表明ArrayList支持高效的随机访问,而在遍历过程中如果元素数量发生改变(比如另一个线程添加或删除元素),则会抛出ConcurrentModificationException。 在ArrayList的`add()`方法中,如果...
if (size || list instanceof RandomAccess) { for (int i=size; i>1; i--) list.set(i, list.set(random.nextInt(i), list.get(i-1))); } else { Object[] array = list.toArray(); shuffle(array, r); ...
- **类的继承关系**:`CopyOnWriteArrayList`继承自`AbstractList`并实现了`List`、`RandomAccess`、`Cloneable`和`Serializable`接口。其中,`RandomAccess`接口表明该集合支持高效的随机访问,`Cloneable`和`...
在Java中,`java.util.Random`类提供了生成随机数的功能。 #### Collection 集合,是Java中一组存储和操作对象的容器类的统称。`java.util.Collection`接口定义了集合的基本行为。 #### ArrayList 数组列表,是一...
由于ArrayList实现了RandomAccess接口,这种方式效率较高。 ```java for (int i = 0; i (); i++) { value = (Integer) list.get(i); } ``` 3. 使用增强的for循环遍历,简洁且易于理解。 ```java for (Integer integ...