JAVA的集合框架知识汇总

集合框架包括Collection为顶层接口的和Map为顶层接口的集合框架

先说Collection接口

Collection接口简介

Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。
方法如下:
public boolean add(E e):  把给定的对象添加到当前集合中 。
public boolean contains(E e): 判断当前集合中是否包含给定的对象。
public boolean remove(E e): 把给定的对象在当前集合中删除。
public int size(): 返回集合中元素的个数。
public Object[] toArray(): 把集合中的元素,存储到数组中。
public void clear() :清空集合中所有的元素。
public boolean isEmpty(): 判断当前集合是否为空。
public Iterator<E> iterator(): 返回在此 collection 的元素上进行迭代的迭代器。

Iterable接口介绍

由于Collection 还有一个唯一的超级接口 Iterable ,在JavaSE 5 中 引入了新接口 Iterable,该接口包含一个能够产生 Iterator 接口的 iterator() 方法,并且 Iterable对象被 foreach 用来在序列中移动,因此创建的任何实现了 Iterable 接口的类都可以将它用于foreach。
为什么要在Iterable接口中再定义一个 Iterator iterator()方法?
为了让迭代逻辑和数据结构分离开来(Iterable是一个数据结构,而Iterator是一个迭代器),这样做可以在一种数据结构上定义多种迭代逻辑
Iterable接口:从继承结构中可以看出,Iterable接口是Collection的顶层接口,所以Iterable是数据结构,用来存放数据的地方。
Iterator接口:是定义了迭代逻辑的接口,即:用于遍历Collection(集合类)中数据的标准访问方法。

迭代器Iterator

	java.util.Iterator是一个接口,也是Java集合中的一员,但是它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

Iterator接口的常用方法如下:

public boolean hasNext():如果仍有元素可以迭代,则返回 true。
public E next():返回迭代的下一个元素。
public void remove():删除元素

使用步骤是:

  1. 获取迭代器
  2. 判断是否有下一个元素
  3. 获取元素
  4. 重复执行2和3步骤,直到2判断没有下一个元素。

在以上每重复2、3步骤一次,我们称为一次迭代。
在这里插入图片描述
在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

增强for循环(foreach)

迭代器是用来遍历单列集合的,而增强for循环(也称foreach循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个个Iterator迭代器。
增强for循环必须有被遍历的目标。目标只能是Collection或者是数组。增强for仅仅作为遍历操作出现。
格式:

for(元素数据类型  变量 : Collection集合或数组){ 
  	//写操作代码
}

注意:使用Iterator迭代器遍历集合过程中特别要注意不能同时对集合中的元素进行增操作。否则会报错 ConcurrentModificationException
因为增强for循环底层也是迭代器实现的,也不能进行增操作
在这里插入图片描述

List与Set

List 与 Set

Collection接口有两个子接口:
List接口:元素的插入是有序的(存入和取出的顺序一致),每个元素都有索引(角标),允许容器中的元素有重复
Set接口: 不允许容器中的元素有重复。这个是List和Set最大的区别。无序的(但是有可能有序)

所以我们对比一下List和Set不难看出:

1、List,Set都是继承自Collection接口
2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
3、List和Set对比:
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

接下来我们详细介绍一下List和Set的各个实现类:
List接口下有实现类 ArrayList、LikedList、Vector
Set接口下有实现类HashSet、LinkedHashSet、TreeSet

ArrayList

1、底层 数组
2、初始大小 10、加载因子 1、扩容因子 1.5
3、查询快,增删慢、线程不安全
4、默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。

LinkedList

1、底层 双向链表,不存在扩容问题
2、查询慢、增删快、线程不安全
3、 LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等

Vector

1、底层 数组
2、初始大小 10、加载因子 1、扩容因子 2
3、查询快、增删慢、线程安全(它大部分的方法都包含关键字synchronized)、效率低于ArrayList和LinkedList,因为Vector内部数据结构是数组结构,是同步的。增删,查询速度都很慢!因为要判断同步锁
4、Vector可以设置容量增量,而ArrayList不可以。在Vector中,有capacityIncrement:当大小大于其容量时,容量自动增加的量。

HashSet

1、底层 HashMap(哈希表)
2、初始大小16、加载因子0.75f、扩容因子2
3、唯一、无序、可以为null(一个),复写hashCode()方法和equals()方法来保证数据结构。子类LinkedHashSet底层数据结构是链表和哈希表,由链表保证元素有序

LinkedHashSet

1、LinkedHashSet 是 HashSet 的子类
2、LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
3、LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
4、LinkedHashSet 不允许集合元素重复。
5、LinkedHashSet:使用了链表维护了一个添加进集合中的顺序,导致当我遍历LinkedHashSet集合元素的时候,是按照添加进去的顺序遍历的。

TreeSet

1、底层 TreeMap(红黑二叉树)
2、唯一、有序,通过Compareable接口的compareto方法来保证w唯一的
3、排序方式:自然排序、比较器排序

Map集合框架

在这里插入图片描述

  1. Collection中的集合,元素是孤立存在的,Map中的集合,元素是成对存在的,每个元素由键与值两部分组成。因此Collection中的集合称为单列集合 ,Map中的集合称为双列集合,这两个接口没有任何关系
  2. Map集合使用时是通过键去获取值,每个键只能对应一个值。需要注意的是,Map集合不能包含重复的键,但值可以重复。在这里插入图片描述
    Map接口中定义了很多方法,常用的如下:
public  V put(K key, V value):添加一个键值对儿。返回被替换的本来value值。
public  V remove(Object obj):根据键,删除对应的键值对儿。返回被删掉的value值。
public  V get(Object obj):根据键,获取对应的value值。
default V getOrDefault (Object key, V defaultValue) :返回指定键映射到的值,如果此映射不包含该键的映射,则返回 defaultValue。
public Set<K> keySet():获取所有的键的集合。(值不重复)
public Collection<V> values():获取所有的值的集合。(值可能重复)

需要注意的是,使用put方法时:
1、若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;
2、若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

HashMap

1、底层 哈希表
2、扩容问题参考哈希表知识
3、键唯一、无序(要保证键的唯一性,需要重写hashCode方法,和equals方法。)
4、线程不同步所以线程安全,可以存入null键,null值

LinkedHahsMap

1、LinkedHashMap 是 HashMap 的子类
2、与LinkedHashSet类似,LinkedHashMap 使用链表维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致
3、遍历快,但插入慢
4、方法基本与HashMap的一致。

Hashtable

1、Hashtable是个古老的 Map 实现类,线程安全,不建议使用
2、与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value
3、与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序
4、Hashtable判断两个key相等、两个value相等的标准,与hashMap一致
5、主要是其子类Properties

Properties

1、Properties 类是 Hashtable 的子类,该对象常用于处理属性文件
2、由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型(String)
3、存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法
4、Properties类的方法:

public void  load(InputStream inStream) 从输入流中读取属性列表(键和元素对)。 
public String getProperty(String key, String defaultValue)  用指定的键在属性列表中搜索属性。 
public Object setProperty(String key, String value)  调用 Hashtable 的方法 put,将指定的K、V假如属性列表中

TreeMap

1、底层 二叉树数据结构
2、扩容问题参考二叉树知识
3、键唯一、有序(需要使用Comparable或者Comparator 进行比较排序。return 0,来判断键的唯一性。)
Key 的排序:
-①自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException
-②定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口
-tip:若使用自定义类作为TreeMap的key,所属类需要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法应返回0。

以上内容为博主四处搜刮加上自己理解所合成的,有错误的地方请指正,如有其他建议请私信我~~

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值