java高级部分总结
类的各种常用方法
字符串String类中的常用方法
方法名 | 返回值 | 作用 |
---|---|---|
length() | int | 得到字符串长度 |
toLowerCase() | String | 转换为小写 |
toUpperCase() | String | 转换为大写 |
trim | String | 去除字符串首尾全部空格 |
isEmpty() | boolean | 判断字符串长度是否为0 |
getBytes() | byte[] | 转换为字节数组 |
toCharArray() | char[] | 转换为字符数组 |
equalsIgnoreCase(String str) | boolean | 忽略大小写比较字符串是否相等 |
equals(String str) | boolean | 判断两个字符串是否相等 |
charAt(int index) | char | 得到某个索引上的字符 |
indexOf(String str) | int | 得到某个字符串第一次出现的索引,不存在返回-1 |
lastIndexOf(String str) | int | 得到某个字符串最后一次出现的索引,不存在返回-1 |
contains(String str) | boolean | 判断是否存在某个字符串 |
startsWith(String str) | boolean | 判断是否以某个字符串开头 |
endsWith(String str) | boolean | 判断是否以某个字符串结尾 |
concat(String str) | String | 将指定字符串评级到原字符串末尾 |
substring(int index) | String | 从索引index开始截取字符串末尾 |
substring(int begin,int end) | String | 截取[begin,end)范围内的字符串 |
split(Sting regex) | String[] | 根据字符串或者正则表达式切分原字符串 |
replace(String oldStr,String newStr) | String | 将原字符串的oldStr替换为newStr |
String.valueOf(参数) | String | 将参数转换为字符串,参数可以是任何数据,通常用于原始类型转换为字符串 |
String.format(String式,Object…obj) | String | 根据指定格式转换参数。常用与将浮点数据保留指定小数位数。\n如String.format(“%4.2f”,2.345)表示将 2.345保留2位小数,整体占4位,输出为字符串格式。 如果实际数字总位数大于4,原样输出,如果实际数字 总位数小于4,会在最前补充空格。 |
可变字符串
-
StringBuilder
用于表示可变字符串的一个类,是非线程安全的,在单线程环境下使用,效率更高。
-
StringBuffer
用于表示可变字符串的一个类,是线程安全的,在多线程环境下使用。
StringBuilder和StringBuffer中的方法都一致,只不过StringBuffer中的方法使用了synchronized关键字修饰,表示是一个同步方法,在多线程环境下不会出现问题。
常用方法
常用方法 作用 append(Object obj) 将任意数据添加带原可变字符串的末尾 delete(int start,int end) 删除[start,end)范围内的字符 deleteCharAt(int index) 删除index索引上的字符 insert(int index,Object obj) 将obj添加到index上 repalce(int start,int end,String str) 将[start,end)范围内的字符替换为str reverse() 反转字符串
注意
-
String类中的所有方法调用后,都会创建一个新的String对象,即原本的String字符串不会改变
-
StringBuilder类中的所有方法都是在操作同一个字符串对象,每次调用方法,都会让原字符串发生变化
-
StringBuilder类中没有重写equals方法,所以判断两个可变字符串对象是否相同时,如果调用equals方法,实际调用的是Object类中未重写的方法,即==判断。所以判断可变字符串是否相同时,需要将其转换为String对象再调用equals方法。
任意类型对象转换为String
-
String.valueOf(Object obj)
-
toString()方法
-
拼接空字符串
可变字符串相关面试题
比较String、StringBuilder和StringBuffer的区别
相同点:
-
这三个类都可以表示字符串。都提供了一些操作字符串的方法。
-
这三个类中有相同的方法,如charAt(),indexOf()等。
-
这三个类都是被final修饰的类,不能被继承
不同点:
-
String定义的字符串是一个常量。可变字符串定义的字符串是一个变量。
-
String类中的方法调用后,不会改变原本字符串的值。可变字符串中的方法调用后,会改变原本字符串的值
-
StringBuilder是非线程安全的可变字符串类,StringBuffer是线程安全的可变字符串类,其中的方法被synchronized修饰。
System类
常用方法
常用方法与属性 | |
---|---|
System.ou | 获取标准输出流对象,用于打印信息 |
System.in | 获取标准输入流对象,用于获取输入的信息 |
System.err | 获取错误输出流对象,用于打印异常信息 |
System.exit(int statues) | 终止虚拟机运行,参数0表示正常终止 |
System.currentTimeMills() | 获取从1970/1/1 0:0:0至今经过了多少毫秒。中国是UTC(+8),所以实际是从1970/1/1 8:0:0至今经过了多少毫秒。返回值为long类型。通常称为时间戳。 |
System.arraycopy(原数组,原数组的起始位置,目标数组,目标数组的起始位置,要复制的元素数量) | 将原数组中指定数量的元素复制到新数组中 |
Runtime类
这个类不是一个抽象类,但不能创建对象,因为它的构造方法是私有的。
这个类提供了一个静态方法getRuntime(),通过该方法,可以获取一个Runtime类的对象。
这种方式可以保证该类只能创建一个对象,是Java中的一种设计模式:单例模式。
public class Runtime{
//定义了一个私有的静态成员,创建一个当前类的对象
private static Runtime currentRuntime = new Runtime();
//将构造方法私有,无法在外创建对象
private Runtime();
//定义了一个公开的静态方法,用于获取创建的唯一的当前类的对象
public static Runtime getRuntime(){
return currentRuntime;
}
}
Date类
常用方法
常用方法 | 作用 |
---|---|
getTime() | 得到Date对应对象的毫秒数 |
after(Date when) | 判断参数是否是调用日期之后 |
before(Date when) | 判断参数是否再调用日期之前 |
SimpleDateFormat类
日期模板
特殊字符 | 作用 |
---|---|
yyyy | 年 |
MM | 月 |
dd | 日 |
hh | 12小时制 |
HH | 24小时制 |
mm | 分 |
ss | 秒 |
E | 星期 |
yyyy/MM/dd HH:mm:ss E | 2023/03/09 14:05:16 星期四 |
常用方法
常用方法 | 返回值 | 作用 |
---|---|---|
format(Date date) | String | 将Date对象按日期模板转换为字符串 |
parse(String str) | Date | 将满足日期模板的字符串转换为Date对象 |
Calendar类
常用方法
get(int field) | 根据日历字段获取对应的值 |
---|---|
getMaximum(int field) | 获取指定日历字段的最大值,如日期最大值为31 |
getActualMaximum(int field) | 获取指定日历字段的实际最大值,如11月的日期最大为30 |
getTime() | 将Calendar对象转换为Date对象 |
set(int field,int value) | 将指定的日历字段设置为指定值 |
set(int year,int month,int date) | 同时设置日历的年月日 |
setTime(Date date) | 将Date对象作为参数设置日历的信息 |
使用Calendar类实现万年历
package com.hqyj.dateTest;
import java.util.Calendar;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
//实现"万年历"
//输入年份和月份,输出
Calendar c = Calendar.getInstance();
Scanner sc = new Scanner(System.in);
System.out.println("输入年份");
int year = sc.nextInt();
System.out.println("输入月份");
int month = sc.nextInt();
c.set(year, month - 1, 1);
//得到当月最大日期
int maxDate = c.getActualMaximum(Calendar.DATE);
//换行计数
int count = 0;
//输出空格
/*
* DAY_OF_WEEK 星期 空格数量
* 2 一 0
* 3 二 1
* 4 三 2
* 5 四 3
* 6 五 4
* 7 六 5
* 1 天 6
* //周天空6 其余空DAY_OF_WEEK-2
* */
System.out.println("一\t二\t三\t四\t五\t六\t日");
//获取当月1号是一周中的第几天
int week = c.get(Calendar.DAY_OF_WEEK);
//周天空6格
if (week == 1) {
System.out.print("\t\t\t\t\t\t");
//空格也需要计数
count += 6;
} else {
//其他情况空星期-2个格
for (int j = 1; j <= week - 2; j++) {
System.out.print("\t");
//空格也需要计数
count++;
}
}
//输出数字
for (int i = 1; i <= maxDate; i++) {
System.out.print(i + "\t");
//计数+1
count++;
//计数到7换行
if (count % 7 == 0) {
System.out.println();
}
}
}
}
包装类
Java是纯面向对象语言,宗旨是将一切事物视为对象处理。
但原始类型不属于对象,不满足面向对象的思想。但原始类型无需创建对象,保存在栈中,效率更高。
为了既保证效率又让原始类型也有对应的类类型,达到"万物皆对象"的理念,所以就有了包装类的概念。
包装类就是原始类型对应的类类型。
包装类常用于字符串与原始类中之间的转换。
在web应用中,从浏览器页面中获取数据提交到服务器,全部都是String类型,所以一定要使用字符串转换为原始类型的方法。
包装类 | 原始类型 |
---|---|
Byte | byte |
Short | short |
Integer | integer |
Long | long |
Float | float |
Double | double |
Chartacter | char |
Boolean | boolean |
特点
- 八个原始类型中,除了int和char,其余包装类都是将原始类型的首字母改为大写。
int对应Integer,char对应Character
-
包装类都是被final修饰的,不能被继承
-
除了Character类,其余包装类都有两个过时的构造方法,参数为对应的原始类型或字符串
Character只有一个参数为char类型的构造方法
构造方法的目的都是将原始类型的数据转换为包装类的对象
-
除了Character类,其余包装类都有静态方法"parse原始类型单词(String str)",用于将字符串转换为相应的原始类型
-
数值型的包装类parseXXX()方法,如果参数不是对应的数字,就会抛出NumberFormat异常,如"123a"或"123.4"都会报错
-
boolean的包装类Boolean的parseBoolean()方法,如果参数不是"true"这个单词的四个字母,转换结果都是false
-
-
除了Boolean类,其余包装类都有MAX_VALUE和MIN_VALUE这两个静态属性,用于获取对应类型支持的最大最小值
-
所有包装类都重写了toString(),用于将包装类对象转换为String对象
装箱和拆箱
装箱
拆箱
自动装箱和拆箱
-
自动装箱缓冲区
//i1和i2保存的数字在byte范围[-127,127]内,这个值会共享,只会有一个"100"对象 Integer i1 = 100; Integer i2 = 100; System.out.println(i1 == i2);//i1和i2引用同一个地址,结果为true //i3和i4保存的数字不在byte范围[-127,127]内,会创建对象 Integer i3 = 128;//128对象 Integer i4 = 128;//128对象 System.out.println(i3 == i4);//i3和i4引用不同的地址,结果为false System.out.println(i3.equals(i4));//包装类重写了equals,会拆箱后判断,结果为ture
-
使用自动装箱给包装类对象赋值,值的范围在byte范围[-127,127]内,这个值会保存在缓冲区中,如果多个对象都使用这个值,共享这一个数据,使用同一个地址,==判断结果true;值的范围不在byte范围[-127,127]内,就会创建新的包装类对象,会有不同的地址,==判断结果false
-
引用类型对象比较相同时,不要使用==,包括包装类的对象。比较相同时,使用包装类重写的equals方法.
-
异常
当程序没有按开发人员的意愿正常执行,中途出现错误导致程序中断,这种情况,就称为异常。
学习异常就是认识异常的种类,如何处理异常和避免异常出现。
异常的产生
异常在程序中以对象的形式存在。当代码执行过程中出现异常,虚拟机会自动创建一个异常对象,如果没有对该异常对象进行处理,就会导致程序中断,不再执行后续内容。
异常的分类
异常在程序中以对象的形式存在,就有相应的类。
所有的异常类,组成了"异常家族"。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mPbZEMMA-1679503712167)(C:\Users\23266\AppData\Roaming\marktext\images\2023-03-10-15-26-11-image.png)]
Error错误
如果出现xxxError,如StackOverFlowError,栈溢出,无法通过额外的代码解决,只能修改源代码。
Exception异常
-
RunTimeExcetpion运行时异常
如果一个异常类属于RunTimeExcetpion异常类的子类,称这个异常为运行时异常,可以通过编译,运行时可能抛出异常对象
常见运行时异常 说明 出现的情景 NullPointerException NullPointerException 空指针异 常 如用空对象null调用属性或方法 IndexOutOfBoundsException n 索引越界异常 如当使用某个带有索引的对象超出范围 NumberFormatException 数字格式异常 如调用包装类的parseXX()方法,如果参数不 能转换 InputMismatchException 输入不匹配异常 如使用Scanner接收控制台输入时,如果输 入的数据不是对应的类型 ClassCastException 对象转型异常 如Person p = (Person)Dog dog; ArithmeticException 算术运算 异常 如0当分母 -
编译时异常
如果一个异常类属于RunTimeExcetpion异常类的子类,称这个异常为运行时异常,可以通过编译,运行时可能抛出异常对象
常见编译时异常 说明 出现的情景 IOException 输入输出流异常 使用流对象 FileNotFoundException 文件未找到以 方法的参数为文件对象时 SQLException 数据库相关异常 操作数据库时
处理异常
通常所说的处理异常,指的是处理Exception类的子类异常。
处理异常的目的,就是保证程序正常执行。
方式一:try-catch-finally语句
这种方式处理异常,无论会不会抛出异常,都能让程序正常执行
try{
//可能出错的代码
}catch(异常类 异常对象){
//如果try中的代码抛出异常,异常对象属于catch中的异常类型,就会执行这里的代码
}catch(异常类 异常对象){
//如果try中的代码抛出异常,异常对象属于catch中的异常类型,就会执行这里的代码
}...{
}finally{
//无论程序是否会抛出异常,都要执行这里的代码
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzJ8domQ-1679503712168)(C:\Users\23266\AppData\Roaming\marktext\images\2023-03-10-19-09-04-image.png)]
执行流程:先执行try中的内容,当出现异常,与后续每个catch中的异常类型进行匹配,如果匹配到对应的类型或异常父类时,执行后续大括号中的内容,最终一定执行finally中的内容。
try-catch-finally使用时注意
-
如果代码会抛出多个异常,可以使用多个catch进行捕获。需要将子类异常放在最前,父类异常放在最后
-
try、catch、finally都不能单独使用,try必须配合catch或finally或一起使用
-
无论try中的代码是否会抛出异常,finally中的代码一定会执行
-
执行try中的代码是,如果出现异常,就不再执行try中剩余代码
-
try中定义的内容,无法在try之外的地方使用
-
try中如果有return,不影响finally的执行,finally优先于return执行
方式二:throws关键字
这种方法,可以让编译时异常通过编译。
在定义方法的时候,通过该关键字声明方法可能抛出的异常。
用法:方法的参数部分后,添加 throws ****异常类型1,****异常类型2.
public class Test{
//这时该方法就会有一个声明:该方法可能会抛出InterruptedException异常
public void fun() throws InterruptedException{
//sleep()方法在源码中声明了可能会抛出InterruptedException异常,
//InterruptedException异常不是RuntimeException的子类异常,必须要处理才能通过编译
//要么使用try-catch处理,要么继续声明有异常
Thread.sleep(500);
}
}
throw和throws
-
throws表示用于声明方法有可能出现的异常。使用时写在方法的小括号之后
public void fun() throws InterruptedException{ Thread.sleep(500); }
-
throw用于手动抛出异常对象。使用时,写在方法体中,“throw 异常对象”。
常用于满足某种条件时,强制中断程序。
public void fun