【java 集合】

java 集合总结

	集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),
而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。

	Java 集合类型分为 Collection 和 Map,它们是 Java 集合的根接口,
这两个接口又包含了一些子接口或实现类。
图 1 和图 2 分别为 Collection 和 Map 的子接口及其实现类。
在 图 1 和图 2 中,黄色块为集合的接口,蓝色块为集合的实现类。表 1 介绍了这些接口的作用。

在这里插入图片描述
在这里插入图片描述

一. collection 集合

1.List

List 是一个有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素,
可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引,第一个添加到 List
 集合中的元素的索引为 0,第二个为 1,依此类推。

List 实现了 Collection 接口,实现类有 ArrayList 类, LinkedList类, Vector 类
它主要有两个常用的实现类:ArrayList 类和 LinkedList 类。

简单理解list 实现类
	1. ArrayList 是一个数组,初始容量为 10, 非线程安全;
	2. LinkedList 是一个双向链表, 非线程安全;
	3. Vector 是一个数组, 线程安全, 底层方法用 synchronized 关键字修饰;
	
ArrayList 相对比 LinkedList 
	1. ArrayList 更适用于查询操作多的业务, 添加 删除 操作相对于LinkedList 慢一些;
	2. LinkedList 更适用于添加 删除操作多的业务, 查找慢一些, linkedList 在查找一个元素的时候, 会根据
		节点地址引用将所有元素都遍历一遍, 而ArrayList 查找元素可以根据索引进行查找;
ArrayList 相对比 Vector 
	1. ArrayList 和 Vector 都是 数组, 初始容量为10, 在window 系统下, ArrayList 扩容倍数为1.5 而
		Vector 扩容倍数为 2;
	2. Vector 是线程安全的;

2.Set

Set 集合类似于一个罐子,程序可以依次把多个对象“丢进”Set 集合,而 Set 集合通常不能记住元素的添加顺序。
也就是说 Set 集合中的对象不按特定的方式排序,只是简单地把对象加入集合。Set 集合中不能包含重复的对象,
并且最多只允许包含一个 null 元素。

Set 实现了 Collection 接口,它主要有两个常用的实现类:HashSet 类和 TreeSet类。
	
1. HashSet 类
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时就是使用这个实现类。HashSet 是按照 Hash
	算法来存储集合中的元素。因此具有很好的存取和查找性能。
HashSet 具有以下特点:
	1. 不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
	2. HashSet 不是同步的,如果多个线程同时访问或修改一个 HashSet,则必须通过代码来保证其同步。
	3. 集合元素值可以是 null;
	
	当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的
 hashCode值,然后根据该 hashCode 值决定该对象在 HashSet 中的存储位置。如果有两个元素通过
  equals() 方法比较返回的结果为 true,但它们的 hashCode 不相等,HashSet 将会把它们存储在不同的
  位置,依然可以添加成功;
	也就是说,两个对象的 hashCode 值相等且通过 equals() 方法比较返回结果为 true,则 HashSet 集合认为
 两个元素相等;如果向 Set 集合中添加两个相同的元素,则后添加的会覆盖前面添加的元素,即在 Set 集合中不
 会出现相同的元素。

2.TreeSet 类
TreeSet 类同时实现了 Set 接口和 SortedSet 接口。SortedSet 接口是 Set 接口的子接口,可以实现对
集合进行自然排序,因此使用 TreeSet 类实现的 Set 接口默认情况下是自然排序的,这里的自然排序指的是升序
排序。

TreeSet 只能对实现了 Comparable 接口的类对象进行排序,因为 Comparable 接口中有一个 
compareTo(Object o) 方法用于比较两个对象的大小。例如 a.compareTo(b),如果 a 和 b 相等,则该方法
返回 0;如果 a 大于 b,则该方法返回大于 0 的值;如果 a 小于 b,则该方法返回小于 0 的值;

3.HashSet 对比 TreeSet 对比 LinkedHashSet
HashSet是采用hash表来实现的。其中的元素没有按顺序排列,add()、remove()以及contains()等方法都是复杂度为O(1)的方法。

TreeSet是采用树结构实现(红黑树算法)。元素是按顺序进行排列,但是add()、remove()以及contains()等方法都是复杂度为O(log (n))的方法。它还提供了一些方法来处理排序的set,如first(), last(), headSet(), tailSet()等等。

LinkedHashSet介于HashSet和TreeSet之间。它也是一个hash表,但是同时维护了一个双链表来记录插入的顺序。基本方法的复杂度为O(1)。

2.Map

	Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键(key)对象和一个值(value)对象。用于保存具有映射关系的数据。

Map 集合里保存着两组值,一组值用于保存 Map 里的 key,另外一组值用于保存 Map 里的 value,key 和 value 都可以是任何引用类型的数据。Map 的 key 不允许重复,value 可以重复,即同一个 Map 对象的任何两个 key 通过 equals 方法比较总是返回 false。

Map 中的 key 和 value 之间存在单向一对一关系,即通过指定的 key,总能找到唯一的、确定的 value。从 Map 中取出数据时,只要给出指定的 key,就可以取出对应的 value。

Map 实现类有HashMap,TreeMap,LinkedHashMap,Hashtable 接口主要有两个实现类:HashMap 类和 TreeMap 类。其中,HashMap 类按哈希算法来存取键对象,而 TreeMap 类可以对键对象进行排序。

参考
https://blog.csdn.net/suifeng629/article/details/82179996
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值