1、泛型

在前面的集合学习中,我们都知道集合是可以放任意对象的,只要把对象存储到集合后,其就会被自动提升为Object类型,当我们取出每一个对象,进行操作前,必须采用类型转换(常出现类型转换异常:java.lang.ClassCastException)
泛型:可以在类或方法中预支的使用未知的类型
好处:
将运行时期的ClassCastException,转移到了编译时期的编译失败,避免了类型强转的麻烦
泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型

  1. 自定义泛型类:
  2. 修饰符 class 类名<代表泛型的变量> { }
  3. ~~~~~~~~~~~~
  4. public class MyGenericClass<MVP> {
  5. //没有MVP类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型
  6. private MVP mvp;
  7. public void setMVP(MVP mvp) {
  8. this.mvp = mvp;
  9. }
  10. public MVP getMVP() {
  11. return mvp;
  12. }
  13. }
  14. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  15. 使用泛型:即什么时候确定泛型
  16. 在创建对象的时候确定泛型
  17. 例如:`ArrayList<String> list = new ArrayList<String>();`
  18. ~~~~~~~~~~~~
  19. public class GenericMethodDemo {
  20. public static void main(String[] args) {
  21. // 创建对象
  22. MyGenericMethod mm = new MyGenericMethod();
  23. // 演示看方法提示
  24. mm.show("aaa");
  25. mm.show(123);
  26. mm.show(12.45);
  27. }
  28. }
  1. 泛型方法:
  2. 修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
  3. public class MyGenericMethod {
  4. public <MVP> void show(MVP mvp) {
  5. System.out.println(mvp.getClass());
  6. }
  7. public <MVP> MVP show2(MVP mvp) {
  8. return mvp;
  9. }
  10. }
  1. 泛型接口:
  2. 修饰符 interface接口名<代表泛型的变量> { }
  3. public interface MyGenericInterface<E>{
  4. public abstract void add(E e);
  5. public abstract E getE();
  6. }

2、Collections

Collection是针对集合操作的工具类

  1. Collection中常用的方法:
  2. public static void sort(List<T> list)
  3. 将指定的列表按升序排序
  4. public static void reverse(List<?> list)
  5. 反转指定列表中元素的顺序
  6. public static void shuffle(List<?> list)
  7. 使用默认的随机源随机排列指定的列表
  8. 直接调用方法:
  9. Collections.方法名(list);

3、File类

java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建,查找和删除等操作

  1. public File(String pathname)
  2. 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
  3. public File(String parent, String child)
  4. 从父路径名字符串和子路径名字符串创建新的 File实例。
  5. public File(File parent, String child)
  6. 从父抽象路径名和子路径名字符串创建新的 File实例。
  7. 1、一个File对象代表硬盘中实际存在的一个文件或者目录
  8. 2、无论该路径下是否存在文件或者目录,都不影响File对象的创建

获取功能方法:

  1. public String getAbsolutePath()
  2. 返回此File的绝对路径名字符串。
  3. public String getPath()
  4. 将此File转换为路径名字符串
  5. public String getName()
  6. 返回由此File表示的文件或目录的名称。
  7. public long length()
  8. 返回由此File表示的文件的长度。

绝对路径和相对路径:

绝对路径:
从盘符开始的路径,这是一个完整的路径
相对路径:
相对于项目目录的路径,这是一个便捷的路径,开发中经常使用

判断功能的方法:

  1. public boolean exists()
  2. File表示的文件或目录是否实际存在。
  3. public boolean isDirectory()
  4. File表示的是否为目录。
  5. public String getName()
  6. 返回由此File表示的文件或目录的名称。

创建删除功能的方法:

  1. public boolean createNewFile()
  2. 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  3. public boolean delete()
  4. 删除由此File表示的文件或目录。
  5. public boolean mkdir()
  6. 创建由此File表示的目录。
  7. public boolean mkdirs()
  8. 创建由此File表示的目录,包括任何必需但不存在的父目录。
  9. delete方法,如果此File表示目录,则目录必须为空才能删除。

目录的遍历:

  1. public String[] list()
  2. 返回一个String数组,表示该File目录中的所有子文件或目录。
  3. public File[] listFiles()
  4. 返回一个File数组,表示该File目录中的所有的子文件或目录。
  5. 调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。

4、递归

递归是什么?我调用我自己就是递归
指在当前方法内调用自己的这种现象
递归分为两种
直接:方法自身调用自己
间接:A方法调用B方法,B方法调用C,C方法调用A方法
1、递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
2、在递归里虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
3、构造方法,禁止递归

  1. 递归累加求和:
  2. public class DiGuiDemo {
  3. public static void main(String[] args) {
  4. //计算1~num的和,使用递归完成
  5. int num = 5;
  6. // 调用求和的方法
  7. int sum = getSum(num);
  8. // 输出结果
  9. System.out.println(sum);
  10. }
  11. /*
  12. 通过递归算法实现.
  13. 参数列表:int
  14. 返回值类型: int
  15. */
  16. public static int getSum(int num) {
  17. /*
  18. num为1时,方法返回1,
  19. 相当于是方法的出口,num总有是1的情况
  20. */
  21. if(num == 1){
  22. return 1;
  23. }
  24. /*
  25. num不为1时,方法返回 num +(num-1)的累和
  26. 递归调用getSum方法
  27. */
  28. return num + getSum(num-1);
  29. }
  30. }
  1. 递归求阶乘:
  2. public class DiGuiDemo {
  3. //计算n的阶乘,使用递归完成
  4. public static void main(String[] args) {
  5. int n = 3;
  6. // 调用求阶乘的方法
  7. int value = getValue(n);
  8. // 输出结果
  9. System.out.println("阶乘为:"+ value);
  10. }
  11. /*
  12. 通过递归算法实现.
  13. 参数列表:int
  14. 返回值类型: int
  15. */
  16. public static int getValue(int n) {
  17. // 1的阶乘为1
  18. if (n == 1) {
  19. return 1;
  20. }
  21. /*
  22. n不为1时,方法返回 n! = n*(n-1)!
  23. 递归调用getValue方法
  24. */
  25. return n * getValue(n - 1);
  26. }
  27. }

5、小Demo

打印多级目录:

  1. public class DiGuiDemo2 {
  2. public static void main(String[] args) {
  3. // 创建File对象
  4. File dir = new File("D:\\aaa");
  5. // 调用打印目录方法
  6. printDir(dir);
  7. }
  8. public static void printDir(File dir) {
  9. // 获取子文件和目录
  10. File[] files = dir.listFiles();
  11. // 循环打印
  12. /*
  13. 判断:
  14. 当是文件时,打印绝对路径.
  15. 当是目录时,继续调用打印目录的方法,形成递归调用.
  16. */
  17. for (File file : files) {
  18. // 判断
  19. if (file.isFile()) {
  20. // 是文件,输出文件绝对路径
  21. System.out.println("文件名:"+ file.getAbsolutePath());
  22. } else {
  23. // 是目录,输出目录绝对路径
  24. System.out.println("目录:"+file.getAbsolutePath());
  25. // 继续遍历,调用printDir,形成递归
  26. printDir(file);
  27. }
  28. }
  29. }
  30. }

文件搜索:

  1. public class DiGuiDemo3 {
  2. public static void main(String[] args) {
  3. // 创建File对象
  4. File dir = new File("D:\\aaa");
  5. // 调用打印目录方法
  6. printDir(dir);
  7. }
  8. public static void printDir(File dir) {
  9. // 获取子文件和目录
  10. File[] files = dir.listFiles();
  11. // 循环打印
  12. for (File file : files) {
  13. if (file.isFile()) {
  14. // 是文件,判断文件名并输出文件绝对路径
  15. if (file.getName().endsWith(".java")) {
  16. System.out.println("文件名:" + file.getAbsolutePath());
  17. }
  18. } else {
  19. // 是目录,继续遍历,形成递归
  20. printDir(file);
  21. }
  22. }
  23. }
  24. }