当前位置:网站首页 > Java基础 > 正文

java框架的基础



@

目录
    • 1.1、集合框架概述
    • 1.2、集合的分类
  • 二、List接口
    • 2.1、ArrayList类
    • 2.2、LinkedList类
  • 三、泛型
    • 3.1、什么是泛型
    • 3.2、自定义和使用泛型
    • 3.3、在集合中使用泛型
  • 四、集合遍历
  • 4.1、集合元素遍历
    • 4.2、并发修改异常
  • 五、Set接口
    • 5.1、HashSet类
    • 5.2、TreeSet类
  • 六、Map接口
    • 6.1、认识Map
    • 6.2、Map常用的API
    • 6.3、HashSet
    • 6.4、TreeMap

🌈# 一、集合框架体系

思考:既然数组可以存储多个数据,为什么要出现集合?

 

1.1、集合框架概述

集合是Java中提供的一种容器,可以用来存储多个数据,根据不同存储方式形成的体系结构,就叫做集合框架体系(掌握)。集合也时常被称为容器。

在这里插入图片描述

List、Set集合是继承了Colection接口,跟Collection是继承关系

而ArrayList、LinkedList跟List是继承关系,HashSet、TreeSet跟Set也是继承关系,HashMap、TreeMap跟Map也是继承关系

  • Collection接口:泛指广义上集合,主要表示List和Set两种存储方式。
  • List接口:表示列表,规定了允许记录添加顺序,允许元素重复的规范。
  • Set接口:表示狭义上集合,规定了不记录添加顺序,不允许元素重复的规范。
  • Map接口:表示映射关系,规定了两个集合映射关系的规范。

1.2、集合的分类

根据容器的存储特点的不同,可以分成三种情况:
在这里插入图片描述

 

二、List接口

List接口是Collection接口子接口,List接口定义了一种规范,要求该容器允许记录元素的添加顺序,也允许元素重复。那么List接口的实现类都会遵循这一种规范。

List集合存储特点:

  • 允许元素重复
  • 允许记录元素的添加先后顺序

该接口常用的实现类有:

 

一般来说,集合接口的实现类命名规则:(底层数据结构 + 接口名)例如:ArrayList

2.1、ArrayList类

ArrayList类,基于数组算法的列表,通过查看源代码会发现底层其实就是一个Object数组。

ArrayList常用方法的API:

在这里插入图片描述

 

2.2、LinkedList类

LinkedList类,底层采用链表算法,实现了链表,队列,栈的数据结构。无论是链表还是队列主要操作的都是头和尾的元素,因此在LinkedList类中除了List接口的方法,还有很多操作头尾的方法。

LinkedList常用方法的API:

在这里插入图片描述

其余方法:

 

LinkedList之所以有这么多方法,是因为自身实现了多种数据结构,而不同的数据结构的操作方法名称不同,在开发中LinkedList使用不是很多,知道存储特点就可以了。

 

运行结果

 

三、泛型

3.1、什么是泛型

其实就是一种类型参数,主要用于某个类或接口中数据类型不确定时,可以使用一个标识符来表示未知的数据类型,然后在使用该类或接口时指定该未知类型的真实类型。

泛型可用到的接口、类、方法中,将数据类型作为参数传递,其实更像是一个数据类型模板。

如果不使用泛型,从容器中获取出元素,需要做类型强转,也不能限制容器只能存储相同类型的元素。

 

3.2、自定义和使用泛型

定义泛型:使用一个标识符,比如T在类中表示一种未知的数据类型。

使用泛型:一般在创建对象时,给未知的类型设置一个具体的类型,当没有指定泛型时,默认类型为Object类型。

需求:定义一个类Point,x和y表示横纵坐标,分别使用String、Integer、Double表示坐标类型。

如果没有泛型需要设计三个类,如下:

在这里插入图片描述

定义泛型:

在类上声明使用符号T,表示未知的类型

 

使用泛型:

 

注意:这里仅仅是演示泛型类是怎么回事,并不是要求定义类都要使用泛型。

3.3、在集合中使用泛型

拿List接口和ArrayList类举例。

 

此时的E也仅仅是一个占位符,表示元素(Element)的类型,那么当使用容器时给出泛型就表示该容器只能存储某种类型的数据。

 

因为前后两个泛型类型相同(也必须相同),泛型类型推断:

 

通过反编译工具,会发现泛型其实是语法糖,也就是说编译之后,泛型就不存在了。

注意:泛型必须是引用类型,不能是基本数据类型(错误如下):

 

泛型不存在继承的关系(错误如下):

 

四、集合遍历

4.1、集合元素遍历

对集合中的每一个元素获取出来。

 

使用迭代器遍历

Iterator表示迭代器对象,迭代器中拥有一个指针,默认指向第一个元素之前,

  • boolean hasNext():判断指针后是否存在下一个元素
  • Object next():获取指针位置下一个元素,获取后指针向后移动一位
 

在这里插入图片描述
注意: 此时,就不能使用两次迭代器,因为第一个迭代器就已经将指针指向了最后一个元素,这样的话第二个迭代器开始的指针一直都是最后一个

使用for-each遍历(推荐使用)

 

通过反编译工具会发现,for-each操作集合时,其实底层依然是Iterator,我们直接使用for-each即可。

4.2、并发修改异常

需求:在迭代集合时删除集合元素,比如删除王昭君。

 

此时报错java.util.ConcurrentModificationException,并发修改异常。

造成该错误的原因是,不允许在迭代过程中改变集合的长度(不能删除和增加)。如果要在迭代过程中删除元素,就不能使用集合的remove方法,只能使用迭代器的remove方法,此时只能使用迭代器来操作,不能使用foreach。

 

五、Set接口

​ Set是Collection子接口,Set接口定义了一种规范,也就是该容器不记录元素的添加顺序,也不允许元素重复,那么Set接口的实现类都遵循这一种规范。

Set集合存储特点:

  • 不允许元素重复
  • 不会记录元素的添加先后顺序

    Set只包含从Collection继承的方法,不过Set无法记住添加的顺序,不允许包含重复的元素。当试图添加两个相同元素进Set集合,添加操作失败,add()方法返回false。

加粗样式Set接口定义了一种规范,也就是该容器不记录元素的添加顺序,也不允许元素重复。

Set接口常用的实现类有:

  • HashSet类:底层采用哈希表实现,开发中使用对多的实现类,重点。
  • TreeSet类:底层采用红黑树实现,可以对集合中元素排序,使用不多。

HashSet和TreeSet的API都是一样的:
在这里插入图片描述

java框架的基础

5.1、HashSet类

HashSet 是Set接口的实现类,底层数据结构是哈希表,集合容器不记录元素的添加顺序,也不允许元素重复。通常我们也说HashSet中的元素是无序的、唯一的。

 

哈希表工作原理:

在这里插入图片描述

HashSet底层采用哈希表实现,元素对象的hashCode值决定了在哈希表中的存储位置。

向HashSet添加元素时,经过以下过程:

step 1 : 首先计算要添加元素e的hashCode值,根据 y = k( hashCode ) 计算出元素在哈希表的存储位置,一般计算位置的函数会选择 y = hashcode % 9, 这个函数称为散列函数,可见,散列的位置和添加的位置不一致。

step 2:根据散列出来的位置查看哈希表该位置是否有无元素,如果没有元素,直接添加该元素即可。如果有元素,查看e元素和此位置所有元素的是否相等,如果相等,则不添加,如果不相同,在该位置连接e元素即可。

在哈希表中元素对象的hashCode和equals方法的很重要。

每一个存储到哈希表中的对象,都得覆盖hashCode和equals方法用来判断是否是同一个对象,一般的,根据对象的字段数据比较来判断,通常情况下equals为true的时候hashCode也应该相等。

5.2、TreeSet类

TreeSet类底层才有红黑树算法,会对存储的元素对象默认使用自然排序(从小到大)。

注意:必须保证TreeSet集合中的元素对象是相同的数据类型,否则报错。

 

六、Map接口

6.1、认识Map

Map,翻译为映射,在数学中的解释为:

设A、B是两个非空集合,如果存在一个法则f,使得A中的每个元素a,按法则f,在B中有唯一确定的元素b与之对应,则称f为从A到B的映射,记作f:A→B。

也就是说映射表示两个集合之间各自元素的一种“对应”的关系,在面向对象中我们使用Map来封装和表示这种关系。

​ 从定义和结构图上,可以看出Map并不是集合,而表示两个集合之间的一种关系,故Map没有实现Collection接口。

​ 在Map中,要求A集合中的每一个元素都可以在B集合中找到唯一的一个值与之对应。这句话可以解读为一个A集合元素只能对应一个B集合元素,也就说A集合中的元素是不允许重复的,B集合中的元素可以重复,也可不重复。那么不难推断出A集合应该是一个Set集合,B集合应该是List集合。

我们把A集合中的元素称之为key,把B集合中的元素称之为value。

其实能看出一个Map其实就有多个key-value(键值对)组成的,每一个键值对我们使用Entry表示。

不难发现,一个Map结构也可以理解为是Entry的集合,即Set。

一般的,我们依然习惯把Map称之为集合,不过要区分下,Set和List是单元素集合,Map是双元素集合。

 

注意:

 

6.2、Map常用的API

添加操作

 

删除操作

 

修改操作

 

查询操作

 

6.3、HashSet

HashMap底层基于哈希表算法,Map中存储的key对象的hashCode值决定了在哈希表中的存储位置,因为Map中的key是Set,所以不能保证添加的先后顺序,也不允许重复。

HashMap key的底层数据结构是哈希表

案例: 统计一个字符串中每个字符出现次数

 

6.4、TreeMap

TreeMap key底层基于红黑树算法,因为Map中的key是Set,所以不能保证添加的先后顺序,也不允许重复,但是Map中存储的key会默认使用自然排序(从小到大),和TreeSet一样,除了可以使用自然排序也可以自定义排序。

需求:测试HashMap和TreeMap中key的顺序

 

输出结果:

  • 上一篇: java编程基础4
  • 下一篇: java基础解答题
  • 版权声明


    相关文章:

  • java编程基础42025-04-20 15:18:00
  • java语言基础速成2025-04-20 15:18:00
  • java基础语法0492025-04-20 15:18:00
  • java框架基础组件2025-04-20 15:18:00
  • java语言基础2025-04-20 15:18:00
  • java基础解答题2025-04-20 15:18:00
  • java工程师基础2025-04-20 15:18:00
  • java的基础知识面试2025-04-20 15:18:00
  • java基础经典书籍2025-04-20 15:18:00
  • java 基础训练2025-04-20 15:18:00