1、泛型归类总结

1、泛型归类总结

1.1、泛型是什么?

泛型其本质是参数化类型(参数类型的传递),即所操作的数据类型被指定为一个参数(通常使用)

1.2、泛型能够解决什么问题?为什么要使用泛型?

运行时类型转换; 泛型能够对整数数组、字符串数组甚至其他任何类型的数组进行排序

1.3、泛型作用的时机?

泛型作用于编译期,且在运行期不可见

1.4、泛型的使用方式

1.4.1、泛型类

在类型上定义的泛型参数,叫泛型类;

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分;

在类型上定义的泛型参数,该类的所有方法上都可以使用。例如:(定义变量、方法参数、方法返回值、数组、集合)

1.4.1.1、泛型类格式:

如果一个类被 的形式定义,那么它就被称为是泛型类。

public class Test<T>{
    T field1;
}
//尖括号 <> 中的 T 被称作是类型参数,用于指代任何类型。
1.4.1.2、泛型类使用
Test<String> test1 = new Test<>(); 
Test<Integer> test2 = new Test<>();

泛型类不仅可以接受一个类型参数,它还可以这样接受多个类型参数。

public class Test<K,V> {
    K value1;
    V value2;
}
1.4.1.3、常见类型参数
  1. T 代表一般的任何类。

  2. E 代表 Element 的意思,或者 Exception 异常的意思。

  3. K 代表 Key 的意思。

  4. V 代表 Value 的意思,通常与 K 一起配合使用。

  5. S 代表 Subtype 的意思,文章后面部分会讲解示意。

1.4.2、泛型方法

1.4.2.1、泛型类与泛型方法的区别

泛型方法与泛型类稍有不同的地方是,类型参数也就是尖括号那一部分是写在返回值前面的。 中的T 被称为类型参数,而方法中的 T 被称为参数化类型,它不是运行时真正的参数。

方法上定义的泛型只能作用在该方法上(可以作为方法的参数类型、返回值类型、或者在方法内部使用);

1.4.2.1、泛型方法格式

语法: 在方法的返回值之前定义

public class Test1 { 
    public <T> void testMethod(T t){ 
    } 
}
public <T> T testMethod1(T t){ 
    return null; 
}//声明的类型参数,也可以当作返回值的类型的。
1.4.2.2、泛型类与泛型方法共存

当泛型类和泛型方法同时存在时, 并且泛型方法中定义的泛型参数符合和泛型类上一样时, 以泛型方法上为准(也就是说泛型方法上的泛型会覆盖泛型类上同名的泛型参数)

public class Test1<T>{ 
    public void testMethod(T t){            
        System.out.println(t.getClass().getName());
    }
    public <T> T testMethod1(T t){
        return t;
    }
}

但是,为了避免混淆,如果在一个泛型类中存在泛型方法,那么两者的类型参数最好不要同名。我们可以写成:

public class Test1<T>{ 
    public void testMethod(T t){ System.out.println(t.getClass().getName()); 
    }
    public <E> E testMethod1(E e){
        return e; 
    }
}

泛型类上定义的类型参数可以在该类的所有方法上使用

1.4.3、泛型接口

1.4.3.1、泛型接口格式

Java泛型接口的定义和Java泛型类基本相同

定义一个泛型接口:

public interface Generator<T> { 
    public T next(); 
}
1.4.3.2、注意事项
  1. 泛型接口未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中。

  2. 如果泛型接口传入类型参数时,实现该泛型接口的实现类,则所有使用泛型的地方都要替换成传入的实参类型。

1.4.4、泛型进阶用法

1.4.4.1、泛型继承

泛型不支持继承

List<People> manList = new ArrayList<Women>()
1.4.4.2、泛型通配符
1.4.4.2.1、无限通配符<?>

无限定通配符经常与容器类配合使用,它其中的 ? 其实代表的是未知类型,所以涉及到 ? 时的操作,一定与具体类型无关。

  1. 可以接收任何泛型参数
  2. 无法储存任何类型
  3. 取的时候只能取Object类型
1.4.4.2.1、上限通配符<? extends T>
<? extends T>描述了通配符上界,即具体的泛型参数需要满足条件;泛型参数必须是T类型或它的子类;例如 ```java Cat<?extends Animal> ``` 1. 保证获取的类型是T类型 2. 不能往其中储存数据 3. 上限通配符演示图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cd05uL54-1605616507728)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201114110237794.png)] ##### 1.4.4.2.1、下限通配符<? super T> <? super T>描述了通配符下界,即具体的泛型参数需要满足条件:泛型参数必须是T类型或它的父类;例如 ```java Cat<?super Animal> ``` 1. 可以存放T类型,或者T类型的子类型 2. 只能获取Object类型 3. 下限通配符演示图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jl0wp50l-1605616507733)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201114110021726.png)] ##### 通配符限制的到底是什么? ```java List<? extends People>manList=newArrayList(); ``` ### 1.4.4.3、泛型擦除 ##### 1.4.4.3.1、语法糖 "伪"的概念,本质上是欺骗程序员,让你觉得该语言具备某种特性,实际上则不然 ##### 1.4.4.3.2、反射验证 ```java public void testGenericType1() { Test t1 = new Test<>(); try { Method testMethod = Test.class.getDeclaredMethod("test", Object.class); testMethod.invoke("张三"); } catch(Exception e) {} } ``` ##### 1.4.4.3.3、反编译验证 ```java javap -c -p -l -v Test > Test_1.java ``` 泛型在运行期间是会被擦掉的, 只有编译期间才能发挥作用 # 2、集合框架 ## 2.1、集合和数组的区别 1. **数组的大小是固定的,集合不定的** 2. **数组是有不同类型的, 而集合只有一个类型,集合类型** ## 2.2、Collection ### **Collection****常用功能** ``` boolean add(Object e): 向集合中添加元素 void clear():清空集合中所有元素 boolean contains(Object o):判断集合中是否包含某个元素 boolean isEmpty():判断集合中的元素是否为空 boolean remove(Object o):根据元素的内容来删除某个元素 int size():获取集合的长度 Object[] toArray():能够将集合转换成数组并把集合中的元素存储到数组中 ``` ### 2.2.1、List实现类 #### ArrayList实现类 ArrayList是List接口的实现类,因为List接口继承了Collection接口,Collection接口继承了Iterable接口,因此**ArrayList**会实现List、Collection、Iterable中全部的方法。** ##### **ArrayList****构造方法** ```java ArrayList() //创建一个初始容量为10的空列表。 ArrayList(Collection<? extends E> c) //创建一个列表,包含参数中全部的元素,顺序与参 数中元素的顺序一致。 ArrayList(int capacity) //创建一个指定容量的空列表。 ``` ##### **ArrayList****常用方法** ArrayList的方法绝大多数都是接口中声明的方法。最最常用的方法就是List接口中声明的方法。 ##### ArrayList特点 基于数组实现,随机访问性能高, 增删慢 #### LinkedList实现类 ##### **LinkedList****构造方法** ```java LinkedList() //创建一个空列表。 LinkedList(Collection<? extends E> c) //创建一个列表,包含参数中全部的元素,顺序与参 数中元素的顺序一致。 ``` ##### **LinkedList****常用方法** LinkedList的方法绝大多数都是接口中声明的方法。最最常用的方法就是List接口中声明的方法;ArrayList的方法使用跟LinkedList一样 添加方法 ``` boolean add(E e) //向LinkedList中添加一个元素,元素会添加到LinkedList的末尾。如果添加成功,返回true void add(int index, E e) //在指定位置插入元素。 boolean addAll(Collection<? extends E> c) //将指定集合中的数据按顺序添加到 LinkedList的末尾。 boolean addAll(int index, Collection<? extends E> c) //将指定集合中的数据插入到 LinkedList的指定的位置。 ``` 删除元素 ```java boolean remove(Object o) //从列表中删除指定的元素,如果有多个,只会删除第一个。如 果成功删除返回true,如果没有删除返回false(例如:没有指定的元素)。 E remove(int index) //删除指定位置的元素。返回值是被删除的元素。 boolean removeAll(Collection<? extends E> c) //从列表中删除指定集合中包含的元 素。如果列表删除了数据返回true,否则返回false。 void clear() //清空列表中的元素 ``` 修改元素 ``` E set(int index, E e) //将指定下标的元素修改为e ``` 是否包含某元素 ```java boolean contains(Object o) //判断列表中是否包含指定的元素,如果包含返回true,否则 返回false。 ``` 获取列表内指定下标的元素 ``` E get(int index) //获取指定下标处的元素。 ``` 根据元素获取下标 ```Java int indexOf(Object o) //返回列表中指定元素第一次出现的下标。如果没有指定元素返回-1 int lastIndexOf(Object o) //返回列表中指定元素最后一次出现的下标。如果没有指定元素 返回-1 ``` 获取元素个数 ```java int size() //获取列表中元素的个数 ``` 列表转换数组 ``` Object[] toArray() //将list转换为数组。 ``` 排序 ```java void sort(Comparator<? super E> c) //按比较器提供的比较方法进行排序 ``` ##### **LinkedList****的特点** 基于双向链表, 增删操作(头、尾)快,随机访问慢 #### **Vector**实现类**** Vector也是List接口的实现类。在功能上它和ArrayList一样,底层数据结构也是数组。与ArrayList的不同点是,Vector在多线程环境下是安全的,ArrayList在多线程下不安全。 ##### **Vector的特点** 线程同步容器, 在多线程环境下用, 性能不高 ### 2.2.2、Set **Set**也是一个集合接口,它是对数学中集合的抽象,集合中不包含重复元素。既然是不含重复元素的集合,那它就具有排除重复元素的能力。Set接口中并没有声明多少独特的方法,而是声明了和父接口相同的方法。 #### HashSet实现类 HashSet中存储的数据是不重复的,元素的顺序也是无序的 ##### **HashSet构造方法** ```java HashSet() //创建一个空集合,集合的初始容量是16,加载因子是0.75 HashSet(Collection<? extends E> c) //创建一个包含指定元素的集合,会去除重。加载因子是 0.75 HashSet(int capacity) //创建一个指定初始容量的空集合。加载因子是0.75 HashSet(int capacity, int loadFactor) //创建一个空集合,指定初始容量和加载因子。 ``` ##### HashSet常用方法 因为HashSet不是有序集合,所以没有下标的概念,因此没有与下标相关的方法。 1. 添加元素 ```java boolean add(E e) //向集合中添加一个元素 boolean addAll(Collection<? extends E> c) //将指定集合中的数据添加到HashSet 中,会去重 ``` 2. 删除元素 ```java boolean remove(Object o) //从集合中删除指定的元素, boolean removeAll(Collection<? extends E> c) //从HashSet中删除指定集合中包含 的元素。 void clear() //清空集合中的元素 ``` 3.是否包含元素 ```Java boolean contains(Object o) //判断集合中是否包含某元素 ``` 4.获取集合中元素的个数 ```java int size() //获取集合中元素的个数。 ``` #### TreeSet TreeSet和HashSet都继承自AbstractSet类,不同的是TreeSet实现了NavigableSet接口,而该接口继承 了SortedSet接口,所以TreeSet是一个有序的Set。 1. 支持排序(里面有内置的排序算符,自然顺序); 2. 可以自定义排序算法 new TreeSet(Comparator c) ##### **TreeSet特点** 1. 有序:存入集合的顺序和取出集合的顺序一致 2. 无法存入null元素(因为要调用compare方法大小) 3. 存入TreeSet中的元素必须实现 java.lang.Comparable 接口 ##### LinkedHashSet的特点 1. 保证存、取顺序一致 #### List和Set的区别 1. List都是有序的,可重复的,都有索引,可以通过下标操作 2. Set是无序,不可重复的,不支持索引操作 ## 2.3**、Map** #### Map接口概述 Map接口是与Collection并列的接口。与Collection不同,Map中存储的是键值对; Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。 > Map中的集合不能包含重复的键,值可以重复;每个键只能对应个值 #### Map接口常用功能 ```java boolean containsKey(Object key) // 判断Map中是否包含键为key的键值对 boolean containsValue(Object value) // 判断Map中是否包含值为value键值对 boolean isEmpty() // 判断Map中是否没有任何键值对 void clear() // 清空Map集合中所有的键值对 V remove(Object key) // 根据键删除map中键值对 //遍历 Set
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值