Day18: 泛型、Map

本文详细介绍了Java中的泛型,包括泛型的定义、好处、泛型类、泛型方法和泛型接口的使用。同时,讨论了类型通配符的概念,如<?>、<? extends 类型>和<? super 类型>,以及它们在集合操作中的应用。此外,还讲解了可变参数的使用,如在方法定义和Arrays工具类中的应用。最后,通过实例展示了Map集合的创建、基本功能以及遍历方法。
摘要由CSDN通过智能技术生成

泛型

泛型概述

泛型:是JDK5中 引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型

它的本质时参数化类型,也就是说所操作的数据类型被指定为一个参数

一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?

顾名思义,就是将类型由原来的具体的类型参数化 ,然后在使用/调用时传入具体的类型

这种参数类型可以用在类 、方法和接口中,分别被称为泛型类、泛型方法、泛型接口

泛型的定义格式:

<类型 > :指定一种类型的格式。这里的类型可以看成是形参

<类型1,类型2....>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参

将来具体调用的时候给定的类型可以看成是实参 ,并且实参的类型只能是引用数据类型

泛型的好处:

把运行时期的问题提前到了编译期间

避免了强制类型转换

泛型类

泛型类的定义格式:

格式:修饰符 class 类名 <类型> {}

范例:public class Generic<T> {}

此处T可以随便写为任意标识,常见的如T 、E、K、V等形式的参数常用于表示泛型

 

 

 

 

泛型方法

泛型方法的定义格式:

格式:修饰符<类型> 返回值类型 方法名(类型 变量名){}

范例:public<T> void show(T t){}

 

 

泛型接口

泛型接口的定义格式:

格式:修饰符 interface 接口名<类型>{ }

范例:public interface Generic<T>{ }

 

 

 

类型通配符

为了表示各种泛型List的父类,可以使用类型通配符

类型通配符:<?> List<?> : 表示元素类型未知的List,它的元素可以匹配任何的类型

这种带通配符的List仅表示它是各种泛型 List的父类,并不能把元素添加到其中

如果说我们不希望List<?>是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限

类型通配符的上限:<? extends 类型>

List<? extends Number>: 它表示的类型是Number或者其子类型

除了可以指定类型通配符的上限,我们也可以指定类型通配符的下限

类型统配符的下限:<? super 类型>

List<?super Number>: 它表示的类型是Number或者其父类型

 

可变参数

可变参数又称参数个数可变,用作方法的形参出现。那么方法参数的个数就是可变的了

格式: 修饰符 返回值类型 方法名(数据类型...变量名){ }

范例:public static int sum(int...a){ }

 

可变参数的注意事项:

这里的变量其实是一个数组

如果一个方法有多个参数,包含可变参数,可变参数要放到最后

 

可变参数的使用

Arrays工具类中有一个静态方法:

public static <T> List<T> asList(T...a):返回由指定数组支持的固定大小的列表

返回的集合不能做增删操作,可以做修改操作

List接口中有一个静态方法:

public static <E> List<E> of(E... elements):返回包含任意数量元素的不可变列表

返回的集合不能做增删改操作

Set接口中有一个静态方法:

public static <E>Set<E> of(E... elements):返回一个包含任意数量元素的不可变集合

在给元素的时候不能给重复的元素

返回的集合不能做增删操作,没有修改的方法

 

Map

Map集合概述和使用

Map集合概述

Interface Map<K,V> K: 键的类型 V: 值的类型

将键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值

举例:学生的学号和姓名

itheima001 林青霞

itheima002 张曼玉

itheima003 王祖贤

创建Map集合的对象

多态的方式

具体的实现类HashMap

 

Map集合的基本功能

 

 

Map集合的获取功能

 

 

Map集合的遍历(方式1)

我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合

遍历思路:

把所有的丈夫给集中起来

遍历丈夫的集合,获取到每一个丈夫

根据丈夫去找对应的妻子

转换为Map集合中的操作:

获取所有键的集合。用keySet()方法实现

遍历键的集合,获取到每一个键。用增强for循环实现

根据键去找值。用get(Object)方法实现

 

Map集合的遍历(方式2)

我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合

遍历思路:

获取所有结婚证的集合

遍历结婚证的集合,得到每一个结婚证

根据结婚证获取丈夫和妻子

转换为Map集合中的操作:

获取所有键值对对象的集合

Set<Map.Entry<K,V>>entrySet():获取所有键值对对象的集合

遍历键值对对象的集合,得到每一个键值对对象

用增强for实现,得到每一个Map.Entry

根据键值对对象获取键和值

用getKey()得到键

用getValue()得到值

 

案例

需求:创建一个HashMap集合,键是学号(String),值是学生对象(Student),存储3个键值对元素 ,并遍历

思路:

1 定义学生类

2 创建HashMap集合对象

3 创建学生对象

4 吧学生对象添加到集合

5 遍历集合

方式1:键找值

方式2:键值对对象找键和值

 

需求:创建一个HashMap集合 ,键是学生对象(Stuednt),值是居住地(String)。存储多个 键值对元素,并遍历

要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象

思路:

1 定义学生类

2 创建HashMap集合对象

3 创建学生对象

4 吧学生对象添加到集合

5 遍历集合

6 在学生类中重写两个方法

hashCode()

equals()

 

 

需求:创建一个ArrayList集合,存储三个元素,每一个元素都是HashMap,每一个HashMap的键和值都是String,并遍历

思路:

1 创建ArrayList集合

2 创建HashMap集合,并添加键值对元素

3 把HashMap作为元素添加到ArrayList集合中

4 遍历ArrayList

 

需求:创建一个HashMap集合,存储三个键值对元素,每一个键值对对元素的键是String,值是ArrayList,

每一个ArrayList的元素是String,并遍历

思路:

1 创建HashMap集合

2 创建ArrayList集合,并添加元素

3 把ArrayList作为元素添加到HashMap集合

4 遍历HashMap集合

 

需求:键盘录入一个字符串,要求统计字符串中每个字符串出现的次数。

举例:键盘录入"aababcabcdabcde" 在控制台输出:"a(5)b(4)c(3)d(2)e(1)"

分析:

1 我们可以把结果分成几个部分来看:a(5),b(4),c(3),d(2),e(1)

2 每一个部分可以看成是:字符和字符对应的次数组成

3 这样的数据我们可以通过HashMap集合来存储,键是字符,值是字符出现的次数

注意:键是字符,类型应该是Character;值是字符出现的次数,类型应该是Integer

思路:

1 键盘录入一个字符串

2 创建HashMap集合,键是Character,值是Integer

3 遍历字符串,得到每一个字符

4 拿着得到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值

如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1作为值存储

如果返回值不是null:说明该字符在HashMap集合中存在,把该值加1,然后重新存储该字符串和对应的值

5 遍历HashMap集合,得到键和值,按照要求进行拼接

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值