泛型:主要为了解决程序中装箱和拆箱的问题:
装箱: 值类型-->引用类型 Object obj=1;
拆箱: 引用类型--->值类型 int number=(int)obj;
.自定义泛型接口、泛型类和泛型方法
从上面的内容中,大家已经明白了泛型的具体运作过程。也知道了接口、类和方法也都可以使用泛型去定义,以及相应的使用。是的,在具体使用时,可以分为泛型接口、泛型类和泛型方法。
自定义泛型接口、泛型类和泛型方法与上述Java源码中的List、ArrayList类似。如下,我们看一个最简单的泛型类和方法定义:
public classGenericTest {public static voidmain(String[] args) {
Box name = new Box("corn");
System.out.println("name:" +name.getData());
}
}class Box{privateT data;publicBox() {
}publicBox(T data) {this.data =data;
}publicT getData() {returndata;
}
}
在泛型接口、泛型类和泛型方法的定义过程中,我们常见的如T、E、K、V等形式的参数常用于表示泛型形参,由于接收来自外部使用时候传入的类型实参。那么对于不同传入的类型实参,生成的相应对象实例的类型是不是一样的呢?
public classGenericTest {public static voidmain(String[] args) {
Box name = new Box("corn");
Box age = new Box(712);
System.out.println("name class:" + name.getClass()); //com.qqyumidi.Box
System.out.println("age class:" + age.getClass()); //com.qqyumidi.Box
System.out.println(name.getClass() == age.getClass()); //true
}
}
由此,我们发现,在使用泛型类时,虽然传入了不同的泛型实参,但并没有真正意义上生成不同的类型,传入不同泛型实参的泛型类在内存上只有一个,即还是原来的最基本的类型(本实例中为Box),当然,在逻辑上我们可以理解成多个不同的泛型类型。
究其原因,在于Java中的泛型这一概念提出的目的,导致其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。
对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。
如果集合设置为了泛型:只能存储泛型变量及其子类。
map
Map:key-value 的键值对,key 不允许重复,value 可以
1、严格来说 Map 并不是一个集合,而是两个集合之间 的映射关系。
2、这两个集合没每一条数据通过映射关系,我们可以看成是一条数据。即 Entry(key,value)。Map 可以看成是由多个 Entry 组成。
3、因为 Map 集合即没有实现于 Collection 接口,也没有实现 Iterable 接口,所以不能对 Map 集合进行 for-each 遍历
最常用的实用类是HashMap
map接口常用方法:
1 public classMapText {2 public static voidmain(String[] args) {3 Map map = new HashMap();4 map.put("1", "张飞");5 map.put("2", "说书人");6 map.put("3", "全聚德");7 map.put("4","斗鱼");8 map.put("5", "一醉千里");9 System.out.println("key值为:1的用户"+map.get("1"));//通过key获取值10 //通过key删除键值对
11 map.remove("1");12 //maps中的键值对个数
13 System.out.println(map.size());14 System.out.println(map.containsKey("1"));15 //判断该Key在集合中是否存在16 //containsValue:判断值是否存在17
18 //1:仅遍历key
19 Set keySet =map.keySet();20 for(String object : keySet) {21 System.out.println("集合中的key:"+object);22 }23
24 //2:仅遍历value
25 Collection values =map.values();26 for(String item:values){27 System.out.println("集合中的value:"+item);28 }29
30 //3:key和value同时遍历 Entry:
31 Set> entrySet =map.entrySet();32 for (Entryentry : entrySet) {33 System.out.println("key:"+entry.getKey() +",Value:"+entry.getValue());34
35 }36 }37 }
Map接口
Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;
Map中的键值对以Entry类型的对象实例形式存在;
建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。
Map支持泛型,形式如:Map
Map中使用put(K key,V value)方法添加
HashMap类
HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现
HashMap中的Entry对象是无序排列的
Key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射(key值不可重复)
Map的遍历方法
1、迭代器Iteraor
2、增强型for循环
3、通过键——值