Java基础总结--泛型总结

时间:2023-12-18 16:40:08

-----泛型------JDK1.5出现的机制
1.泛型出现的原因--简化书写,提高安全性
技术的由来是为了解决问题,现在存在该问题,所有的容器定义类型为Object,所以任何对

象均可以放入容器--进行自动向上转型,要将容器的元素拿出来并使用该对象的特有内容时

候--进行强制的向下转型,但是假如进去的对象不是同种类型,强制就会失败--复用降低
早期处理方式:程序员主观控制--不能保证其他人的正确使用
后期处理方式:跟数组的思想一致,在声明的时候指定装入对象的类型,此后只能装该类型

的对象,否则编译就错误---泛型(避免后期安全)

2.泛型的好处
* 将运行时期的安全隐患转化到编译时期
* 遍历取出元素使用之前不用强转类型--直接就是该对象本身,可以直接使用
* 还能提供很多的设计上的便捷

3----什么时候使用---
*当接收的引用的类型不确定的时候使用,指定好类型,直接传入对象的引用,相当于指定了

要接收参数的范围
* 在程序中用到了含有<>的类/接口,就要明确传入的引用的具体类型
* 引用--是类的对象/接口子类对象的引用(E-类/接口)

注意小细节---泛型擦除----
泛型--编译时期的技术(给编译器使用的技术),用于编译时期,确保类型安全,并运行时候

会将泛型去掉,生成的class文件中不带泛型,这个称为泛型的擦除
关于泛型擦除的原因:主要为了兼容以前类加载器,其次在编译期间已经保证类型安全,所

以擦除也没有安全风险
---泛型补偿机制---在类装载器上加一个补偿机制,装载器获取对象的实际类型判断和转化
(getClass()-class),自动的做出强转--而不是程序员自己做强转,所以取出的元素可以直

接的使用

4.泛型的书写格式--java强类型语言,类型不匹配就编译不通过
容器类<对象类型> 容器对象引用 = new 容器类<对象类型>();
ArrayList<String> al = new ArrayList<String>();

6.不同情况下的泛型的使用--在集合框架里面应用最多
---自定义泛型类(没有泛型的时候使用Object-多态实现提高代码复用,存在运行安全隐患)
使用时机:当类中操作的引用类型不确定的时候使用泛型表示
好处:就是在使用对象的特有内容时候不需要进行强转,直接使用,具有更高的安全性,把

问题控制在编译期间
---泛型方法---可以传入任意对象并调用该方法
将泛型定义在方法上面(使用Object也可以实现,两种形式没有大差别)
eg public <W> void show(W w){语句;}
泛型方法注意:
当方法静态的时候不能访问类上定义的泛型,如果静态方法要使用泛型,就将泛型定义在方

法上eg public static <W> void show(W w){语句;}
泛型方法接收的对象,不能使用对象特有的东西,只能使用从Object继承的方法
---泛型接口---
定义一个泛型接口,具体子类实现接口的时候可以指定具体类型/继续使用泛型,指到创建对

象的时候再指定也可以eg:public interface List<E>extends Collection<E>
---泛型上限及体现---
泛型的通配符--?等价于? extends Object未知道的类型--没有返回值
eg:public static void printCollection(Collection<?> coll){语句}
这个也可以使用泛型方法实现--可以对返回值进行操作
eg:public static<T> T void printCollection(Collection<T> coll){语句}

泛型的限定-上限:?extends Person:接收Person以及Person的子类 <= E
元素出来接收用其父类Person接收
eg:public static void printCollection(Collection<? extends Person> coll){语句}
泛型上限的应用:集合里面存储元素时候--存储E及其子类对象的引用
(因为都是按照上限类型运算,不会出现安全隐患。应用较多)

----泛型下限及体现----用的不多
泛型的限定-下限:?super E 接收E类型或其父类类型 >=E
TreeSet(Comparator<? super E> comparator) 比较器对特定元素的排序
泛型下限的应用:对集合中的元素进行取出来的操作
比较器进行比较的时候,要取出元素比较,因为是父类,所以一定可以接收子类对象

---集合框架的查阅技巧---
需要唯一吗:Set
需要唯一+排序 TreeSet
需要唯一+和输入顺序一致LinkedHashSet
----前提不需要唯一List
1.经常增删LinkedList
2.不需要ArrayList
后缀代表所在的集合所属体系,前缀表示集合代表的数据结构
看到Array--联系数组适合查询
看到Link--联系链表适合增删
看到Hash--联系哈希表,唯一性,hashCode()&equals()
看到Tree--联系二叉树,排序,Comparable+Comparator
常见的容器一般都是非线程安全的