java集合汇总

一、java集合继承关系图

List是有序的集合,Set是无序的集合。Map是无序的键值对。

常用集合的分类

Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全,但效率低
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

集合和数组的区别

  • 数组可以存储基本类型和引用类型的数据,集合只能存储引用数据类型的数据,如果是基本数据类型,jdk1.5之后,会自动装箱,再进行储蓄。
  • 数组长度是固定不可变,集合长度是可变的,可伸缩。
  • 数组中仅有object继承过来的方法,操作元素只能通过数组名下标方式进行操作,集合中有很多方法都能用来操作元素。

二、List和Set集合类的使用场景

这里写图片描述

三、类的对比

集合对比

ArrayList和LinkedList对比

  • 两者在内存上存储方式不同,ArrayList是连续内存存放,LinkedList是链式存放,逻辑上是连续的,实际内存是分开的。
  • 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
  • 对于新增和删除操作add和remove,LinekdList比较占优势,因为ArrayList要移动数据。
  • 两者都不是线程安全的,可以使用线程安全的vector解决,但Vector效率不高。也可以使用Collections.synchronizedList(new LinkedList())解决。

HashMap和HashTable对比

  • HashTable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比HashTable的性能高一些;但是如果有多个线程访问同一个Map对象时候,应该使用HashTable。 
  • HashTable不允许使用null作为key和value,如果视图把null值放入HashTable中会引发NullPointerException异常,但是HashMap可以使用null作为key或value。null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

HashSet和TreeSet对比

HashSet比TreeSet的性能要好,因为TreeSet需要额外的红黑树算法来维护集合的次序。所以只有当需要保持排序的Set时候,才会使用TreeSet,否则都应该使用HashSet。

四、Iterator

用Iterator迭代器方式遍历集合元素时,如果需要删除或者修改集合中元素,必须要使用迭代器的方法,不能使用集合自身(如ArrayList、LinkedLis)的方法。
Iterator只提供了删除元素的方法remove,如果我们想要在遍历的时候添加元素怎么办?ListIterator接口继承了Iterator接口提供了add()

参考链接

https://www.cnblogs.com/jing99/p/7057245.html
https://blog.csdn.net/feiyanaffection/article/details/81394745
https://www.cnblogs.com/jxxblogs/p/11636166.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值