集合小结

集合小结

1.集合综述:
1.1集合框架:

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

1.2集合接口

List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口

2. List接口
2.1 存储特点:

相对有序的存储,可以存储相同元素(不排重),可以通过下标访问集合元素

List接口具有独有的迭代器ListIterator,具有反向遍历的功能。

2.2 List接口的实现类
<1> ArrayList

​ ArrayList类是List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。

​ 存储特点:
​ 相对有序存储,可以存储相同元素(不排重),可以通过下标访问集合元素,通过数组实现的集合

​ 存储结构:数组

<2> LinkedList

​ LinkedList类是List接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括null)。

​ 存储特点:
​ 相对有序存储,可以存储相同元素(不排重),可以通过下标访问集合元素,通过链表实现的集合

​ 存储结构:双向链表

*ArrayList和LinkedList的总结

​ ArrayList存储结构是数组,LinkedList存储结构是双向链表。

​ ArrayList集合适用在对元素查询、遍历操作,不适合插入和删除。

​ LinkedList集合适用在对元素插入和删除操作,不适合遍历和查找。

<3> Vector

​ Vector类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引

进行访问的组件。但是Vector的大小可以根据需要增大或缩小,以适应创建 Vector

后进行添加或移除项的操作。

<4>Stack

​ Stack类表示后进先出(LIFO)的对象栈。是Vector的子类。

*ArrayList与LinkedList,Vector三种实现类存储的比较

​ a.功能基本相同

​ b.底层存储结构:ArrayList是数组,LinkedList是链表,Vector是数组

​ c. Vector是线程安全的,效率低,ArrayList是线程不安全的,效率高,推荐使用ArrayList【Collections工具类中有相应的方法可以将ArrayList改为线程安全的】

​ d. ArrayList 查找遍历比较快,LinkedList 插入删除比较快

3.Set接口
3.1存储特点:

​ 相对无序存储,不可以存储相同的元素(排重),不能通过下标访问

3.2 Set接口的实现类:
<1> HashSet

​ 此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。

​ 存储特点:
​ 相对无序存储,不可以存储相同元素(排重),通过哈希表实现的集合

​ 存储结构:哈希表:数组加链表,既有数组的优点也有链表的优点。

*重写hashCode()

​ hashCode()是Object中的方法,每个对象的hashCode值是唯一的,所以可以理解成hashCode值表示这个对象在内存中的位置。字符串String的hashCode(),是根据内容计算的。

​ HashSet集合排重时,需要判断两个对象是否相同,对象相同的判断可以通过hashCode值判断,所以需要重写hashCode()方法

*重写equals()

​ equals()方法是Object类中的方法,表示比较两个对象是否相等,若不重写相当于比较对象的地址,但是我们只重写equals方法,也不能完全实现我们想要的排重效果

​ HashSet集合实现排重

​ HashSet的重复依据: hashCode和equals

​ 需要同时重写hashCode和equals方法,实现排重。


扩展:

​ Hash:哈希——实际含义散列,就是一种算法,把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。

​ JDK1.7 哈希表由数组和链表组成

​ JDK1.8之后哈希表由数组、链表和红黑树组成。当链表长度大于8,且数组容量大于64时,链表转换成红黑树。


<2> LinkedHashSet

​ LinkedHashSet类是具有可预知迭代顺序(相对有序)的Set接口的哈希表和链接列表实现。是HashSet的子类。

​ 存储特点:
​ 有序存储,不可以存储相同元素(排重),通过链表实现的集合的有序。
LinkedHashSet集合的元素排重与HashSet集合排重方法一致。

​ 存储结构:哈希表和链表

<3>TreeSet

​ TreeSet集合是可以给元素进行重新排序的一个Set接口的实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的Comparator进行排序,具体取决于使用的构造方法。除了实现了Set接口外还实现了SortedSet接口。

​ 存储特点:
​ 无序存储,排重,通过红黑树实现的集合,可以给元素进行重新排序

​ 存储结构:二叉树


*TreeSet集合的元素排序
1.自然排序

​ 元素所属的类需要实现java.lang.Comparable接口,并重写compareTo方法。

​ compareTo方法除了可以进行排序外,还有排重的功能,但是必须在compareTo方法中对类中所有的属性值都进行判断,否则不比较那个属性,排重就会忽略哪个属性

2.定制排序

​ 元素需要通过java.util.Comparator接口(比较器)中的compare方法进行比较大小,并排序。

​ compare方法除了可以进行排序外,还有排重的功能,但是必须在compare方法中对类中所有的属性值都进行判断,否则不比较那个属性,排重就会忽略哪个属性

​ TreeSet集合中的无参数构造方法默认使用自然排序的方式对元素进行排序,使用TreeSet集合的定制排序时,创建集合对象不可以直接使用无参数构造方法,需要使用传入一个Comparator比较器的构造方法创建集合对象。


4.Map接口
3.1存储特点

Map接口是将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射到一个值,值可以重复。

3.2常用实现类
<1>HashMap

​ 基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序。

​ 存储特点:
​ 相对无序存储,元素以键值对形式存在,键不可以重复,值可以重复,元素整体排重,可以快速的通过键查找到所对应的值,通过哈希表实现的集合。

​ HashMap集合的排重,只需要重写键所属的类的hashCode和equals方法即可。

​ 存储结构:哈希表

*map集合中若向集合中添加相同键的键值对时,新的值会将旧的值覆盖

<2> LinkedHashMap

​ LinkedHashMap集合是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。用法与HashSet类似。

​ 存储特点:
​ 有序存储,元素排重,通过链表实现的集合。

​ 存储结构:哈希表和链表

<3>Hashtable

​ 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。
​ Hashtable有一个子类Properties,Properties集合使用的比较频繁。

​ 存储特点:
​ 相对无序存储,元素排重,通过哈希表实现的集合。

​ 存储结构:哈希表

*HashMap与Hashtable的区别

​ 1.Hashtable线程安全的,而HashMap线程不安全的
​ 2.Hashtable中不允许存在null的键和null值,但是HashMap中允许null的键和null值

<4>TreeMap

​ 特点:1 存储键值对、键不能重复、一个键对应一个值、值可以重复
​ 2 无序,数据会进行排序。
​ 排重依据:Comparable接口的compareTo()方法的返回值。如果返回0就认为是重复的元素。

​ 存储结构:自平衡红黑二叉树

5.总结
5.1集合中线程安全的集合类:

Vector HashTable

ArrayList可以改写成线程安全的实现类

5.2允许存在空值的集合类:

ArrayList LinkedList HashSet HashMap

5.3通过重写hashCode 和equals方法实现排重的集合类

HashSet LinkedList HashMap****HashTable LinkedHashSet

5.4通过实现Comparable和Comparator接口实现排重的集合类

ArrayList LinkedList HashSet HashMap

5.3通过重写hashCode 和equals方法实现排重的集合类

HashSet LinkedList HashMap****HashTable LinkedHashSet

5.4通过实现Comparable和Comparator接口实现排重的集合类

TreeSet

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值