泛型:主要为了解决程序中装箱和拆箱的问题:
装箱: 值类型-->引用类型 Object obj=1;
拆箱: 引用类型--->值类型 int number=(int)obj;
.自定义泛型接口、泛型类和泛型方法
从上面的内容中,大家已经明白了泛型的具体运作过程。也知道了接口、类和方法也都可以使用泛型去定义,以及相应的使用。是的,在具体使用时,可以分为泛型接口、泛型类和泛型方法。
自定义泛型接口、泛型类和泛型方法与上述Java源码中的List、ArrayList类似。如下,我们看一个最简单的泛型类和方法定义:
public class GenericTest {
public static void main(String[] args) {
Box<String> name = new Box<String>("corn");
System.out.println("name:" + name.getData());
}
}
class Box<T> {
private T data;
public Box() {
}
public Box(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
在泛型接口、泛型类和泛型方法的定义过程中,我们常见的如T、E、K、V等形式的参数常用于表示泛型形参,由于接收来自外部使用时候传入的类型实参。那么对于不同传入的类型实参,生成的相应对象实例的类型是不是一样的呢?
public class GenericTest {
public static void main(String[] args) {
Box<String> name = new Box<String>("corn");
Box<Integer> age = new Box<Integer>(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 class MapText { 2 public static void main(String[] args) { 3 Map<String,String > map = new HashMap<String ,String>(); 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<String> keySet = map.keySet(); 20 for (String object : keySet) { 21 System.out.println("集合中的key:"+object); 22 } 23 24 //2:仅遍历value 25 Collection<String> values = map.values(); 26 for(String item:values){ 27 System.out.println("集合中的value:"+item); 28 } 29 30 //3:key和value同时遍历 Entry: 31 Set<Entry<String,String>> entrySet = map.entrySet(); 32 for (Entry<String,String> entry : 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<K,V>
- Map中使用put(K key,V value)方法添加
HashMap类
- HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现
- HashMap中的Entry对象是无序排列的
- Key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射(key值不可重复)
Map的遍历方法
1、迭代器Iteraor
2、增强型for循环
3、通过键——值