泛型与map

泛型:主要为了解决程序中装箱和拆箱的问题:
    装箱: 值类型-->引用类型  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、通过键——值 

posted @ 2019-06-10 10:57  达摩石神  阅读(4244)  评论(0编辑  收藏  举报