Java序谈之泛型知识点
来源:互联网 发布:ubuntu 17.04更新源 编辑:程序博客网 时间:2024/04/30 09:55
泛型是什么?
泛型用于声明集合中的数据类型
泛型有什么好处?
1、增强了代码的安全性
分析:给集合中传入一些类A的对象,但是在接收这些对象的时候也许会用类B的对象接收,并且这种错误在编译时期不会显示,在运行时候才会报错
代码示例:
ArrayList<Student> arrayList = new ArrayList<>();arrayList.add(new Student(36,"Kobi"));arrayList.add(new Student(30,"Lebron"));arrayList.add(new Student(43,"Jordan"));arrayList.add(new Student(43,"Jordan"));Worker worker = (Worker)arrayList.iterator().next();
好处:可以将错误停留在编译期
2、减少了向下转型的步骤
分析:集合中所有的数据类型都是Object的,在输出集合中的值得时候,需要向下转型成对应的类型才可运算
代码分析:
System.out.println(arrayList.iterator().next());
泛型中小知识点
1、菱形泛型
定义:在初始化集合的时候,只需要在前一个菱形符中定义集合元素类型即可,后面菱形符可以不写
代码示例:
ArrayList<Student> arrayList = new ArrayList<>();
2、int...num
分析:这代表在参数列表中可以输入多个int类型数据,相当于一个 int [ ] array
注意:在方法的重载时候,不可以一个方法参数列表是(int...num)另一个是(int [ ] array ),两个方法相同
代码示例:
public static void Print(int [ ] array) {}public static void Print(int num1,int...num) {}分析:在 int...num 参数列表中可以说添加int类型参数,但是要放在前面,否则传进来都会被传进int...num
3、正向遍历数组,反向遍历数组
分析:使用listIterator关键字
注意:previous在使用的使用实质也是看指针的位置,直接使用输出为空
代码示例:
ListIterator<Student> listIterator = arrayList.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}while (listIterator.hasPrevious()) {System.out.println(listIterator.previous());}
泛型通配符
关键词: ? extends E ?:代表子类 E:代表父类
代码示例:
ArrayList<Person> arrayList = new ArrayList<>();arrayList.add(new Person(18,"wangning"));arrayList.add(new Person(18,"wangning"));arrayList.add(new Person(18,"wangning"));ArrayList<Student> arrayList2 = new ArrayList<>();arrayList2.add(new Student(18,"ning"));arrayList2.add(new Student(18,"ning"));arrayList.addAll(arrayList2);分析:Person在使用addALL()方法的时候,会要求添加的集合是它的子类
asList关键词
作用:可以将数组转换为集合,是Arrays的方法,它还有toString的方法经常使用
注意:不可以使用 add 和 remove方法
意义:可以使用集合中的其他方法
代码示例:
int [] array = {1,2,3,4,5,6,7};List<int []> list = Arrays.asList(array);System.out.println(list);Integer [] array1 = {1,2,3,4,5,6};List<Integer> list2 = Arrays.asList(array1);分析:将int类型的数组转换为集合,输出的是数组的地址,因为数组中的元素没有被装箱成包装类
使用Integer类型的数组,就是讲每个元素添加到集合,可直接输出
List中六种遍历的方法和可修改(添加、删除)元素的方法
1、iterator迭代器
代码示例:
ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("a");arrayList.add("a");arrayList.add("a");Iterator<String> iterator = arrayList.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}
2、ListIterator
特点:可对集合进行添加、删除操作
代码示例:
ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("b");arrayList.add("e");arrayList.add("a");ListIterator<String> listIterator = arrayList.listIterator();while (listIterator.hasNext()) {String str = listIterator.next();if (str.equals("b")) {listIterator.remove();}else if(str.equals("e")) {listIterator.add("wow");}}System.out.println(arrayList);注意:这里面不可以将remove操作和add操作放在一个if语句中进行,会报错
3、for循环
代码示例:
ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("b");arrayList.add("e");arrayList.add("a");for (int i = 0; i < arrayList.size() ; i++) {if(arrayList.get(i).equals("b")) {arrayList.add("wow");}else if(arrayList.get(i).equals("a")) {arrayList.remove(i--);}}分析:在For循环中删除的时候,由于ArrayList底层是基于数组的,在删除一个元素之后,后面的元素会整体往前位移一位
此时如果继续循环,可能将位移到删除元素所在位置的新元素忽略运算,所以需要使用 " i-- "的操作,这样遇到 “a”元素之后
数组又会重新在删除元素所在位置上进行判断,保证了准确性
4、For each循环
代码示例:
ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("b");arrayList.add("e");arrayList.add("a");for (String string : arrayList) {System.out.println(string);}
分析:For each方法只能用来遍历,冒号前: 元素类型 元素名 冒号后:要遍历的集合名
5、Vector中的枚举遍历
关键词:elements
代码示例:
Vector<String> vector = new Vector();vector.add("a");vector.add("a");vector.add("b");vector.add("e");vector.add("a");Enumeration<String> elements = vector.elements();while (elements.hasMoreElements()) {System.out.println(elements.nextElement());}6、toArray方法
注意:返回值类型是Object类型数组
代码示例:
Vector<String> vector = new Vector();vector.add("a");vector.add("a");vector.add("b");vector.add("e");vector.add("a");Object[] array = vector.toArray();for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}
需求:给集合中的对象按照年龄或者姓名排序
分析:int类型年龄使用 >比较。string类型姓名使用 compareTo比较
使用了嵌套循环,使用了中间变量
按年龄排序代码示例:
ArrayList<Student> arrayList = new ArrayList<>();arrayList.add(new Student(15,"wangning"));arrayList.add(new Student(20,"wangning"));arrayList.add(new Student(17,"wangning"));arrayList.add(new Student(36,"wangning"));arrayList.add(new Student(5,"wangning"));arrayList.add(new Student(99,"wangning"));for (int i = 0; i < arrayList.size()-1; i++) {for (int j = i+1; j < arrayList.size(); j++) {if(arrayList.get(i).getAge()>=arrayList.get(j).getAge()) {Student student;student = arrayList.get(i);arrayList.set(i, arrayList.get(j));arrayList.set(j, student);}}}
按姓名排序代码示例:
for (int i = 0; i < arrayList.size()-1; i++) {for (int j = i+1; j < arrayList.size(); j++) {if(arrayList.get(i).getName().compareTo(arrayList.get(j).getName())>=0) {Student student;student = arrayList.get(i);arrayList.set(i, arrayList.get(j));arrayList.set(j, student);}}}System.out.println(arrayList);
使用Collections的方法排序
分析:使用collections方法排序,但是具体按照什么规则排序系统并不知道,这时候系统给出接口,需要实现这个接口,重写比较方法,在方法中具体编写排序规则
注意:需要再集合中元素所在的类中实现comparable接口,并且在comparable<>中填入元素类型
步骤:
- 实现comparable接口
- 重写compareTo方法
- 编写排序规则
- 使用collections调用sort方法
代码示例:
1、实现comparable:
public class Student extends Person implements Comparable<Student>2、重写compareTo方法:
public int compareTo(Student o) {}3、编写排序规则:
public int compareTo(Student o) {return this.getAge()-o.getAge();}4、使用collectins方法调用sort方法:
Collections.sort(arrayList);
思考:集合与集合之间如何嵌套?
代码示例:
//一班ArrayList<Student> arrayList = new ArrayList<>();arrayList.add(new Student(18,"wangning"));arrayList.add(new Student(19,"wangning"));//二班ArrayList<Student> arrayList1 = new ArrayList<>();arrayList1.add(new Student(20,"wangning"));arrayList1.add(new Student(21,"wangning"));ArrayList<ArrayList<Student>> arrayList2 = new ArrayList<>();arrayList2.add(arrayList);arrayList2.add(arrayList1);for (ArrayList<Student> arrayList3 : arrayList2) {for (Student student : arrayList3) {System.out.println(student);}}
分析:
- arraylist1 中保存的是Student类型的数据
- arraylist2 中保存的是Student类型的数据
- arraylist3 中保存的是ArrayList集合的引用
特点:形成了树状分支结构
- Java序谈之泛型知识点
- java知识点之泛型
- Java序谈之面向对象知识点
- Java 泛型知识点
- java 泛型知识点综合 之 示例程序
- 细小知识点之Java
- Java多线程之知识点
- Java泛型知识点整理
- java泛型知识点总结
- Java-泛型知识点整理
- Java知识点之“Java多线程”
- 【Java学习】Java泛型知识点总结
- Java 知识点之“汇总一”
- java零乱知识点之二
- Java之反射知识点记录
- 知识点整理之Java Socket
- java知识点之可变参数
- java知识点之静态导入
- 如何用keil和proteus点亮流水灯
- javaScript常用总结
- vue在window安装教程
- iOS图片逐渐加载的效果实现
- Codeforces 678C Joty and Chocolate
- Java序谈之泛型知识点
- 46-IO流(Properties集合的-练习)12 47-IO流(综合练习-文件清单列表. 48-IO流(打印流-PrintStream) 49-IO流(打印流-PrintWriter).
- 欧拉回路学习
- 使用Dynamsoft Twain实现Web 在线扫描上传
- J2EE与中间件 学习笔记1 JDBC Session Servlet
- 分治---快速排序
- 第四章 键值对操作(一)
- unity粒子系统碰撞
- (转载)SSH框架的整合详解(Struts2 + Spring + Hibernate)