泛型的本质是参数化类型。泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。类型参数只能代表引用型类型,不能是简单数据类型(像int,double,char的等)
1泛型类
class 类名<泛型列表>{} 泛型列表可以有多个类型参数用逗号隔开
类名<具体类型> 对象名 = new 类名<具体类型>()
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。
泛型相比Object进行扩展的优势:
安全性和消除转换:在进行编译时就检验非法的类型,在返回具体类型时不用强制转换
List list1 = new ArrayList();
list.add(“泛型”);
list.add(1234);
String s = (String)list.get(1);
String s1 = (String)list.get(2);//运行时异常,类型转化错误
List<String> list2 = new ArrayList<String>();
list.add(“泛型”);
list.add(“1234”);//会检查数据类型是否是String
String s = list.get(1);
String s1 = list.get(2);//返回String 不用强制转换
提高性能:不用进行装箱和拆箱,开销巨大。泛型变量固定了类型,使用的时候就已经知道是值类型还是引用类型。
Object a=1;//装箱
int b=(int)a;//拆箱
重用性:
2泛型方法
访问修饰符 [static] [final] <泛型列表> 返回类型(也可以是泛型) 方法名(形式参数列表:一般有泛型参数)
泛型方法所在的类可以不是泛型类
3泛型接口
interface 接口名称<泛型标识>{}
class 实现类名<泛型标识> implements 接口名称<泛型标识>
接口名称/实现类名<具体类型> 对象名 = new 实现类名<具体类型>(...)
java 中泛型标记符:
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的 java 类型
4泛型集合类
位于java.util包
一种是集合(Collection),存储一个元素集合, 另一种是图(Map),存储键/值对映射。
常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
泛型集合类的统一架构:
List和set的区别:
1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变
5工具类
Collections是集合对象工具类,同样位于java.util包中。它提供了一系列静态方法,能更方便地操作各种集合。常规操作包括创建、排序、洗牌、同步等,不包括删除。 注意Collections结尾多了一个s,不是Collection!
Arrays是数组工具类。
相似的关键字:
final 和 finally
throw和throws