Map和Java泛型

一、Map接口
1.Map接口概述
Map接口存储一组成对的键(key)-值(value)对象,提供key到value的映射,通过key来检索。Map接口中的可以不要求有序,不允许重复。value同样不要求有序,但允许重复。
Map接口的常用方法:
Object put(Object key,Object value) 将互相关联的一个key与一个value放入该集合,如果此Map接口中已经包含了key对应的value,则旧值会被替代
Object remove(Object key) 从当前集合中移除与指定可以相关的映射,并返回该key关联的旧value
Object get(Object key) 获得与key相关的value。如果该key不关联任何非null值,则返回null
boolean containsKey(Object key) 判断集合中是否存在key
boolean containsValue(Object value) 判断集合中是否存在value
boolean isEmpty() 判断集合是否存在元素
void clear() 清楚集合中的所有元素
int size() 返回集合中元素的数量
Set keySet() 获取所有key的集合
Collection values() 获取所有value的集合
Map接口中存储的数据都是键-值对,例如,一个身份证号码对应一个人,其中省份证号码就是key,与此号码对应的就是value。
二、Collections类
Collections类是Java提供的一个集合操作工具类,它包含了大量的静态方法,用于实现对集合元素的排列、查找和替换等操作。
1.对集合元素排序与查找
排序是针对集合的一个常见需求。要排序就要知道两个元素哪个大哪个小。在Java中,如果想实现一个类的对象之间的比较大小,那么这个类就要实现Comparable接口。此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法。此方法用于比较对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
compareTo()方法的定义语法格式如下:
int compareTo(Object obj);
其中:
参数:obj即要比较的对象;
返回值:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象返回不同的值。
实现此接口的对象列表(和数组)可以通过Collections.sort()方法(和Arrays.sort()方法)进行自动排序。
元素之间可以比较大小之后,就可以使用Collections类的sort()方法对元素进行排序操作了。Map接口本身是无序的,所以不能对Map接口做排序操作;但是List接口是有序的,所以可以对List接口进行排序。注意List接口中存放的元素,必须是实现了Comparable接口的元素才可以。
2.替换集合元素
若有一个需求,需要把一个List集合中的所有元素都替换为相同的元素,则可以使用Collections类的静态方法fill()来实现。
二、泛型
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种类型。简单来说,Java语言引入泛型的好处是安全简单,且所有强制转换都是自动和隐式进行的,提高了代码的重用率。
(1)泛型的定义
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性,这就是泛型。泛型的本质就是参数化类型。
泛型的定义语法格式如下:
类1或者接口<类型实参>对象=new 类2<类型实参>();
例如:ArrayList list=new ArrayList();
上述代码表示创建一个ArrayList集合,但规定该集合中存储的元素类型必须是String类型。
(2)泛型在集合中的应用
前面学习List接口时已经提到,其add()方法的参数时Object类型,不管把什么对象放入List接口及其子接口或实现类中,都会被转换为Object类型。再通过get()方法取出集合中元素时必须进行强制类型转换,不仅烦琐而且容易出现ClassCastException异常。Map接口中使用put()方法和get()方法存取对象时,以及使用Iteratro的next()方法获取元素时存在同样的问题。
使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无序进行强制类型转换,而且如果把非指定类型对象放入集合,会出现编译错误。
List和ArrayList的泛型形式是List和ArrayList,ArrayList于ArrayList类的常用方法基本一样。指定了ArrayList中元素的类型,如果添加其他类型数据,将会出现编译错误。保存的时指定的数据类型,所以在集合中获取数据时也不再需要进行强制类型转换。
同样的,Map与HashMap也有它们的泛型形式,即Map<K,V>和HashMap<K,V>。因为它们的每一个元素都包含两个部分,即key和value,所以,在应用泛型时,要同时指定key的类型和value的类型,K表示key的类型,V表示value的类型。
HashMap<K,V>操作数据的方法与HashMap基本一样。
泛型使集合的使用更方便,也提升了安全:
存储数据时进行严格类型检查,确保只有合适类型的对象才能存储在集合中。
从集合中检索对象时,减少了强制类型转换。
(2)深入泛型
在集合中使用泛型只是泛型多种应用的一种,在接口、类、方法等方面也有着泛型的广泛应用。泛型的本质就是参数化类型,参数化类型的重要性在于允许船舰一些类、接口和方法,其所错做的数据类型被定义为参数,可以在真正使用时指定具体的类型。
在学习如何使用泛型时,还需要了解以下两个重要概念:
参数化类型:参数化类型包含一个类或者接口,以及实际的类型参数列表。
类型变量:是一种非限定性标识符,用来指定类、接口或者方法的类型。
1.定义泛型类、泛型接口和泛型方法
对于一些常常处理不同类型数据转换得接口或者类,可以使用泛型定义,如Java中的List接口。定义泛型接口或类的过程,与定义一个接口或者类形似。
泛型类简单地说就是具有一个或者多个类型参数的类。
定义泛型类的语法格式如下:
访问修饰符 class className
TypeList表示类型参数列表,每个类型变量之间以逗号分隔。
例如:
public class GenericClass{…}
创建泛型示例的语法格式如下:
new className{argList};
TypeList表示定义的类型参数列表,每个类型变量之间以逗号分隔。
argList表示实际传递的类型参数的接口。泛型接口的定义方式与定义泛型类类似。
定义泛型接口的语法格式如下:
访问修饰符 interface interfaceName
TyepList表示由盗号分隔的一个或多个类型参数列表。
例如:
public interface TestInterface
{
public T pirint(T t);
}
泛型类实现泛型接口的语法格式如下:
访问修饰符 class className implements interfaceName
一些方法常常需要对某一类型数据进行处理,若处理的数据类型不确定,则可以通过泛型方法的方式来定义,达到简化代码、提高代码重用性的目的。
泛型方法实际上就是带有类型参数的方法。需要特别注意的是,定义泛型方法与方法所在的类、或者接口是否是泛型类或者泛型接口没有直接的联系,也就是说无论时泛型类还是非泛型类,如果需要就可以定义泛型方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值