Ykuri98
文章46
标签14
分类1
学习总结(2022.04.07-2022.04.11)

学习总结(2022.04.07-2022.04.11)

String常量池

每次创建字符串常量时,JVM会检查常量池是否存在该常量,如果存在则直接返回该常量的实例引用,没有才会在常量池中创建该常量对象。

例子

1
2
3
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2)// ==是判断两个引用是否指向同一对象,返回true

String两种实例化方式的区别

  • 直接赋值的方式 String s = "abc";
  • 通过构造方法 String s = new String("abc")

第一种只会创建一个对象,第二种则会创建两个对象:一个是与第一种相同的创建方式,一个则是因为new关键字而创建的。虽然两者并不是同一个对象,但它们共用一个value数组(即String类中的char数组)(如果常量池中早已有第0,一种方式创建好的对象,那么第二种方式也只会创建一个对象,即new关键字创建的对象)

第一种会在常量池中创建对象,第二种会在堆上创建对象。

字符串拼接

字符串拼接时有两种情况:

  1. 在常量池中创建新的对象
  2. 在堆上创建新的对象

这两个对象并不是同一个对象,用==判别会返回false。

只要拼接的字符串中有一个是以引用变量的形式出现的(比如String snew String("abc"))那么该字符串就是在堆上创建对象。只有拼接时都是以直接赋值的方式创建时,才会在常量池中创建对象(若常量池中已存在拼接后的对象,则不会创建新的,而是使引用指向该对象)

自然排序

一般使用Comparable接口和Comparator接口实现。

Comparable接口一般在希望能实现排序的类中实现,通过重写compareTo()方法来达到排序的效果。

a1.compareTo(a2)的返回值若大于0,说明a1对象大于a2,a1排在后面;小于0,说明a1对象小于a2,a1排在前面;等于0则说明a1等于a2。

重写后可以通过Arrays.sort()Collections.sort()进行自动排序。

Comparator接口一般用于匿名内部类排序,相比Comparable接口更加灵活,依赖于带比较器的Arrays.sort(T[] a, Comparator<? super T> c) ,排序规则跟Comparable接口相同。

示例:

1
Arrays.sort(students,(stu1,stu2)->stu1.getAge() - stu2.getAge());// 根据学生年龄排序

StringBufferStringBuilder

都是长度可变的字符串类,StringBuilder线程不安全,StringBuffer线程安全。

throws,throw

throws用在方法声明后面,跟的是异常类名;可以跟多个异常类名,用逗号隔开。

throws表示出现异常的一种可能性,并不一定会发生这些异常,且throws修饰的方法由该方法的调用者来处理。

throw用在方法体内,跟的是异常对象名,只能抛出一个异常对象。

throw表示抛出异常,可以由方法体内的语句处理,但执行throw则一定抛出了某种异常。

自定义异常

可以自己写一个类并继承ExceptionRuntimeException 来自定义异常。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class MyException extends Exception{
public MyException() {
}

public MyException(String message) {
super(message);
}
}

public class Demo {
public static void main(String[] args) {
try {
func();
} catch (MyException e) {
e.printStackTrace();
}
}

private static void func() throws MyException{
// 创建scanner对象
Scanner scanner = new Scanner(System.in);
// 输入一个分数
System.out.println("请输入一个分数");
String score = scanner.nextLine();
int i = Integer.parseInt(score);
// 判断一下分数是否满足我们的要求
if (i < 0 || i > 100) {
// 认为成绩异常的
// 抛出异常
throw new MyException("分数异常");
}
}
}

路径表示

对于类 UNIX 平台,绝对路径名的前缀始终是 “/“。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 “/“ 且名称序列为空。
​ 绝对路径: /home/st/6379.conf
​ 相对路径: st/a.txt
​ 根目录: /

对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 “\“
​ 绝对路径: e:\st\a.txt
​ 相对路径:没有盘符前缀 st\a.txt

文件过滤器

FileFilter接口可以用于实现文件的高级获取功能,通过设置条件来过滤文件,常用匿名内部类实现。

示例:

1
2
File[] files = dir.listFiles((pathname) ->
pathname.getName().endsWith(".java"));// 过滤后缀名为.java的文件
本文作者:Ykuri98
本文链接:https://ykuri98.github.io/2022/04/09/%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93%EF%BC%882022-04-07-2022-04-11%EF%BC%89/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×