天道酬勤,学无止境

Is it safe to perform read and "set" operation on List by different threads without locking mechanism

It is pretty unsafe to iterate over a List, which is being performed add / remove operation by another thread.

That's why we need need CopyOnWriteArrayList

public static void main(String[] args) throws InterruptedException {
    List<String> list = new ArrayList<>();

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                // java.util.ConcurrentModificationException
                for (String s : list) {
                    System.out.println(s);
                }
            }
        }

    });
    thread.start();

    for (int i=0; i<1000; i++) {
        list.add("string" + i);    
    }

    Thread.sleep(Long.MAX_VALUE);
}

However, how about set operation. Currently, the following code doesn't throw any exception.

public static void main(String[] args) throws InterruptedException {
    List<String> list = new ArrayList<>();
    list.add("dummy");

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                for (String s : list) {
                    System.out.println(s);
                }
            }
        }

    });
    thread.start();

    for (int i=0; i<1000; i++) {
        list.set(0, "smart");
    }

    Thread.sleep(Long.MAX_VALUE);
}

Even though there isn't any unexpected outcome, I was wondering, if the thread only performing set operation on the List, is it a good practice that we don't using any locking mechanism, or copy n write mechanism?

评论

Quoting the javadoc of ArrayList:

Note that this implementation is not synchronized. If multiple threads access an ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more elements, or explicitly resizes the backing array; merely setting the value of an element is not a structural modification.)

So no, it does not need to be synchronized.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 详细解释集合
    面试题:详细解释集合。接口、常用实现类、不同集合的关系关联、实现类的区别特性。可能的话,尽可能的关联其他技术;如:concurrent包、ThreadLocal、Redis底层字典。 接口 java.lang.Iterable–可迭代的 Collection接口继承了Iterable,可迭代的。线性容器 Map接口没有继承Iterable,不可以迭代的。迭代方式:必须是通过key、value、entry迭代。key的entry都是返回set;value是返回Collection。key不可重复。key的唯一保证是通过hashcode和equals实现的。 Collection的子接口 List:数据有序(写顺序),可重复。 Set :数据无序,不可重复。所有的实现都是基于Map的 Queue:jdk1.5出现的。队列集合(FIFO–先进先出),数据有序,可重复。 常用方法:add(新增在尾部),poll(删除,从头开始删除),peek(获取) 线程可见性:volatile关键字 List常用实现类 List的直接实现类AbstractList ArrayList:底层是数组实现的集合,查询效率高、在底层数组未满之前,add(Object obj)效率高、remove(int size-1)效率高、set效率高。随机add(int ,Objext)效率低、remove(int
  • # 全网最细 | 21张图带你领略集合的线程不安全
    本篇主要内容如下: 本篇所有示例代码已更新到 我的Github 本篇文章已收纳到我的Java在线文档 《Java并发必知必会》系列: 1.反制面试官 | 14张原理图 | 再也不怕被问 volatile! 2.程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单? 3.用积木讲解ABA原理 | 老婆居然又听懂了! 4.全网最细 | 21张图带你领略集合的线程不安全 一、线程不安全之ArrayList 集合框架有Map和Collection两大类,Collection下面有List、Set、Queue。List下面有ArrayList、Vector、LinkedList。如下图所示: JUC并发包下的集合类Collections有Queue、CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentMap 我们先来看看ArrayList。 1.1、ArrayList的底层初始化操作 首先我们来复习下ArrayList的使用,下面是初始化一个ArrayList,数组存放的是Integer类型的值。 new ArrayList<Integer>(); 那么底层做了什么操作呢? 1.2、ArrayList的底层原理 1.2.1 初始化数组 /** * Constructs an empty list with an initial capacity
  • # 全网最细 | 21张图带你领略集合的线程不安全
    全网最细 | 21张图带你领略集合的线程不安全本篇主要内容如下:本篇所有示例代码已更新到 我的Github本篇文章已收纳到我的Java在线文档《Java并发必知必会》系列:1.反制面试官 | 14张原理图 | 再也不怕被问 volatile!2.程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?3.用积木讲解ABA原理 | 老婆居然又听懂了!4.全网最细 | 21张图带你领略集合的线程不安全一、线程不安全之ArrayList集合框架有Map和Collection两大类,Collection下面有List、Set、Queue。List下面有ArrayList、Vector、LinkedList。如下图所示:JUC并发包下的集合类Collections有Queue、CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentMap我们先来看看ArrayList。1.1、ArrayList的底层初始化操作首先我们来复习下ArrayList的使用,下面是初始化一个ArrayList,数组存放的是Integer类型的值。new ArrayList<Integer>();那么底层做了什么操作呢?1.2、ArrayList的底层原理1.2.1 初始化数组/** * Constructs an empty list with an initial
  • Java面试题---多线程、IO、集合 部分
    1、ArrayList、Vector、LinkedList的存储性能和特性 ArrayList是以数组形式存储对象,在内存中找到一段连续的内存空间来存储数据,对于遍历和查询效率高; LinkedList是已链表的方式进行存储,将对象存储在独立的空间,每个空间保留数据的同时还保存了下一个空间的地址,对于插入和删除效率高; Vector和ArrayList实现原理和功能都是相同的,Vector使用了Synchronized方法,因此线程是同步安全的,但是效率要低于ArrayList 补充:ArrayList和Vector的区别? 同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的 数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 2、List、Set、Map是否继承自Collection接口? List,Set是继承自Collection接口,Map不是,Map是与Collection同等级的接口。 3、List、Map、Set三个接口存取元素时,各有什么特点? List允许数据重复,有序的,调用get(index i)来明确说明取第几个。 Set不允许重复数据,内部有排序,只能以Iterator接口取得所有的元素,再逐一遍历各个元素 Map是通过键值对存储数据,键是唯一的,值可以重复
  • Java编程拾遗『并发容器——CopyOnWrite』
    从本片文章开始我们来介绍并发容器类,之前的文章介绍过普通容器类,比如ArrayList、LinkedList等。但是这些容器都有个问题,就是非线程安全,多线程并发写,会存在线程安全问题,所以Java提供了并发容器类来解决普通容器类的线程安全问题。本篇文章我们先来看一种解决容器类线程安全的思想——CopyOnWrite(写时复制)。 1. 同步容器 在讲CopyOnWrite并发容器之前,先来介绍一下Java中提供的另一种用来解决容器线程安全问题的机制——同步容器。所谓同步容器,就是java.util.Collections类提供的基于普通容器类的包装类,它将普通容器类的方法都使用synchronized关键字重新实现了一遍,进而提供线程安全的容器类。Collections类提供一下获取同步容器的方法: public static <T> Collection<T> synchronizedCollection(Collection<T> c) public static <T> List<T> synchronizedList(List<T> list) public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 下面展示一下SynchronizedCollection的部分实现: static class
  • 多线程(5):Java多线程中的并发容器
    一、JDK提供的并发容器都有哪些 JDK提供的容器大多在 java.util.concurrent 包中。 ConcurrentHashMap:线程安全的HashMapCopyOnWriteArrayList:线程安全的List。在读多写少的场合性能非常好,远远好于VectorConcurrentLinkedQueue(非阻塞队列):线程安全的LinkedList。并发队列,非阻塞队列,使用链表实现BlockingQueue(阻塞队列):是一个接口,阻塞队列。通过链表、数组等方式实现,非常适合做数据共享的通道ConcurrentSkipListMap:调表的实现。是一个Map,使得调表的数据结构能快速查找 1.彻底搞懂ConcurrentHashMap(线程安全HashMap) 对读和写都能保证高性能:读操作时(几乎)不加锁,写操作时通过 锁分段技术 ,只对操作的段加锁而不影响客户端对其他段的访问。 (1)ConcurrentHashMap与Hashtable的区别 底层数据结构不同: ①JDK1.7的ConcurrentHashMap底层采用 分段数组+链表实现、JDK1.8采用数据结构跟HashMap一样的 数组+链表/红黑二叉树 实现。 ②Hashtable和JDK1.8之前的HashMap一样都是 数组+链表 实现。 注意:数组是HashMap主体
  • Java 集合底层原理剖析(List、Set、Map、Queue)
    Java 集合底层原理剖析(List、Set、Map、Queue) 温馨提示:下面是以 Java 8 版本进行讲解,除非有特定说明。 一、Java 集合介绍 Java 集合是一个存储相同类型数据的容器,类似数组,集合可以不指定长度,但是数组必须指定长度。集合类主要从 Collection 和 Map 两个根接口派生出来,比如常用的 ArrayList、LinkedList、HashMap、HashSet、ConcurrentHashMap 等等。 Collection 根接口框架结构图: Map 根接口框架结构图: 二、List 2.1 ArrayList ArrayList 是基于动态数组实现,容量能自动增长的集合。随机访问效率高,随机插入、随机删除效率低。线程不安全,多线程环境下可以使用 Collections.synchronizedList(list) 函数返回一个线程安全的 ArrayList 类,也可以使用 concurrent 并发包下的 CopyOnWriteArrayList 类。 动态数组,是指当数组容量不足以存放新的元素时,会创建新的数组,然后把原数组中的内容复制到新数组。 主要属性: //存储实际数据,使用transient修饰,序列化的时不会被保存 transient Object[] elementData; //元素的数量,即容量。 private
  • Java核心技术面试精讲(第八讲)| 对比Vector、ArrayList、LinkedList有何区别?
    我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的 C 语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java 则要方便的多,针对通用场景的需求,Java 提供了强大的集合框架,大大提高了开发者的生产力。 今天我要问你的是有关集合框架方面的问题,对比 Vector、ArrayList、LinkedList 有何区别? 典型回答 这三者都是实现集合框架中的 List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。 Vector 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。 ArrayList 是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与 Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容时会提高 1 倍,而 ArrayList 则是增加 50%。 LinkedList 顾名思义是 Java
  • Java后端面试题总结(模拟面试备春招)
    文章目录 Java基础线程与锁JUCJVM与GC中间件消息队列Redis Nginx计算机网络Mysql Java基础 重载和重写的区别 重载:同一个类里,方法名相同,return类型,参数列表可以不同 重写:主要发生在继承里,将父类的方法进行扩展。 String StringBuffer StringBuilder的区别是什么 可变性 String底层被final修饰,所以不可变长,每次改变它,都是创建一个新对象去赋值。StringBuilder和StringBuffer都是可变长的。 线程安不安全 String是被final修饰的,不可变,所以安全。 StringBuffer,底层有同步锁修饰方法,线程安全。 StringBuilder,比StringBuffer性能快一点,但是线程不安全。 自动装箱和拆箱 装箱:将基本类型用它们对应的引用类型包装起来。int->Integer 拆箱:将包装类型转换为基本数据类型。Integer->int ==与equals区别 ==这个符号,在基本数据类型里比的是值,引用数据类型比的是地址。 equals这个符号,单纯比较内容。 接口和抽象类的区别 (1)接口默认是public修饰,接口里不能写任何方法的实现,抽象类可以 (2)接口的实例变量的默认final修饰,抽象类不一定 (3)接口可以多实现,抽象类只能单继承 (4
  • 《java并发编程实战》总结
    第1章 简介 线程的优势: ①发挥多处理器的强大优势 ②建模的简单性 ③异步事件的简化处理④相应更灵敏的用户界面 线程带来的风险: ①安全性问②活跃性问题③性能问题 第2章 线程安全性 2.1什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 在线程安全的类中封装了必要的同步机制,因此客户端无需进一步采取同步措施。 无状态对象一定是线程安全的。 2.2原子性 2.2.1竞态条件 竞态条件:当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。换句话说,就是正确的结果要取决于运气。最常见的静态条件类型就是“先检查后执行(Check-Then-Act)”操作,即通过一个可能失效的观测结果来决定下一步的动作。 数据竞争:如果在访问非final类型的域时没有采用同步来进行协调,那么就会出现数据竞争。(JMM知识) 2.3加锁机制 2.3.1内置锁 Java提供了一种内置的锁机制来支持原子性synchronized 2.3.2重入 “重入”意味着获取锁的操作的粒度是“线程”,而不是“调用”。 如下面代码所示:如果没有“重入”,则产生死锁。 public class Widget{ public synchronized
  • 代码理解java多线程 (三) - JDK工具篇(5)- 并发容器集合 & CopyOnWrite容器
    目录 第十五章 并发容器集合 15.1 同步容器与并发容器 15.2 并发容器类介绍 15.2.1 并发Map 15.2.2 并发Queue 15.2.3 并发Set 第十六章 CopyOnWrite容器 16.1 什么是CopyOnWrite容器 16.2 CopyOnWriteArrayList 16.3 CopyOnWrite的业务中实现 第十五章 并发容器集合 15.1 同步容器与并发容器 我们知道在java.util包下提供了一些容器类,而Vector和HashTable是线程安全的容器类,但是这些容器实现同步的方式是通过对方法加锁(sychronized)方式实现的,这样读写均需要锁操作,导致性能低下。 而即使是Vector这样线程安全的类,在面对多线程下的复合操作的时候也是需要通过客户端加锁的方式保证原子性。如下面例子说明: public class TestVector {private Vector<String> vector; //方法一public Object getLast(Vector vector) {int lastIndex = vector.size() - 1;return vector.get(lastIndex);} //方法二public void deleteLast(Vector vector) {int lastIndex =
  • ArrayList和(List,LinkedList,数组) 以及 Hastable和Dictionary 的区别 以及 拆装箱
    ArrayList和LinkedList的区别:(单个元素) 1、ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表的数据结构。 2.、对于随机访问get(查询)和set(修改),ArrayList是优于LinkedList,因为LinkedList要移动指针。 3. 对于新增和删除操作add(添加)和remove(删除),LinekList比较占优势,因为ArrayList要移动数据 ArrayList和List的区别: ArrayList添加成员过程中中会发生拆装箱操作,可以插入类型不同的值,因为他的传参是object类型的,当我们获取不当时,会报类型不匹配这样的错误! List在给它添加成员的时候不会发生拆装箱,只能插入类型相同的值,可以确保类型安全 ArrayList arrayList=new ArrayList(); arrayList.Add(1); //发生装箱操作 List<int> list=new list<int>(); list.Add(1); //未发生装箱操作 数组的优缺点: int[] ints=new int[2]; ints[0]=2 ints[1]=3 优点:索引速度非常快,而且赋值与修改元素也很简单,直接根据索引找到对象来进行操作即可! 缺点:在数组的两个数据间插入数据是很麻烦的
  • 【不失业计划】 Java集合框架+底层原理
    集合框架部分 一、Collection1、Set2、Queue3、List 二、Map1、HashMap2、LinkedHashMap3、HashTable4、ConcurrentHashMap5、TreeMap 三、工具类1、Collections2、Arrays3、各种转换 集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。 Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。 数组与集合的区别: 数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。 一、Collection 1、Set Set是一种不包含重复元素的Collection,Set最多只有一个null元素。 HashSet:线程不同步,内部使用HashMap进行数据存储,提供的方法基本都是调用HashMap的方法,所以两者本质是一样的,集合元素可以为null
  • Java基本知识要点总结
    Java基础 Java入门Java语法基本数据类型方法(函数)类和对象面向对象三大特征修饰符接口和抽象类其他重要知识点(BigDecimal/Arrays.asList等)集合异常多线程文件与I/O流枚举Java 常见关键字总结:final、static、this、super什么是反射机制?反射机制的应用场景有哪些?参考 Java基础知识 Java 教程 Java8 Lambda表达式详解手册及实例 JAVA8 STREAM新特性详解及实战 如何在Java中将int []转换为Integer []? Java8 方式解决Stream流转其他数组 idea中java程序打jar包的两种方式(超详细) Java疑难点 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较? Java容器 Java集合概述说说 List,Set,Map 三者的区别?如何选用集合?Iterator 迭代器有哪些集合是线程不安全的?怎么解决呢?Arraylist 和 Vector 的区别?Arraylist 与 LinkedList 区别?说一说 ArrayList 的扩容机制吧ArrayList如何进行数组拷贝,深拷贝和浅拷贝Comparable 和 Comparator 的区别比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同HashMap 和
  • OPPO面试面经
    第一次面试给了OPPO 效果不是很满意,感觉自己开始上来状态就不行,紧张的自我介绍都结结巴巴,太需要克服这点了,然后后面面试官问的题偏数据库较多一点,但恰巧这边我只是会增删改查,毫无理论可言,虽说面试官问的知识点我都看过之前,有些没答上来,有些答的时候还是答的不够全面,条理也不够清晰,另外自己总是带一些,好像是。。。。,可能是这个。。。的字眼,自我感觉非常的不好,哎,不开心。 Mysql常用的存储引擎 MyISAM是MySQL存储引擎之一,不支持数据库事务、行级锁、和外键。因此在INSERT或UPDATE数据即写操作时需要锁定整个表,效率会很低 InnoDB为MySQL提供了事务支持、回滚、崩溃修复能力、多版本并发控制、事务安全的操作。 InnoDB有什么特性 InnoDB引擎特点 1.支持事务,支持4个事务隔离级别,支持多版本读。 2.行级锁定(更新时一般是锁定当前行),通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。 3.读写阻塞与事务隔离级别相关。 4.具有非常高效的缓存特性:能缓存索引,也能缓存数据。 5.整个表和主键以Cluster方式存储,组成一个平衡树。 6.所有Secondary Index都会保存主键信息。 7.支持分区,表空间,类似oracle数据库。 8.支持外键约束,5.5之前不支持全文索引,5.5之后支持外键索引。 小结:supports
  • 可以列出被多个线程访问?(Can a List<t> be accessed by multiple threads?)
    问题 我打算在多个线程之间共享一个列表。 该列表将在更改期间被锁定,这种情况很少发生。 如果从不同线程同时通过列表进行多次迭代,是否存在线程安全问题? 回答1 如果可以(如果可以使用 .NET 4),请使用 BlockingCollection<T>: 为实现IProducerConsumerCollection<T>线程安全集合提供阻塞和边界功能。 如果没有,则完全封装列表并添加访问List<T>'s状态的线程安全方法。 不要公开对列表的引用或从任何方法返回它 - 始终封装引用,以便您可以保证锁定对它的所有访问。 回答2 List<T> 不是线程安全类,但如果每次读/写时都锁定它,就不会有任何问题。 根据文档: 此类型的公共静态(在 Visual Basic 中为共享)成员是线程安全的。 不保证任何实例成员都是线程安全的。 一个List<T>可以同时支持多个读取器,只要不修改集合即可。 通过集合进行枚举本质上不是线程安全的过程。 在枚举与一个或多个写访问争用的罕见情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合。 要允许多个线程访问集合进行读写,您必须实现自己的同步。 回答3 List<T>通常不是线程安全的。 拥有多个阅读器不会导致任何问题,但是,您无法在读取列表时对其进行写入。 因此,您需要锁定读取和写入或使用类似System.Threading
  • Java核心技术面试精讲 - 第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
    这系列相关博客,转载 Java核心技术面试精讲 想看更多相关内容,可以去这里 Java核心技术面试精讲 - 目录 Java核心技术面试精讲 - 第8讲 | 对比Vector、ArrayList、LinkedList有何区别? 典型回答考点分析知识扩展一课一练 我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的C语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java则要方便的多,针对通用场景的需求,Java提供了强大的集合框架,大大提高了开发者的生产力。 今天我要问你的是有关集合框架方面的问题,对比Vector、ArrayList, LinkedList有何区别? 典型回答 这三者都是实现集合框架中的List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。 Vector是Java早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。 ArrayList是应用更加广泛的动态数组实现,它本身不是线程安全的
  • Java基础知识(九)——Java容器
    1、Java Collections 框架是什么 Java Collections框架中包含了大量集合接口以及这些接口的实现类和操作它们的算法(例如排序、查找、反转、替换、复制、取最小元素、取最大元素等),具体而言,主要提供了List(列表)、Queue(队列)、Set(集合)、Stack(栈)和Map(映射表,用于存放键值对)等数据结构。其中,List、Queue、Set、Stack都继承自Collection接口。 Collection是整个集合框架的基础,它里面储存一组对象,表示不同类型的Collections,它的作用只是提供维护一组对象的基本接口而已。 下面分别介绍Set、List和Map3个接口。 1)Set表示数学意义上的集合概念。 其最主要的特点是集合中的元素不能重复,因此存入Set的每个元素都必须定义equals()方法来确保对象的唯一性。该接口有两个实现类:HashSet和TreeSet。其中TreeSet实现了SortedSet接口,因此TreeSet容器中的元素是有序的。 2)List又称为有序的Collection。 它按对象进入的顺序保存对象,所以它能对列表中的每个元素的插入和删除位置进行精确的控制。同时,它可以保存重复的对象。LinkedList、ArrayList和Vector 都实现了List接口。 3)Map提供了一个从键映射到值的数据结构。
  • 常考集合面试题-List接口(二)
    List接口目录其他文章地址1.1、迭代器 Iterator 是什么?1.2、Iterator 怎么使用?有什么特点?1.3、如何边遍历边移除Collection 中的元素?1.4、Iterator 和 ListIterator 有什么区别?1.5、遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?1.6、说一下 ArrayList 的优缺点1.7、如何实现数组和 List 之间的转换?1.8、ArrayList 和 LinkedList 的区别是什么?1.9、ArrayList 和 Vector 的区别是什么?1.10、插入数据时,ArrayList、LinkedList、Vector谁速度较快?阐述 ArrayList、Vector、LinkedList 的存储性能和特性?1.11、多线程场景下如何使用ArrayList?1.12为什么 ArrayList 的elementData 加上 transient 修饰?1.13、List 和 Set 的区别1、List接口其他文章地址常考集合面试题(一)常考集合面试题-List接口(二)常考集合面试题之Set-Queue(三)常考集合面试题之Map(四)常考集合面试题-辅助工具(五)1、List接口1.1、迭代器 Iterator 是什么?terator 接口提供遍历任何
  • java集合(一)常见问题
    java集合(一)常见问题 0. java集合框架1. 说说List,Set,Map三者的区别?2. Arraylist 与 LinkedList 区别?3.ArrayList 与 Vector 区别呢?为什么要⽤Arraylist取代Vector呢?4. HashMap 和 Hashtable 的区别5. HashMap 的长度为什么是2的幂次方6. HashMap 和 HashSet区别7. HashSet是如何检查重复的?8. HashMap的底层实现9. ConcurrentHashMap 和 Hashtable 的区别10. 集合和数组的区别11.常用的集合底层的数据结构?12. Java集合的快速失败机制 “fail-fast”?13.Iterator 怎么使用?有什么特点?14.如何边遍历边移除 Collection 中的元素?15. 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?16.如何实现数组和 List 之间的转换?17.多线程场景下如何使用 ArrayList?18.BlockingQueue是什么?19.在 Queue 中 poll()和 remove()有什么区别?20.详解HashMap的实现原理? 0. java集合框架 Java集合主要有4个部分:List列表、Set集合、Map映射