一、泛型(JDK5以后新特性)
1、概述:泛型直接规定集合的存储类型,将明确的集合类型的工作推迟到了创建对象或者调用方法的时候,属于一种参数化类型,可作参数传递。
2、优点
(1)将运行时期异常提前到了编译时期;
(2)优化了设计,解决了×××警告线问题;
(3)避免了强制类型转换, ,解决了向下类型转换出现的问题ClassCastException;
(4)泛型的引出可以提供程序的安全性。
3、泛型定义在类上
(1)格式:public class 类名<T>{……}
(2)实例:
实体类:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCM581dvRWYoNHLwEzX5xCMx8FesU2cfdGLwATMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLmZWOxMTM0czMlBDOyQTZlRmMjVWZjRWNmhjZzYmZkhzLcBTMvwVNwgTMwIzLcd2bsJ2LcNXZnFWbp9CXt92Yu8GdjFTNuITavw1LcpDc0RHaiojIsJye.png)
测试类:
4、泛型定义在方法上
(1)格式:public<T> 返回值类型 方法名<T t>{……}
(3)注意:在方法上定义泛型时,若未指明类型,在主函数中可赋多种类型值。
5、泛型定义在接口上
(1)格式:
A、接口
Public Interface 接口名<T>{……}
B、子实现类:
情况一:泛型类型已确定
Public class 子实现类 implements 接口名<T>{……}
情况二:泛型类型不确定
Public class 子实现类<T> implements 接口名<T>{……}
接口:
子实现类:
6、泛型添加位置
(1)类/接口:定义类/接口时添加。
(2)集合:创建对象和获取迭代器时添加(创建集合对象,在泛型明确的情况下,前后必须保持一致)。
7、泛型通配符(高级)
(1)<?>:代表任意类型Object类型,或者任意Java类 。
(2)<? extends E>:向下限定,E的子类或者E本身。
(3)<? super E>:向上限定,E本身或者其父类。
(4)实例:
二、JDK5以后的新特性
1、可变参数
(1)当一个方法的参数个数不确定的时候,使用可变参数。
(2)格式:修饰符 返回值类型 方法名(数据类型...变量名){......}
(3)注意:a、变量名看作数组;b、数据类型…(数据类型后必须是三个“.”)。
2、增强for循环(实际开发中常用)
(1)作用:替代迭代器,在遍历集合或者遍历数组时常用增强for循环。
(2)格式:for(数据类型 变量名 : 数组或者集合对象名){
输出变量
}
(3)弊端:如果集合的对象是null,再次对集合操作,会出现异常。
解决:对集合进行非空判断。
例如:遍历存储String类型数据的集合list:
if(list !=null) {
for(String s:list) {
System.out.println(s);
3、静态导入
(1)特点:
A、前提:导入的方法必须为静态。
B、导入到一个方法的级别。
(2)格式:import static 包名.类名.方法名;
(3)方式:
A、导包,调用方法时直接写方法名。
B、不导包,调用方法时直接加前缀。
三、ArrayList(List集合的子实现类)
1、概述:ArrayList是List接口中常用的子实现类。
2、底层:数组实现,查询快,增删慢。线程不安全,不同步,执行效率高。
3、遍历功能
(1)Iterator iterator()方式。
(2)size()和get(int index)结合,普通for循环。
(3)增强for循环(实际开发中常用)。
(4)ListIterator listIterator()方式。
四、Vector(List集合的子实现类)
1、底层:是一种可增长对象数组实现,查询快,增删慢,线程安全,同步,执行效率高。
2、特有功能
(1)public void addElement(Object obj)添加元素。
(2)public Enumeration elements()返回此向量的枚举,相当于public Iterator iterator()。
(3)boolean hasMoreElements()判断是否有可遍历的元素。
(4)Object nextElement()遍历下一个元素。
五、LinkedList(List集合的子实现类)
1、底层:链表实现,查询慢,增删快。线程不安全的,不同步,执行效率高。
(1)添加功能
A、addFirst(Object e):将指定的元素插入到列表的开头
B、addLast(object e):将指定的元素添加到列表末尾
(2)获取功能
A、getFirst():获取列表第一个元素
B、getLast():获取列表第二个元素
(3)删除功能
A、public Object removeFirst()移除并返回此列表的第一个元素。
B、public Object removeLast()移除并返回此列表的最后一个元素。
3、实例:
六、Set集合
1、Set集合和List集合的区别
(1)Set集合:不允许元素重,且元素唯一,不能保证迭代的顺序恒久不变(底层哈希表和hascode),无序(存储和取出不一致),元素可以为null。
(2)List集合:允许元素重复,有序(存储和取出一致)。
2、Set集合创建对象(用子实现类HashSet):Set<数据类型> set = new HashSet<数据类型>();
3、Set集合元素唯一性和无序性原因
(1)唯一性:HashSet的add()方法底层依赖于双列集合HashMap,它依赖于两个方法,HashCode()方法和equals()方法。
(2)无序性:底层的哈希表和hashcode()方法。
4、自定义类中用Set集合
自定义类中用Set集合,无法保证元素唯一性。若要在自定义类中保证元素唯一性,需在自定义类中重写HashCode()方法和equals()方法。
七、LinkedHashSet集合
1、概述:具有可预知迭代顺序,元素唯一、有序,底层由链接列表与哈希表组成。
2、LinkedHashSet集合创建对象:
LinkedHashSet<数据类型> 对象名=new LinkedHashSet<数据类型>。
3、元素唯一有序原因
(1)保证元素唯一性:由哈希表决定(HashCode()方法和equals()方法)。
(2)保证元素有序性:由链表决定。
八、TreeSet集合
1、概述:TreeSet集合元素唯一,有序,默认情况下是通过自然顺序对集合中的元素排序。
2、TreeSet集合创建对象:TreeSet<数据类型> 对象名=new TreeSet<数据类型>();(默认)。
3、TreeSet集合添加元素存储方式
TreeSet集合依赖于TreeMap结构实现,红黑树结构(自平衡的二叉树结构)。
(1)将存储的第一个节点作为根节点;
(2)后面的每一个元素添加进来时,均与已存储的根节点作比较:
A、大于根节点,作为右孩子;
B、小于根节点,作为左孩子;
C、如果已经存在,忽略该元素,不存储。
上述方式保证了元素唯一有序。
4、取出元素:底层进行前序遍历或中序遍历或后序遍历。
5、TreeSet集合构造方法不同,使用的排序也不同
(1)无参构造:使用自然排序。自定义类需要实现Comparable接口,并需要在自定义类中重写该接口中的compareTo()方法。创建对象:TreeSet<类名> 对象名=new TreeSet<类名>();(默认情况)。
(2)有参构造:使用比较器排序。两种实现方式:
A、自定义类需要实现Comparator接口,并需要在自定义类中重写该接口中的compare()方法。创建对象:TreeSet<类名> 对象名=new TreeSet<类名>(new Comparator());
B、在主函数中用接口匿名内部类的方式实现,直接在主函数中实现Comparator接口,重写compare方法。创建对象:TreeSet<类名> 对象名=new TreeSet<类名>(new Comparator<类名>());
6、自定义类中用TreeSet集合实现自然排序:
自定义类需要实现Comparable接口,并在自定义类中重写该接口中的compareTo()方法,重写该方法时,需要在方法中写排序条件。
自定义类格式:
public class 类名 implements Comparable<类名> {
……
public 返回值类型 comparaTo(类名 对象名){
排序条件;