day15 泛型
泛型概述
可以在类或方法中预支地使用未知的类型。
注意
一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
使用泛型的好处
-
将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
-
避免了类型强转的麻烦
泛型的定义和使用
通常情况下,T,E,K,V,?是这样约定的:
-
?表示不确定的 java 类型
-
T (type) 表示具体的一个java类型
-
K V (key value) 分别代表java键值中的Key Value
-
E (element) 代表Element
泛型可以用到类、方法、接口,属性中
泛型中的类型 <类型> 只能是引用类型
泛型方法
定义格式
修饰符 <代表泛型的变量> 返回值类型 方法名 (参数){ }
泛型接口
-
定义格式
修饰符 interface接口名<代表泛型的变量> { }
类和接口对于和泛型的定义格式一样
泛型通配符
什么是泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
举例
Collection<?> c5 = new ArrayList<Object>(); Collection<?> c6 = new ArrayList<Animal>(); Collection<?> c7 = new ArrayList<Dog>(); Collection<?> c8 = new ArrayList<Cat>(); 什么情况不能使用T要用? Collection<?> a = new ArrayList<String>(); a = new ArrayList<Integer>(); 下面的会报错 Collection<T> b = new ArrayList<>(); b = new ArrayList<Integer>();
通配符高级使用
?:任意类型,如果没有明确,那么就是Object以及任意的Java类了 ?表示任意的类型都是可以的 Collection<?> c5 = new ArrayList<Object>(); Collection<?> c6 = new ArrayList<Animal>(); Collection<?> c7 = new ArrayList<Dog>(); Collection<?> c8 = new ArrayList<Cat>(); ? extends E:向下限定,E及其子类 // ? extends E:向下限定,E及其子类,表示包括E在内的任何子类; // Collection<? extends Animal> c9 = new ArrayList<Object>(); Collection<? extends Animal> c10 = new ArrayList<Animal>(); Collection<? extends Animal> c11 = new ArrayList<Dog>(); Collection<? extends Animal> c12 = new ArrayList<Cat>(); ? super E:向上限定,E极其父类 ? super E:向上限定,E极其父类,表示包括E在内的任何父类; Collection<? super Animal> c13 = new ArrayList<Object>(); Collection<? super Animal> c14 = new ArrayList<Animal>(); // Collection<? super Animal> c15 = new ArrayList<Dog>(); // Collection<? super Animal> c16 = new ArrayList<Cat>();
静态导入
第一种
System.out.println(java.lang.Math.abs(-100));
第二种
import static java.lang.Math //lang包写一般不导入包,也可以导入包 System.out.println(Math.abs(-100));
第三种
import static java.lang.Math.abs; System.out.println(abs(-100));
可变参
可变参数(T...a) 不限类型,不限长度,可传入多个参数,也可传入数组
举例
public class VarargsExample { public static void myMethod(char... args) { for (char arg : args) { System.out.println(arg); } } public static void main(String[] args) { char[] myArray = {'H', 'e', 'l', 'l', 'o'}; myMethod(myArray); // 传递一个字符数组作为参数 myMethod('H', 'e', 'l', 'l', 'o'); // 直接传递多个字符作为参数 } }
数组和集合互转
list集合 --> set集合
List<String> list = new ArrayList<>(); list.add("a"); Set<String> set = new HashSet<>(list);
set集合 --> list集合
Set<String> sets = new HashSet<>(); sets.add("a"); List<String> lists = new ArrayList<>(sets);
注意事项
虽然可以把数组转成集合,但是集合的长度不能改变。
数组 --> list集合
String[] str = {"hello","world","java"}; 方式一 List<String> list = Arrays.asList(str); 方式二 List<String> list = Arrays.stream(str).collect(Collectors.toList());//int,short,byte类型需要加上一个单独的方法,其他的暂时未知
list集合 --> 数组
List<String> list = new ArrayList<String>(); list.add("hello"); list.add("world"); String[] str = new String[list.size()]; list.toArray(str);//toArray参数中只能传入引用数组的数据类型
数组 --> set集合
String[] s = {"a","b","c"}; 方式一 List<String> list = Arrays.asList(s); Set<String> set = new HashSet<>(list); 方式二 Set<String> set = Arrays.stream(s).collect(Collectors.toSet());//int,short,byte类型需要加上一个单独的方法,其他的暂时未知
set集合-->数组
Set<String> set = new HashSet<>(); set.add("abc"); List<String> lists = new ArrayList<>(set); String[] str4 = new String[lists.size()]; lists.toArray(str4);//toArray参数中只能传入引用数组的数据类型
注意 int 数组 转 set 和 list集合
第二种方法为
Set<Integer> set = Arrays.stream(n).boxed().collect(Collectors.toSet());
Collections
Collections是针对集合操作的工具类
Collections常用的方法
方法名 | 说明 |
---|---|
public static void sort(List<T> list) | 将指定的列表按升序排序 |
public static void reverse(List<?> list) | 反转指定列表中元素的顺序 |
public static void max() | 获取集合中最大值 |
collection和collectons的区别?
Collection 是一个集合接口
Collections 是一个操作集合的工具类
File类
是文件和目录路径名的抽象表示(其实file创建的对象,就是将要 将要创建的文件或者目录的路径 创建成一个对象,此时不会对盘符有任何影响),主要用于文件和目录的创建、查找和删除等操作。
File类构造方法
方法名 | 说明 |
---|---|
public File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
public File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例。 |
public File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例。 |
注意:
因为没有使用createNewFile()方法,所以创建的对象不会对电脑盘符中的目录或者文件有任何操作
如果使用了createNewFile()方法,将创建的对象盘符操作,操作后会返回boolean类型
获取功能方法
方法名 | 说明 |
---|---|
public String getAbsolutePath() | 返回此File的绝对路径名字符串。 |
public String getPath() | 将此File转换为路径名字符串 |
public String getName() | 返回由此File表示的文件或目录的名称。 |
public long length() | 返回由此File表示的文件的长度。 |
判断功能的方法
public boolean exists() | 此File表示的文件或目录是否实际存在。 |
---|---|
public boolean isFile() | 是否是一个文件 |
public boolean isDirectory() | 此File表示的是否为目录。 |
public boolean canWrite() | 是否能写 |
public boolean canReade() | 是否能读 |
public boolean isHidden() | 是否隐藏 |
创建&删除功能的方法
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 |
public boolean delete() | 删除由此File表示的文件或目录。 |
public boolean mkdir() | 创建由此File表示的目录。 |
public boolean mkdirs() | 创建由此File表示的目录,包括任何必需但不存在的父目录。 |
注意
delete方法,如果此File表示目录,则目录必须为空才能删除。(如果要删除目录,目录中不能有文件,否则删不了)
在上述基础上,创建出来的多级目录,每次用file对象掉用一次delete,删除的只是最里面的一个文件,或者目录
重命名方法
public boolean renameTo(File dest)
如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切。
举例
public static void main(String[] args) throws IOException { //数据数据源,前提得这个数据存在 File srcFile = new File("D:\\江一燕.jpg"); //数据数据的目的地 File newFile = new File("D:\\我和江一燕.jpg");//相同路径是改名 // File newFile2 = new File("e:\\我和江一燕.jpg");//不同路径是剪切并改名 //实现改名 System.out.println(srcFile.renameTo(newFile)); }
目录的获取
方法名 | 说明 |
---|---|
public String[] list() | 返回一个String数组,表示该File目录中的所有子文件或目录。 |
public File[] listFiles() | 返回一个File数组,表示该File目录中的所有的子文件或目录。 |
举例
//创建file File file = new File("d:\\"); //获取e盘下所有的文件及目录 String[] list = file.list(); for(String s : list){ System.out.println(s); } System.out.println("------------------"); //创建file File file2 = new File("d:\\"); //获取e盘下的所有file文件 File[] files = file2.listFiles(); for(File f : files){ System.out.println(f); }