Java核心技术卷I-Notes
愚而好自用,贱而好自专。
-
类是所有Java应用的构建模块,Java程序中的所有内容都必须放在类中
-
当将一个字符串与一个非字符串拼接时,后者会转换成字符串,任何一个人Java对象都可以转换成字符串
java1
2
3int age = 18;
String rating = "PG" + age;
System.out.println(rating);PG18
-
String类对象是不可变的,即不可以直接修改
判断两个字符串是否相等时,尽量用.equals()方法
- 使用
.equals()
方法进行比较时,你比较的是字符串的内容是否相同。 - 使用
==
运算符时,你比较的是两个引用是否指向内存中的同一个对象。
- 使用
-
字符串的索引方式
s.charAt(i)
-
输入
java1
2
3
4
5
6
7
8
9
10
11
12import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
String str = sc.next(); // 读入下一个字符串 遇到空格、回车等空白字符时停止输入
String line = sc.nextLine(); // 读入下一行 遇到空格不会停止输入,遇到回车才会停止
int x = sc.nextInt(); // 读入下一个整数
float y = sc.nextFloat(); // 读入下一个单精度浮点数
double z = sc.nextDouble(); // 读入下一个双精度浮点数
}
} -
String常用API:
length()
:返回长度split(String regex)
:分割字符串indexOf(char c)
、indexOf(String str)
、lastIndexOf(char c)
、lastIndexOf(String str)
:查找,找不到返回-1equals()
:判断两个字符串是否相等,注意不能直接用==compareTo()
:判断两个字符串的字典序大小,负数表示小于,0表示相等,正数表示大于startsWith()
:判断是否以某个前缀开头endsWith()
:判断是否以某个后缀结尾trim()
:去掉首尾的空白字符toLowerCase()
:全部用小写字符toUpperCase()
:全部用大写字符replace(char oldChar, char newChar)
:替换字符replace(String oldRegex, String newRegex)
:替换字符串substring(int beginIndex, int endIndex)
:返回[beginIndex, endIndex)中的子串toCharArray()
:将字符串转化成字符数组
-
StringBuilder
和StringBuffer
说明如果有多次字符串拼接操作,每一次都会构建一个新的
String
对象,即耗时,又浪费空间;String
不能被修改,如果打算修改字符串,可以使用StringBuilder
和StringBuffer
。StringBuffer
线程安全,速度较慢;StringBuilder
线程不安全,速度较快。java1
2
3
4
5
6
7
8
9StringBuilder builder = new StringBuilder("Hello "); // 初始化
sb.append("World"); // 拼接字符串
System.out.println(builder);
for (int i = 0; i < builder.length(); i ++ ) {
builder.setCharAt(i, (char)(builder.charAt(i) + 1)); // 读取和写入字符
}
System.out.println(sb); -
Arrays常用API:
-
属性length
:返回数组长度,注意不加小括号 -
Arrays.sort()
:数组排序-
Arrays.sort(int[] a, int fromIndex, int toIndex)
对下标[fromIndex, toIndex)
升序 -
降序排列的两种方法:
-
import java.util.Comparator; Arrays.sort(array, new Comparator<Integer>() { public int compare(Integer o1, Integer o2) { return o2 - o1; } }); <!--code3-->
-
注意降序都必须用
Integer
而非int
-
-
-
Arrays.fill(int[] a, int val)
:填充数组 -
Arrays.toString()
:将数组转化为字符串 -
Arrays.deepToString()
:将多维数组转化为字符串 -
数组不可变长
-
使用Arrays需要
import java.util.Arrays
-
-
java中允许有长度为0的数组,注意和null的区别
-
状态不同:
- 长度为 0 的数组是一个有效的数组对象,只是没有包含任何元素。
String[] emptyArray = new String[0];
null
数组表示没有引用任何数组对象。String[] nullArray = null;
- 长度为 0 的数组是一个有效的数组对象,只是没有包含任何元素。
-
属性访问:
- 对长度为 0 的数组,可以安全地访问其属性,例如
length
,它会返回 0。 - 对
null
数组,访问任何属性(如length
)会抛出NullPointerException
。
- 对长度为 0 的数组,可以安全地访问其属性,例如
-
元素访问:
- 对长度为 0 的数组,访问任何元素都会抛出
ArrayIndexOutOfBoundsException
。 - 对
null
数组,访问任何元素都会抛出NullPointerException
。
- 对长度为 0 的数组,访问任何元素都会抛出
-
-
String s1 = "abc"; String s2 = "a" + "b" + "c"; System.out.println(s1 == s2); // 返回true,因为字符串字面量(比如 "abc")是在编译时就确定的,并且存储在常量池中。当程序运行时,如果遇到相同的字符串字面量,Java虚拟机(JVM)会从常量池中获取引用,而不是重新创建一个新的字符串对象。 // 如果s2中有变量则为flase <!--code4--> 如此一来,多态会有一个弊端:当调用子类中独有而父类中没有的成员方法时,在编译阶段会出错
-
不同权限的访问能力
public protected 默认 private 同一类中 √ √ √ √ 同一包中的类 √ √ √ 不同包的子类 √ √ 不同包中的无关类 √ -
final: 不可改变,最终的含义。可以用于修饰类、方法和变量
- 类:被修饰的类,不能被继承 - 方法:被修饰的方法,不能被重写 - 变量:被修饰的变量,有且仅能被赋值一次
-
接口中的抽象方法默认会自动加上
public abstract
接口中定义的成员变量默认会加上: `public static final`修饰 java8开始允许在接口中定义具有方法体的方法,但是必须声明`default`,这是为了避免在接口升级的场景下,每个实现接口的类都要做更改的麻烦
-
泛型的细节:
- 泛型中不能写基本数据类型
- 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型
- 如果不写泛型,类型的默认是
Object
-
几个
Set
的使用场景HashSet
:无序,不重复,无索引 (如果要去重,默认使用HashSet
)LinkedHashSet
:有序,不重复,无索引 (如果要去重且存取有序,使用LinkedHashSet
)TreeSet
:无序,不重复,可排序 (基于红黑树实现,增删改查性能较好)
-
异常捕获四个问题
java1
2
3
4
5
6try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}-
如果try中没有遇到问题,怎么执行?
会把try里的所有代码全部执行,不会执行catch里的代码
-
如果try中可能会遇到多个问题,怎么执行?
遇到第一个问题后直接执行catch里的代码,后面的问题不会执行
可以写多个catch与之对应,父类异常需要写在下面
-
如果try中遇到的问题没有被捕获,怎么执行?
会直接将异常虚拟机处理,并停止执行代码
-
如果try中遇到了问题,那么try下面的其他代码还会执行吗?
不会
一般遇到异常捕获之后会使用
e.printStackTrace()
去打印信息,不会终止程序的运行 -
-
抛出异常
throws
和throw
的比较-
throws:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常
java1
public void 方法名(参数) throws 异常类名1,异常类名2…{ }
编译时异常 必须要写;运行时异常 可以不写
一般是给方法的调用者看的
-
throw 写在方法内,结束方法。手动抛出异常对象,交给调用者。方法中下面的代码不再执行
-
-
创建自定义异常的四个步骤:
- 定义异常类
- 写继承关系
- 空参构造
- 带参构造