一、泛型
概述
JDK1.5同时推出了两个和集合相关的特性:增强for循环,泛型
泛型可以修饰泛型类中的属性,方法返回值,方法参数, 构造函数的参数
Java提供的泛型类/接口
- Collection, List, Set,Iterator 等
自定义的泛型
public class Student <H,W>{}
自定义的泛型方法public static <T> void showList(List<T> list){
//list.forEach(s-> System.out.println(s));
for (T t : list) {
System.out.println(t);
}
}
泛型的通配符
T: type(表示Java类型 类型)
E: Element(主要在List中使用 元素)
K: key(主要在Map集合中使用,表示键)
V: value(主要在Map集合中使用,表示值)
?: 表示不确定类型的Java类型
泛型的边界
泛型的上界
语法:? extends 类型
位置:类上,方法参数
泛型的下界
语法:? super 类型
位置: 方法参数
java/** * 泛型的上界和下界 * * ? 是泛型的通配符,不知道用什么类型的时候用? * 泛型上界语法: ? extends 类 * 泛型下界语法: ? super 类 * */ public class GenericityTest { public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(); List<String> list2 = new ArrayList<>(); List<Number> list3 = new ArrayList<>(); List<Object> list4 = new ArrayList<>(); ShowCollection sc = new ShowCollection(); sc.showList1(list1); //sc.showList1(list2); 编译不通过,因为String不是Number的子类 sc.showList1(list3); // sc.showList1(list4); 编译不通过,Object不是 Number的子类 // sc.showList2(list1); //编译不通过,因为Integer不是Number的父类 // sc.showList2(list2); //编译不通过,因为String不是Number的父类 sc.showList2(list3); //最小不能低于Number.此处是Number sc.showList2(list4); //编译通过,Object是Number的父类 } } class ShowCollection{ //泛型的上界 public void showList1(List<? extends Number>list){} //泛型的下界 public void showList2(List<? super Number> list){} }
二、数据结构
- 数据结构概述
-
数据结构式计算机底层存储、组织数据的方式,是值数据与数据之间以什么样的方式排列在一起
-
选择合适和数据结构可以带来更搞笑的运行或者存储效率
- 常见的数据结构
-
栈
-
队列
-
链表
-
数组
-
...
- 栈数据结构的执行特点
-
后进先出,先进后出
-
入栈/压栈: 数据进入栈的过程
-
出栈/弹栈:数据离开栈的过程
- 队列
-
先进先出,后进后出
-
入队列:数据从队列后端进入队列的过程
-
出队列:数据从队列前端离开对列的过程
- 数组
-
数组是一种查询快,增删慢的数据结构
-
数组在内存中是一块连续的存储空间
- 链表
-
链表中的元素在内存中是不连续存储的(游离),每个元素节点都包含数据值和下一个元素的地址
-
链表查询慢,增删快,首尾操作极快
三、List
javajava.util.List接口,通常称为:线性表 * List继承自Collection,特点是可以存放重复的元素并且有序 * * 常用的实现类 * java.util.ArrayList:内部用数组实现,查询性能好 * java.util.LinkedList:内部使用链表实现,增删性能好,首尾增删性能最好 * 在对集合操作性能没有特殊要求的条件下通常使用ArrayList */ public class ListDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("one"); list.add("two"); list.add("three"); list.add("four"); list.add("five"); /** * E get(int index) 返回列表中指定位置的元素。 */ //获取集合中下标是3个元素 System.out.println(list.get(3)); //用for循环遍历集合 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } /** * E set(int index, E element) * 用指定元素替换列表中指定位置的元素(可选操作)。 * 返回值是被替换掉的元素。 */ String str = list.set(1, "二"); System.out.println(str); System.out.println(list); //反转集合 for(int i=0;i<list.size()/2;i++){ //获取i上的元素 String e = list.get(i); String s = list.set(list.size()-1-i,e); list.set(i,s); } System.out.println(list); System.out.println("=============================="); /** * Collections类中提供了静态方法 static void reverse(List<?> list) 反转指定列表中元素的顺序。 */ Collections.reverse(list); System.out.println(list); } }
三点五、作业练习
java/** * 泛型: * 泛型只是在编译期有效,在编译之后程序会采取去繁星花的措施。将泛型相关的信息擦除 * */ public class CollectionDemo3 { public static void main(String[] args) { List<String> strs = new ArrayList<>(); List<Integer> ints = new ArrayList<>(); Class aClass = strs.getClass(); Class bClass = ints.getClass(); System.out.println(aClass); System.out.println(bClass); // if(strs.equals(ints)){ // System.out.println("类型一致"); // }else{ // System.out.println("类型不一致"); // } } }
java/** * 自定义泛型方法测试 */ public class ShowListTest { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); //ShowList.showInt(list); ShowList.showList(list); List<String> strs = new ArrayList<>(); strs.add("一"); strs.add("二"); strs.add("三"); strs.add("四"); strs.add("五"); ShowList.showList(strs); List<Teacher> teas = new ArrayList<>(); teas.add(new Teacher("张老师",1500)); teas.add(new Teacher("李老师",2500)); teas.add(new Teacher("孙老师",9500)); teas.add(new Teacher("赵老师",3500)); ShowList.showList(teas); } public static <T> void showList(List<T> list){ //list.forEach(s-> System.out.println(s)); for (T t : list) { System.out.println(t); } } }