当前位置:首页 > 技术 >

list中的set和add的区别(集合中的list)

来源:原点资讯(www.yd166.com)时间:2022-10-25 04:33:12作者:YD166手机阅读>>

前言:

作为Java基础知识的核心部分,集合方面是面试时的重中之重,List、Set、map等相信大家都不会陌生,当然面试官也不会从简单的问题出发,因为他也已经问吐了,今天就聊一下集合在面试中的高级部分,别再傻傻分不清了!

list中的set和add的区别,集合中的list(1)

一、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 遍历方式

另外本人整理了20年面试题大全,包含spring、并发、数据库、Redis、分布式、dubbo、JVM、微服务等方面总结,下图是部分截图,需要的话点赞然后私信我【Java】。

list中的set和add的区别,集合中的list(2)

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

// 随机访问 List<String> list = new ArrayList<>(); int size = list.size(); for (int i = 0; i < size; i ) { value = list.get(i); }

  • 第 2 种,通过迭代器遍历。即通过 Iterator 去遍历。

// 迭代器遍历 Iterator<String> 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 子列表的所有操作最终会反映到原列表上。

List<String> list = new ArrayList<>(); list.add("1"); list.add("1"); list.add("2"); ArrayList<String> 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 异常。

List<String> list = new ArrayList<>(); list.add("1"); list.add("1"); list.add("2"); List<String> subList = list.subList(0, 1); // 对原 List 增加一个值 list.add("10"); subList.add("11"); // 这一行会报 java.util.ConcurrentModificationException

  • 初始化 List 的时候尽量指定它的容量大小。(尽量减少扩容次数)
最后:

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2020收集的一些大厂的面试真题(都整理成文档,小部分截图),有需要的可以私信我【Java】

list中的set和add的区别,集合中的list(3)

栏目热文

listsetmap三者的区别(listset和map分别用于什么场景)

listsetmap三者的区别(listset和map分别用于什么场景)

  首先,Set 、List 和 MAP 是 Java 容器框架的三个最重要的接口,Set、List 和 Map 之间的...

2022-10-25 05:12:45查看全文 >>

list的set方法和add方法区别(list.add是添加对象还是引用)

list的set方法和add方法区别(list.add是添加对象还是引用)

Java中的List与SetList 和 Set的主要区别 在于, List 是一个有序的集合,而 Set 是一个无序的...

2022-10-25 05:02:32查看全文 >>

瑜伽盘坐的正确姿势(牛面式盘腿如何锻炼)

瑜伽盘坐的正确姿势(牛面式盘腿如何锻炼)

刚学瑜伽的你,是不是觉得能盘全莲花的人特别厉害?自己也想学!请看看下图,是不是特别像自己?使劲掰自己的脚背往对侧,结果要...

2022-10-25 05:18:06查看全文 >>

盘膝而坐的正确姿势(盘坐的标准动作图解)

盘膝而坐的正确姿势(盘坐的标准动作图解)

在现代化战争中,古代兵械显然已不能与导弹、坦克等对阵,致使武术器械不得不退出战阵拼杀,而广泛活跃在“武术运动”的舞台上。...

2022-10-25 04:51:06查看全文 >>

交叉盘坐的正确姿势(盘坐的正确方法图解)

交叉盘坐的正确姿势(盘坐的正确方法图解)

在生活中总是会遇到心情郁闷的时候,这是因为我们本身就有情感,也会有七情六欲,那么在生活中,在工作时总会遇到一些不如意的事...

2022-10-25 05:09:22查看全文 >>

怎么判断使用list还是set(为啥不判断list集合的长度)

怎么判断使用list还是set(为啥不判断list集合的长度)

分享职场生活、职场攻略、程序员创业资源,为一线开发者提供优质内容作为一名java程序员,求职面试时,关于集合的问题时常...

2022-10-25 04:33:43查看全文 >>

list和set哪个查询快(list和map查询效率)

list和set哪个查询快(list和map查询效率)

一.排序1. List:有序、可重复。2. Set:无序、不可重复的集合。重复元素会覆盖掉。3. Map:键值对,键唯一...

2022-10-25 05:13:57查看全文 >>

list和set的操作方法(list和set的集合特点)

list和set的操作方法(list和set的集合特点)

大家好,我是吉森。今天的菜品是这样的:List、Set、数组、Map这些常用的数据结构之间怎么相互转换?下面,让我们一起...

2022-10-25 05:06:07查看全文 >>

listsetmap区别(list map set 有什么特点)

listsetmap区别(list map set 有什么特点)

一、结构特点1、List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;2、List中存储的数据是...

2022-10-25 05:06:45查看全文 >>

set和list哪个效率高(set集合为什么是无序不重复的)

set和list哪个效率高(set集合为什么是无序不重复的)

集合类是Java开发最常用的工具,也是面试经常会问到的问题。Java提供了高性能的集合框架,主要包括两种容器类型:一种是...

2022-10-25 04:47:01查看全文 >>

文档排行