泛型

  1. 数据结构
    线性表 List
    栈和队列 Queue/Stack/Deque
    二叉树 堆 PriorityQueue
    排序 Array.sort |List.sort
    搜索 Set/Map 搜索树 哈希表 …
    Map是映射关系
    例:通讯录
    姓名 映射 电话号码
    Key Value
    同学的到勤次数姓名
    映射 上课次数
    Key Value
    Key不允许重复,Value允许重复
    静态内部类:定义在类的成员界面(member-level),同时被static修饰的一种类
    class LinkedList {
    public/default/protected/private static class Node
    {
    int val; Node next;
    }
    }
    最大的作用就是一个类从概念上应该属于另一个的范围使用上:
    1. 在LinkedList内部使用,和普通类没有区别
    Node n = new Node();
    2. 在LinkedList外部使用,指明所属关系
    LinkedList.Node n = new LinkedList.Node();
    泛型之问题的引入
    class Person{} class Book{}
    class MyArrayList {
    private int[] array; private int[] size; …
    }
    class MyArrayListPerson {
    private Person[] array; private int size; …
    }
    同样的代码,定义不同类型每次使用都要重新定义解决办法:
    1.前提:
    (1)Object是所有类型的祖先类
    (2)向上转型是自然发生的class MyArrayList {
    private Object[] array;private int size;
    }
    Java 1.5都是这么去做的上述方法的一个弊端:
    MyAyyayList list = new MyArrayLisft();
    List.add(new Person());
    Person p = (Person)list.get(0); // 每次都得向下转型Book b = (Book)list.get(0);
    //编译时没问题,运行时异常
    前提:问题发生在编译期间,影响远远小于发生在运行期间
    泛型 诞生了!
    泛型:看到有尖括号<>就要想到泛型,<>中的元素类型是可变的
    1. 泛型类
    定义
    使用 //重点学会使用泛型类
    2. 泛型方法
    3. 定义
    4. 使用
    5. class MyArrayList {
    6. private E[] array; private int size;
    7. }
    8. MyArrayList //概念上可以认为是定义了String[] array; //但实际上不是
    Class MyMap<K,V>{
    }
    MyArrayList list = new MyArrayList();
    new MyArrayList<>();//编译器可以自己进行类型推导
    (Type Inference)list.add(new Person());
    List.add(new Book()); //编译错误
    Person p = list.get(0); //不再是向下转型,不需要类型转换
    Book b = list.get(0); //编译错误
    泛型作用在编译期间 MyArrayList和MyArrayList和MyArrayList在运行期间实际上就是一个类型MyArrayList,这个过程叫做类型擦除,本质上E被擦除成Object类型了
    Class MyArrayList {
    Object[] array; a instanceof MyArrayList 错误
    int size; a instanceof MyArrayList 正确
    }
    泛型只能接收类,所以基本数据类型必须使用包装类
    包装类:
    public static interger valueOf(int i){}
    int i=10;
    Interger ii=Integer.valueOf(i); //装箱
    i=11;
    ii.intValue(); //仍然是10
    1. 装箱过程会生成Integer的对象
    2. i的值改变,不影响ii指向对象的内部的值

    下面是两个特殊的,其他基本数据类型的包装类就是首字母大写
    int->Interger
    char->Charavcter

    学习下面两种接口的常用方法:
    1.Collection接口常用方法:
    boolean add(E e) 将元素 e 放入集合中;
    void clear() 删除集合中的所有元素;
    boolean isEmpty() 判断集合是否没有任何元素,俗称空集合 ;
    boolean remove(Object e) 如果元素 e 出现在集合中,删除其中一个 int size() 返回集合中的元素个数;
    Object[] toArray() 返回一个装有所有集合中元素的数组 ;
    2.List接口的常用方法:
    V get(Object k) 根据指定的 k 查找对应的 v;
    V getOrDefault(Object k, V defaultValue) 根据指定的 k 查找对应的 v,没有找到用默认值代替 ;
    V put(K key, V value) 将指定的 k-v 放入;
    Map boolean containsKey(Object key) 判断是否包含 key boolean ;containsValue(Object value) 判断是否包含 value ;
    Set<Map.Entry<K, V>> entrySet() 将所有键值对返回 ;
    boolean isEmpty() 判断是否为空 ;
    int size() 返回键值对的数量 ;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值