学习总结(2022.04.07-2022.04.11)
String常量池
每次创建字符串常量时,JVM会检查常量池是否存在该常量,如果存在则直接返回该常量的实例引用,没有才会在常量池中创建该常量对象。
例子
1 | |
String两种实例化方式的区别
- 直接赋值的方式
String s = "abc"; - 通过构造方法
String s = new String("abc")
第一种只会创建一个对象,第二种则会创建两个对象:一个是与第一种相同的创建方式,一个则是因为new关键字而创建的。虽然两者并不是同一个对象,但它们共用一个value数组(即String类中的char数组)(如果常量池中早已有第0,一种方式创建好的对象,那么第二种方式也只会创建一个对象,即new关键字创建的对象)
第一种会在常量池中创建对象,第二种会在堆上创建对象。
字符串拼接
字符串拼接时有两种情况:
- 在常量池中创建新的对象
- 在堆上创建新的对象
这两个对象并不是同一个对象,用==判别会返回false。
只要拼接的字符串中有一个是以引用变量的形式出现的(比如String s、new 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 | |
StringBuffer,StringBuilder
都是长度可变的字符串类,StringBuilder线程不安全,StringBuffer线程安全。
throws,throw
throws用在方法声明后面,跟的是异常类名;可以跟多个异常类名,用逗号隔开。
throws表示出现异常的一种可能性,并不一定会发生这些异常,且throws修饰的方法由该方法的调用者来处理。
throw用在方法体内,跟的是异常对象名,只能抛出一个异常对象。
throw表示抛出异常,可以由方法体内的语句处理,但执行throw则一定抛出了某种异常。
自定义异常
可以自己写一个类并继承Exception 或RuntimeException 来自定义异常。
示例:
1 | |
路径表示
对于类 UNIX 平台,绝对路径名的前缀始终是 “/“。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 “/“ 且名称序列为空。
绝对路径: /home/st/6379.conf
相对路径: st/a.txt
根目录: /
对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 “\“
绝对路径: e:\st\a.txt
相对路径:没有盘符前缀 st\a.txt
文件过滤器
FileFilter接口可以用于实现文件的高级获取功能,通过设置条件来过滤文件,常用匿名内部类实现。
示例:
1 | |