展开

关键词

ArrayList 为什么要实现 RandomAccess 接口?

接口,而 LinkedList 却没有实现 RandomAccess 接口,这是为什么呢? 接口中是空的,RandomAccess 接口又是什么呢? public interface RandomAccess {} RandomAccess 接口 RandomAccess 是一个标记接口,官方解释是只要 List 实现这个接口,就能支持快速随机访问 所以在这里通过实现 RandomAccess 接口来区分 List 的哪种实现类。 最后总结一句话:实现 RandomAccess 接口的 List 可以通过 for 循环来遍历数据比使用 iterator 遍历数据更高效,未实现 RandomAccess 接口的 List 可以通过

19510

JAVA之Collection(一):关于RandomAccess的讨论

在阅读Collectios类源码时,发现一些方法常常出现list instanceof RandomAccess的字样,下面以binarySearch为例: public static <T> super T>> list, T key) { if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD return mid; // key found } return -(low + 1); // key not found } 通过查看源代码发现,未实现RandomAccess 这时就需要用instanceof来判断List集合子类是否实现RandomAccess接口! 总结:RandomAccess虽然是个空接口,但通过这个接口可以判断时ArrayList还是LinkedList,从而选择更好的循环遍历方法,提高性能。

44900
  • 广告
    关闭

    腾讯云校园大使火热招募中!

    开学季邀新,赢腾讯内推实习机会

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ArrayList 为啥要实现 RandomAccess 接口?

    接口,而LinkedList却没有实现 RandomAccess接口,这是为什么呢? RandomAccess接口中是空的,RandomAccess接口又是什么呢? ? RandomAccess接口 RandomAccess是一个标记接口,官方解释是只要List实现这个接口,就能支持快速随机访问。而什么是随机访问呢? 接下来我们来举例说明。 上述两个方法的源码表示,实现了RandomAccess接口的List使用索引遍历,而未实现RandomAccess接口的List使用迭代器遍历。 那么为什么要这么设计呢? 所以在这里通过实现RandomAccess接口来区分List的哪种实现类。

    62710

    List,Set,Map三者的区别

    补充内容:RandomAccess接口 public interface RandomAccess { } 查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。 所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。 ,ArrayList 实现了 RandomAccess 接口,就表明了他具有快速随机访问功能。 RandomAccess 接口只是标识,并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机访问功能的! 下面再总结一下 list 的遍历方式选择: 实现了 RandomAccess 接口的list,优先选择普通 for 循环 ,其次 foreach, 未实现 RandomAccess接口的list,优先选择

    78710

    ArrayList 与 LinkedList 区别

    关于 RandomAccess 接口 public interface RandomAccess { } 查看源码可以看到, RandomAccess 接口中什么都没有定义。 super T>> list, T key) { if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD ArrayList 实现了 RandomAccess 接口,表明了具有快速随机访问的功能。 不过 RandomAccess 接口只是一个标识,并不是说 ArrayList 实现 RandomAccess 接口,才具有快速随机访问的功能! 总结 List 的遍历方式选择: 实现了 RandomAccess 接口的 list,优先选择普通 for 循环 ,其次 foreach; 未实现 RandomAccess 接口的 ist, 优先选择

    62220

    JDK10的新特性:var泛型和多个接口实现

    先看下他们的定义: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess , Cloneable, java.io.Serializable public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess , Cloneable, java.io.Serializable 我们可以看到ArrayList和CopyOnWriteArrayList都实现了List,RandomAccess,Cloneable 大家第一个想到的可能就是创建一个新的接口,继承List, RandomAccess, Cloneable, java.io.Serializable,然后createList返回该新创建的接口即可。 public interface ListInterface<E> extends List<E>, RandomAccess, Cloneable, java.io.Serializable {}

    18030

    Java 集合深入理解(6):AbstractList

    ) { return (this instanceof RandomAccess ? public interface RandomAccess { } RandomAccess 是一个空的接口,它用来标识某个类是否支持 随机访问(随机访问,相对比“按顺序访问”)。 通常在操作一个 List 对象时,通常会判断是否支持 随机访问,也就是* 是否为 RandomAccess 的实例*,从而使用不同的算法。 比如遍历,实现了 RandomAccess 的集合使用 get(): for (int i=0, n=list.size(); i < n; i++) list.get(i); 比用迭代器更快: for (Iterator i=list.iterator(); i.hasNext(); ) i.next(); 实现了 RandomAccess 接口的类有:

    413100

    <? extends T>与<? super T>的区别

    IndexOutOfBoundsException("Source does not fit in dest"); if (srcSize < COPY_THRESHOLD || (src instanceof RandomAccess && dest instanceof RandomAccess)) { for (int i=0; i<srcSize; i++) dest.set(i, src.get IndexOutOfBoundsException("Source does not fit in dest"); if (srcSize < COPY_THRESHOLD || (src instanceof RandomAccess && dest instanceof RandomAccess)) { for (int i=0; i<srcSize; i++) dest.set(i, src.get

    6920

    Collection 子接口之 List

    RandomAccess 接口 public interface RandomAccess { } 查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。 所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么?标识实现这个接口的类具有随机访问功能。 super T>> list, T key) { if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD) return ,ArrayList 实现了 RandomAccess 接口,就表明了他具有快速随机访问功能。 RandomAccess 接口只是标识,并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机访问功能的!

    16630

    Collection子接口之List

    RandomAccess 接口 public interface RandomAccess { } 查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。 所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。 super T>> list, T key) { if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD) return ,ArrayList 实现了 RandomAccess 接口,就表明了他具有快速随机访问功能。 RandomAccess 接口只是标识,并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机访问功能的!

    17010

    Java中普通for循环和增强for循环的一些区别

    循环的时候不能使用集合删除集合中的元素; 增强for循环不能使用迭代器中的方法,例如remove()方法删除元素; 与普通for循环的区别:增强For循环有遍历对象,普通for循环没有遍历对象; 对于实现了RandomAccess 接口的集合类,推荐使用普通for,这种方式faster than Iterator.next The RandomAccess interface identifies that a particular 参考资料 The For-Each Loop The RandomAccess Interface 增强for循环 For-each Loop

    83830

    List集合源码分析

    看一下源码: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable , java.io.Serializable 可以知道ArrayList中实现了RandomAccess这个接口,追踪一下: public interface RandomAccess { } what Random rnd) { int size = list.size(); if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess

    22630

    ​C++ STL源码剖析之知其然,知其所以然,源码面前了无秘密!

    RandomAccessIterator &i, Distance n, random_access_iterator_tag) { std::cout << "randomaccess p=NULL; advance(p,10); return 0; } 输出结果: input tag output tag forward tag bidrectional tag randomaccess tag randomaccess tag 一切如我们预期一样,通过萃取机,我们获得了每个迭代器的tag,以及原生指针的tag。 ) { std::cout << "bidrectional tag" << std::endl; return bidiectional_iterator_tag(); } // RandomAccess advance(RandomAccessIterator &i, Distance n, random_access_iterator_tag) { std::cout << "randomaccess

    74310

    关于Collections.shuffle()方法源码阅读

    java.util.Arrays; import java.util.List; import java.util.ListIterator; import java.util.Random; import java.util.RandomAccess * * 当 List 长度小于 SHUFFLE_THRESHOLD(定义为5)或者是 RandomAccess 的实例时,直接以 List 的数据结构进行打乱,否则转为数组再打乱,最后转储回 int size = list.size(); // if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess System.out.println("array: " + Arrays.toString(ia)); } } 当 List 长度小于 SHUFFLE_THRESHOLD(定义为5)或者是 RandomAccess

    7220

    JDK 工具类之 Collections

    If the specified list * does not implement the {@link RandomAccess} interface and is large, If the specified list * does not implement the {@link RandomAccess} interface and is large, If the specified list does not * implement the {@link RandomAccess} interface and is large, this If the specified list does not * implement the {@link RandomAccess} interface and is large, this extends T> list) { return (list instanceof RandomAccess ?

    6410

    AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

    在 subList 方法中我们发现在切分 子序列时会分为两类,RandomAccess or not 3.1 RandomAccess ? 等方法的时间复杂度都是 O(1) 反例就是 LinkedList, 链表结构使得它不支持随机访问,只能顺序访问,因此在一些操作上性能略逊一筹 通常在操作一个 List 对象时,通常会判断是否支持 随机访问,也就是是否为 RandomAccess 的实例,从而使用不同的算法 比如遍历,实现了 RandomAccess 的集合使用 get(): for (int i=0, n=list.size(); i < n; i++) list.get(i); 比用迭代器更快: for (Iterator i=list.iterator(); i.hasNext(); ) i.next(); 实现了 RandomAccess RandomAccessSubList 只不过是在 SubList 之外加了个 RandomAccess 的标识,表明他可以支持随机访问而已 AbstractList 作为 List 家族的中坚力量 既实现了

    1.3K20

    Kotlin之“ArrayList”

    这里的方法不包括从接口继承来的方法,AbstractMutableList<E>和RandomAccess的方法会单独介绍。 其中比较好玩的方法,一般都来自AbstractMutableList接口 出身 open class ArrayList<E> : AbstractMutableList<E>,RandomAccess 可以看出ArrayList实现了两个接口,其中: AbstractMutableList 使得它的集合长度可变,并且包含了作为一个List应该具备的基本方法 RandomAccess使得它支持快速索引

    1.4K20

    Laravel 5.0 之 ValidatesWhenResolved

    进行校验 // app/Http/Controllers/ValidatedController.php namespace App\Http\Controllers; use App\Random\RandomAccess Controller; use Response; class ValidatedController extends Controller { public function random(RandomAccess 有了路由之后, 我们来创建一个不继承 FormRequest 的验证类: // app/Random/RandomAccess.php namespace App\Random; use Exception ; use Illuminate\Contracts\Validation\ValidatesWhenResolved; use Illuminate\Http\Request; class RandomAccess

    56950

    Java 集合深入理解(8):AbstractSequentialList

    在 Java 集合深入理解:AbstractList 中我们介绍了 RandomAccess,里面提到,支持 RandomAccess 的对象,遍历时使用 get 比 迭代器更快。 而 AbstractSequentialList 只支持迭代器按顺序 访问,不支持 RandomAccess,所以遍历 AbstractSequentialList 的子类,使用 for 循环 get(

    53360

    java基础回顾--ArrayList和LinkedLIst异同

    两者之间异同是需要熟悉掌握,本小节对此部分知识点进行回顾 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { 说明: Deque是队列的接口,RandomAccess ② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n) 3 是否支持快速随机访问,ArrayList实现了RandomAccess

    6920

    扫码关注腾讯云开发者

    领取腾讯云代金券