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

前言集合作为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

59820ad5b68786cb2446efa93eeb1a4f.png

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

2020-02-27

80d7d08a4c7f8c5ace8d6bb225e4a2bd.png

打开职场的钥匙“简历”

2019-11-24

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

38a9df1229862d05eb73e4f8dce9d6a0.png

ffba738b1288251cafd345abab40a399.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7.3防火墙配置

Centos7.3防火墙配置 1、查看firewall服务状态 systemctl status firewalld 2、查看firewall的状态 firewall-cmd --state 3、开启、重启、关闭、firewalld.service服务 开启 service firewalld start 重启 service firewalld restart 关闭 service firewalld stop 4、…

SpringBoot使用Jsp

本文是简单总结一下SpringBoot使用Jsp的Demo。 前言 在早期做项目的时候&#xff0c;JSP是我们经常使用的java服务器页面&#xff0c;其实就是一个简化servlet的设计&#xff0c;在本文开始之前&#xff0c;回顾一下jsp的几大对象&#xff0c;如图。 而在现在SpringBoot框架流行…

java 持久_Java持久锁总结 -解道Jdon

并发主题Java与持久相关的锁总结本文总结Java中有关数据库保存持久数据的锁机制&#xff0c;不只是纯粹数据库自身的锁&#xff0c;本文主要就Java持久层三个技术数据库、JPA和Hibernate的锁应用进行了总结。在并发理论中&#xff0c;锁是用于保护可变的共享数据&#xff0c;以…

cacti 监控安装失败

1首先这是基于lnmp模式进行的 2yum安装 yum -y install httpd mysql mysql-server php php-mysql php-json php-pdo 3lib库 yum -y install cairo-devel libxml2-devel pango pango-devel 4 解压rrdtool-1.3.1.tar.gz Cd rrdtool-1.3.1 ./configure --prefix/usr/local/rrdtoo…

project 模板_施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图...

施工进度横道图不会做&#xff1f;18份计划模板收藏好&#xff0c;输入参数迅速成图作为施工组织设计的关键内容&#xff0c;施工进度计划控制了工程施工进度、工程施工期限等各项施工活动。进度计划是否合理&#xff0c;直接影响施工速度、成本和质量。因此施工中的其他工作必…

JavaScript学习系列3 -- JavaScript arguments对象学习

在实际项目开发中&#xff0c;目前还是很少使用到JavaScript 中的arguments对象&#xff0c;那么它到底是干什么用的呢 arguments是JavaScript中的一个类数组对象&#xff0c;它代表传给一个正在执行的函数function的参数列表。 看完这个定义&#xff0c;需要明白&#xff0c…

二叉树垂直遍历 java_【004】二叉树垂直遍历

二叉树垂直遍历题目描述输入输出示例输入实例输出DFSBFS更简单的方法二叉树垂直遍历题目描述对于一个二叉树&#xff0c;输出它的垂直遍历结果&#xff1b;对于同一列的节点&#xff0c;按照从左向右&#xff0c;从上向下的顺序排列。例如&#xff0c;对于以下二叉树&#xff1…

matlab二元一次方程求解_2-函数的求解计算

一、本期介绍函数的求解有两种&#xff08;1&#xff09;已知x求y&#xff08;2&#xff09;已知y求x1.1已知x求y回想我们上一期&#xff0c;讲了多项式求解的方法&#xff0c;也是已知x求y。想一下&#xff0c;多项式不也是函数的一种吗&#xff0c;所以本期求解的方法同样适用…

linux lnmp yum版安装

LAMP&#xff08;linux、apache、mysql、php&#xff09;&#xff0c;是四个套件的合成&#xff0c;简单讲就是要把php运行在linux上&#xff0c;需要依赖apache和mysql数据库。 1 准备好一个linux系统&#xff08;centos7&#xff09;   确保selinux、firewall已经关闭   …

面向对象的四大特征

面向对象的四大特征 面向对象的程序设计方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。 面向对象程序设计&#xff0c;是通过为数据和代码建立分块的内存区域&#xff0c;以便提供对程序进行模块化的一种程序设计方法。对象是计算机内存中的一块区域&#xff0…

python装饰器调用顺序_聊一聊Python装饰器的代码执行顺序

为什么写这篇文章&#xff1f;起因是QQ群里边有人提了一个问题&#xff1a;之前导入模块只需要1~2秒&#xff0c;为什么现在变成需要2~3分钟&#xff1f;我的第一感觉是&#xff1a;是不是导入的模块顶层代码里边&#xff0c;做了什么耗时的事情。隔了一天&#xff0c;他的问题…

centos7 安装cacti

1 cacti运行环境准备   cacti需要phpapachemysqlsnmpRRDTool&#xff0c;以及cacti本身。cacti本体是用php开发的网站&#xff0c;通过snmp对远端设备信息进行采集。apachemysqlphp在以前已经做过了      这里只对剩余的部分进行安装。 2 安装snmp    yum install -y n…

python第三方库-基础

1.python社区 python有一个全球社区&#xff0c;提供了超过十三万个涵盖各种领域应用的第三方库&#xff0c;该社区可通过 http://pypi.org/ 来访问。PyPI&#xff08;Python Package Index&#xff09;是python包的索引&#xff0c;学会检索并利用PyPI&#xff0c;找到合适的第…

python折线图matplotlib库_Python如何使用内置库matplotlib绘制折线图

这篇文章主要介绍了Python如何使用内置库matplotlib绘制折线图,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下环境准备&#xff1a;需要安装matplotlib&#xff0c;安装方式&#xff1a;pip install matplotlib…

linux下zabbix安装

1本人用的是apachemysqlphp 2下载zabbix软件包&#xff0c;官网下载 https://sourceforge.net/projects/zabbix/files/ZABBIX Latest Stable/2.2.23/zabbix-2.2.23.tar.gz/download 上传到 var/www/html下 3cd /var/www/html #进入软件包下载目录 tar zxvf zabbix-2.2.23.tar.g…

java cas机制_Java CAS机制详解

CAS目的&#xff1a;在多线程中为了保持数据的准确性&#xff0c;避免多个线程同时操作某个变量&#xff0c;很多情况下利用关键字synchronized实现同步锁&#xff0c;使用synchronized关键字修可以使操作的线程排队等待运行&#xff0c;可以说是一种悲观策略&#xff0c;认为线…

「一本通 4.1 练习 2」简单题

题目描述 题目来源&#xff1a;CQOI 2006 有一个 n 个元素的数组&#xff0c;每个元素初始均为 0。有 m 条指令&#xff0c;要么让其中一段连续序列数字反转——0 变 1&#xff0c;1变 0&#xff08;操作 1&#xff09;&#xff0c;要么询问某个元素的值&#xff08;操作 2&…

定时器取数据时实时进来的数据_Redis-数据淘汰策略amp;持久化方式(RDB/AOF)amp;Redis与Memcached区别...

Redis与Memcached区别&#xff1a; 两者都是非关系型数据库。主要有以下不同&#xff1a; 数据类型&#xff1a; Memcached仅支持字符串类型。 redis支持&#xff1a;String,List,set,zset,hash 可以灵活的解决问题。 数据持久化&#xff1a; Memcached不支持持久化。 Redis采…

linux 下建立多个tomcat

第一步&#xff1a;复制&#xff0c;解压 将准备好的tomcat压缩包复制到你准备安装的目录&#xff0c;我的tomcat压缩包名字是tomcat.tar.gz,我的安 装目录是 /usr/java/tomcat 第二步&#xff1a;解压tomcat [rootaliServer tomcat]# tar -xvf tomcat.tar.gz 第三步&#xff…

java apply 函数_Js(Javascript)中的apply方法的使用

Function.apply(obj,args)方法能接收两个参数&#xff0c;简单说apply方法作用就是给类或方法中的this赋值。所以学会这个方法首先要知道this的作用。(this的用法可以看一下这个链接&#xff1a;http://www.cjavapy.com/article/8/ )obj&#xff1a;这个对象将代替Function类里…