集合转换为数组
Collection提供了一个方法toArray。可以将当前集合转换为一个数组
重载的toArray方法要求我们传入一个需要转换的数组
长度通常与集合size一致即可。
如果数组长度小于集合size,那么toArray方法内部会创建
一个与该数组类型且与集合size等长的数组将其返回
String[] array = c.toArray(new String[c.size()]);
数组转换为集合
* 数组的工具类Arrays提供了一个静态方法asList
* 可以将一个数组转换为一个List集合
asList方法内部:
创建一个名为ArrayList的实例(注意,它不是java.util.ArrayList
而是Arrays自己定义的一个内部类)。该实例会直接引用传入的数组。
因此对该集合的操作就是对该数组的操作。
List<String> list = Arrays.asList(array);
因为数组定长,所以试图改变长度的操作都是不支持的,会抛出不支持操作异常
可以自行创建一个新集合,然后包含前面数组转换的集合,这样就可以
随意的修改元素了且不会对原数组产生影响。
List<String> list2 = new ArrayList<>();//创建一个新数组
list2.addAll(list);//增加一个元素list
所有的集合都支持一种参数为Collection的构造器
作用是在创建该集合的同时就包含参数传入的集合中所有元素
List<String> list2 = new ArrayList<>(list);
//在创建该集合的同时就包含参数传入的集合中所有元素
上面的实例化等同于:
List<String> list2 = new ArrayList<>();
list2.addAll(list);
集合的排序
* java.util.Collections是集合的工具类,提供了很多static方法用于操作集合
* 其中提供了一个名为sort的方法,可以对List集合进行自然排序(从小到大)
Collections.sort(list);//将list集合进行从小到大排序
排序包含自定义类型元素的集合
List<Point> list = new ArrayList<>();
sort方法在排序时要求集合元素必须实现:Comparable接口
compare:比较
开发中我们定义的类不会去实现Comparable接口。原因:
该排序功能对我们的代码具有侵入性。
侵入性:
当我们使用某个API功能是,其放过来要求我们为它实现接口或做某些继承
并定义相关方法时,可以认定,该API功能对我们的代码具有侵入性。
Collections.sort(list);//编译不通过,需要重写方法
public int compare(Point o1, Point o2) {
/*
比较标准:点到原点的距离长的大
*/
int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
int olen2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
/*
判断大小的返回值:
当返回值>0时,表达o1>o2
当返回值<0时,表达o1<o2
当返回值=0时,表达o1=o2
*/
return olen1-olen2;
}
排序字符串
Collections.sort(list);//字符串自身的比较规则不满足对中文的排序
//可以为String自定义一种比较规则对集合排序
Collections.sort(list, new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.length()-o2.length();//字多的大,字少的小,降序则采取相反o2.length-o1.length
}
});
Lambda表达式-JDK8之后推出的新特性
* 语法:
* (参数列表)->{
* 方法体
* }
*
* 当使用匿名内部类创建时,如果实现的接口只有一个抽象方法,则可以使用lambda表达
* 式代替,使代码更简洁优雅。
*
* 在java中可以使用lambda表达式代替匿名内部类创建所需要实现的
* 接口时,该接口上都有一个注解:@FunctionalInterface
自定义比较器的匿名内部类写法
Comparator<String> c1 = new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
};
lambda表达式就是省去了匿名内部类创建是接口与方法名部分
lambda表达式可以忽略参数的类型
Comparator<String> c3 = (o1,o2)->{
return o1.length()-o2.length();
};
如果方法中只有一句代码时,该方法体的"{}"可以忽略不写
如果这句代码含有return关键字时,也要一同忽略return
Comparator<String> c4 = (o1,o2)->o1.length()-o2.length();
lambda表达式实际上是编译器认可的,最终会被改回为内部类方式创建
//源代码中使用lambda可以更突出重点-原匿名内部类中重写方法的逻辑
JDK8之后,java在集合Collection接口中添加了一个用于遍历集合元素的forEach
*方法。可以基于lambda表达式遍历集合元素。
//新循环方式(迭代器方式)
for(String e : c){
System.out.println(e);
}
//tips:当lambda中只有一个参数时,参数列表的"()"可以忽略不写
c.forEach(e->System.out.println(e));
/*
JDK8中出现的lambda表达式的变种写法:方法引用
对象::方法
当lambda表达式的参数与方法体中调用方法的参数一致时
例如:
(e)->System.out.println(e);
那么就可以写作:
System.out::println;
对象::方法
现在以了解为主即可
*/
c.forEach(System.out::println);
java.io.File
* File类的每一个实例用于表示文件系统中的一个文件或目录(本质是保存一个路径)
* 使用File我们可以:
* 1:访问文件或目录的属性(名字,大小等信息)
* 2:创建/删除 文件或目录
* 3:访问一个目录中的所有子项
*
* 但是不能访问文件数据
实际开发中,我们不会使用绝对路径:因为存在跨平台问题
// File file = new File("D:/project/JSD2304SE/demo.txt");
// 相对路径中"./"表示当前目录,在IDEA中是当前项目目录
File file = new File("./demo.txt");
String name = file.getName();//获取名字的方法
long length
返回当前File表示的文件的长度(单位是字节)
*/
long len = file.length();//获取文件的长度
System.out.println("大小:"+len);
是否可读
boolean cr = file.canRead();
System.out.println("是否可读:"+cr);
是否可写
boolean cw = file.canWrite();
System.out.println("是否可写:"+cw);
是否隐藏
boolean hidden = file.isHidden();
System.out.println("是否隐藏:"+hidden);
在当前项目目录下新建一个名为test.txt的文件
File file = new File("./test.txt");
/*
create:创建
file:文件
boolean createNewFile()
当且仅当File表示的路径下不存在且实际创建出该文件时返回true
boolean exists()
判断当前File表示的路径下是否真实存在该文件或目录,如果存在则返回true
*/
if(file.exists()){
System.out.println("该文件已存在");
}else {
file.createNewFile();//
System.out.println("创建完毕");
}
//将当前目录下的test.txt文件删除
//相对路径中"./"是可以忽略不写的,默认就是从"./"开始
File file = new File("test.txt");//等价于"./test.txt"
/*
boolean delete()
当且仅当File表示的文件或目录被成功删除返回true
*/
boolean delete = file.delete();
System.out.println("删除"+(delete?"成功":"失败"));
//在当前项目目录下新建一个目录:demo
// File dir = new File("./demo");
// 创建目录f:f目录在./a/b/c/d/e/f
File dir = new File("./a/b/c/d/e/f");
/*
make:做
mkdir是linux中的一个命令,用于创建一个目录
*/
// dir.mkdir();//创建目录时要求该目录所在的目录必须存在,否则创建失败
dir.mkdirs();//创建目录时会自动将所有不存在的父目录一同创建,推荐使用
//将当前项目目录下的demo目录删除
File dir = new File("./demo");
/*
delete方法在删除目录时要求必须是空目录,否则删除失败
*/
dir.delete();//只能删除一个目录最底层的一个