泛型:
jdk1.5出现的安全机制。
好处:
1,将运行时期的问题ClassCastException转到了编译时期。
2,避免了强制转换的麻烦。
<>:什么时候用?当操作引用数据类型不确定的时候。就是用<>。将要操作的引用类型转入即可。其实<>就是一个接受具体引用数类型参数范围。
在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。
<E> :E代表引用数据类型(类或者接口)
泛型技术是给编译器使用的技术,用于编译时期。确保了类型的安全。
运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。
为什么擦除?因为为了兼容运行时的类加载器。
泛型的补偿:在运行时,通过获取元素的类型对进行转换动作。不用使用者在强制转换了。
<T>: type的缩写。
泛型里面不能写基本数据类型。引用的可以 int []
jdk1.5后,使用泛型来接收类中要操作的引用数据类型。
泛型类。什么时候用?当类中的操作的引用数据类型不确定的时候,就使用泛型来表示。
泛型方法:将泛型定义在方法上。
当方法静态时,不能访问类上定义的泛型。如果静态方法使用泛型,只能将泛型定义在方法上。泛型的定义一定要放在返回类型的前面,修饰符的后面。
泛型接口:将泛型定义在接口上。
泛型的通配符:?未知类型。
<? extends Object>
Collection<Person> a1= newArrayList<Studeng>(); 左右两边泛型类型不一样。
泛型的限定<? extends Person>接收Person类型或者Person的子类型对象。上限。
<? super E>:接收E类型或者E的父类型。下限。
一般在存储元素的时候都是用上限,因为这样取出都是按照上限类型来运算的。不会出现类型安全隐患。
什么时候用下限?通常对集合中的元素进行取出操作时,可以使用下限。
泛型视频----10
集合的一些技巧:
需要唯一么?
需要:Set
需要指定顺序么?
需要:TreeSet
不需要:HashSet
但是想要一个和存储一致的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删么?
需要:LinedList
不需要:ArrayList
如何记住每一个容器的结构和所属体系?
看名字
后缀名就是该集合所属体系。前缀名就是该集合的数据结构。
看到array:就要想到数组,查询快,有角标。
看到link:就要想到链表,增删快,就要想到add get remove +first last的方法。
看到hash:就要想到哈希表,唯一性,就要想到元素需要覆盖hashcode和equals方法。
看到tree:就要想到二叉树,排序,就要想到两个接口comparable,comparator。
而且通常这些常用的集合容器都是不同步的。