前言集合作为Java基础知识的核心部分,不论是在面试还是平时工作中都是经常遇见的。当然面对熟悉的List、Set、Map,面试管的提问一般也都不会从简单的问题出发了,今天就来聊下集合中的高级部分,让你对它们的理解更加清楚。

一、List、Map、Set三个接口,存取元素时,各有什么特点?

(1)Set集合的add有一个boolean类型的返回值,当集合中没有某个元素时,则可以成功加入该 元素,返回结果为true;当集合中存在与某个元素equals方法相等 的元素时,则无法加入该元素, 取元素时只能用Iterator接口取得所有元素,在逐一遍历各个元素;

(2)List表示有先后顺序的集合,调用add()方法,指定当前对象在集合中的存放位置;一个对象可 以被反复存进集合中;每调用一次add()方法,该对象就会被插入集合中一次,其实,并不是把对 象本身存进了集合中,而是在集合中使用一个索引变量指向了该对象,当一个对象被add多次时, 即有多个索引指向了这个对象。List去元素时可以使用Iterator取出所有元素,在逐一遍历,还可 以使用get(int index)获取指定下表的元素;

(3)Map是双列元素的集合,调用put(key,value),要存储一对key/value,不能存储重复的key, 这个是根据eauals来判断;取元素时用get(key)来获取key所对 应的value,另外还可以获取 全部key,全部value。

二. ArrayList 遍历方式

  • 第 1 种,普通 for 循环随机访问,通过索引值去遍历。

// 随机访问     List list = new ArrayList<>();     int size = list.size();     for (int i = 0; i < size; i++) {         value = list.get(i);     }
  • 第 2 种,通过迭代器遍历。即通过 Iterator 去遍历。

// 迭代器遍历    Iterator iter = list.iterator();    while (iter.hasNext()) {        value = iter.next();    }
  • 第 3 种,增强 for 循环遍历。

 // 增强 for 循环    for (String s : list) {        value = s;    }
  • 第 4 种 forEach + lambda 循环遍历

list.forEach(p -> {                p.hashCode();            });

结论:如果数据量比较少的话貌似四种循环耗时都差不多,但是随着数据量的增长会发现 foreach 的效率是最好的。但是从上面我们会发现一个奇怪的现象,第一次循环的时候forEach遍历的时间是最长的尽管数据量非常少也会这样。但是后面的耗时就正常了。如果放开测试里面的预热代码,每次跑出来的耗时也是正常的。

三、ArrayList和LinkedList的底层实现原理?他们为什么线程不安全?在多线程并发操作下,我们应该用什么替代?

1.ArrayList底层通过数组实现,ArrayList允许按序号索引元素,而插入元素需要对数组进行移位等内存操作,所以索引快插入较慢;(扩容方式)一旦我们实例化了ArrayList 无参构造函数默认数组长度为10。add方法底层如 果增加的元素超过了10个,那么ArrayList底层会生成一个新的数组,长度为原来数组长度的1.5倍+1,然后将原数组内容复制到新数组中,并且后续加的内容都会放到新数组中。当新数组无法容纳增加元素时,重复该过程;

2.LinkedList底层通过双向链表实现,取元素时需要进行前项或后项的遍历,插入元素时只需要记录本项的前后 项即可,所以插入快查询慢;

3.ArrayList和LinkedList底层方法都没有加synchronized关键词,多线程访问时会出现多个线程先后更改数据造成得到的数据是脏数据;多线程并发操作下使用Vector来代替,Vector底层也是数组,但底层方法都加synchronized关键字使线程安全,效率较ArrayList差;

四、HashMap和HashTable有什么区别?其底层实现是什么?CurrentHashMap的锁机制又是如何?如果想将一个Map变为有序的,该如何实现?

1.区别:
(1)HashMap没有实现synchronized线程非安全,HashTable实现了synchronized线程安全;
(2)HashMap允许key和value为null,而HashTable不允许

2.底层原理:数组+链表实现

3.ConcurrentHashMap锁分段技术:HashTable效率低下的原因,是因为所访问HashTable的线程都必须竞争同一把锁,那假如容器中有多把锁,每一把锁用于锁住容器中的一部分数据,那么当多线程访问容器中不同的数据时,线程间就不会存在锁竞争,从而提高并发访问率;ConcurrentHashMap使用的就是锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个数据时,其他段的数据也能被其他线程访问;

4.实现TreeMap

五.ArryList 注意点

谨慎使用 ArrayList 中的 subList 方法

  • ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList. 说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。

Listlist = new ArrayList<>();        list.add("1");        list.add("1");        list.add("2");        ArrayList strings =  (ArrayList)list.subList(0, 1);运行结果:Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList  at com.workit.demo.listener.ArrayListTest.main(ArrayListTest.java:29)
  • 在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、 删除均会产 ConcurrentModificationException 异常。

 Listlist = new ArrayList<>();        list.add("1");        list.add("1");        list.add("2");        List subList =  list.subList(0, 1);        // 对原 List 增加一个值        list.add("10");        subList.add("11"); // 这一行会报 java.util.ConcurrentModificationException
  • 初始化 List 的时候尽量指定它的容量大小。(尽量减少扩容次数)

END最后,针对面试我们也有很多专题资料,让你事半功倍

教你如何写高级的前端简历【附简历导图】

2020-08-14

电话面试-带你领略高级技巧

2020-02-27

打开职场的钥匙“简历”

2019-11-24


关注我们,更多资料等你来

list foreach方法_Java集合三兄弟List,Set,Map你分的清楚吗?相关推荐

  1. java 集合遍有几种方法_Java 集合遍历的几种方法

    以下实例演示了如何遍历从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型的集合,以下我们分别使用了普通for,增强型的 for ,iterator 等方式来遍历集合: ...

  2. java 集合排序方法_java集合排序方法sort的使用

    转自  http://blog.csdn.net/a1165117473/article/details/6965652 /* * To change this template, choose To ...

  3. collections求和方法_java集合求和最大值最小值示例分享

    package com.happyelements.athene.game.util; import static com.google.common.base.Preconditions.check ...

  4. 【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )

    文章目录 一.使用 for 循环遍历集合 二.使用 each 方法遍历集合 三.集合的 each 方法返回值分析 四.完整代码示例 一.使用 for 循环遍历集合 使用 for 循环 , 遍历集合 , ...

  5. foreach方法使用

    用法 foreach方法主要是针对数组而言的,对数组中的每个元素可以执行一次方法 var array = ['a', 'b', 'c', 'e']; array.forEach((a)=> {c ...

  6. JAVA SE学习day_11:集合的相关应用、增强型for循环、foreach方法、数组与集合的相互转换

    一.集合的相关应用 1.1 将一个集合加到另一个集合上 boolean addAll(Collection c) 将给定集合中的所有元素添加到当前集合中.调用方法之后只要c1集合发生变化就返回true ...

  7. 集合【7】--- 遍历ArrayList集合三种方法

    集合相关知识总结: 集合[1] - 综述与ArrayList 集合[2] - LinkedList 集合[3] - ArrayList和LinkedList区别与联系(面试题) 集合[4]- Set ...

  8. java集合的遍历_java集合遍历方法总结

    java集合遍历方法总结 一.for循环遍历集合 使用条件: ①能否确定集合中的元素个数 ②集合是否可以通过整数索引值来精确位置 public static void forTraversal(){ ...

  9. Java forEach() 方法的三种用法

    当使用 List 的 forEach() 方法时,该方法需要接收一个 Consumer 对象.最传统的方法,我们可以通过匿名类实现此函数式接口.也可以使用lamda表达式替代匿名类的使用.如果需要实现 ...

最新文章

  1. [LeetCode]--118. Pascal#39;s Triangle
  2. Using Markov Chains for Android Malware Detection
  3. html bootstrap复选框全选,javascript+bootstrap+html实现层级多选框全层全选和多选功能代码实例...
  4. IOS开发网络篇之──ASIHTTPRequest详解
  5. 很累很失败,发奋学英语
  6. PropertyUtils 工具类
  7. no interpreter
  8. Windows 2000/XP IIS5.1安装
  9. 服务器上pdf文档无法删除,怎么对PDF文件进行编辑,PDF怎么删除空白页
  10. 经典语录-2014330
  11. win10 pycharm小写变大写,键盘输入错乱
  12. Go实战--golang中使用JWT(JSON Web Token)
  13. 做产品和运营必须深参这5大人性弱点
  14. solidworks与matlab接口,CAD软件与Matlab_SimMechanics接口问题研究
  15. 示波器读取SCI串口数据
  16. 计算机视觉:支持M:N匹配与活体检测的百度人脸Api调用典例
  17. 四、MT8168 音频驱动之Microphone
  18. SAP CEWB 批量修改 工艺路线 和 BOM
  19. Android 上关于设备唯一标识的调研
  20. 昨天换了一台新Mac,折腾了一天,记录一下...

热门文章

  1. 使用Cucumber+Rspec玩转BDD(2)——邮件激活
  2. 【转载】Linux中断处理学习笔记
  3. Servlet技术简介与编写、编译Servlet程序
  4. curl 请求日志_HTTP入门(一):在Bash中curl查看请求与响应
  5. python考试有什么用_Python有什么用?2020年学习Python的10个理由
  6. bootstrap 一排5个_BootStrap从基础到项目实战_第1季_03章_02_CSS样式栅格系统实例
  7. 后台返回数据打印是[object object]的,报错:SyntaxError: JSON.parse: expected property name or ‘}‘ at line 1 column
  8. 织梦DEDE网站后台如何上传附件
  9. oracle 创建新库时报错:enterprise manager 配置失败
  10. linux查看命令类型,查看linux命令类型