常用API
- Math
Math类包含了基本的数字运算方法
Math都为静态方法可以直接通过类名.方法进行调用。
Math常用方法
方法名 | 说明 |
---|---|
public static int abs(int a) | 返回参数的绝对值 |
public static double ceil(double a) | 返回大于或等于参数的最小double值,等于一个整数 |
public static double floor(double a) | 返回小于或等于参数的最大double值,等于一个整数 |
public static int round(float a) | 按照四舍五入返回最接近参数的int |
public static int max(int a,int b) | 返回两个int值中的较大值 |
public static int min(int a,int b) | 返回两个int值中的较小值 |
public static double pow (double a,double b) | 返回a的b次幂的值 |
public static double random() | 返回值为double的正值,[0.0,1.0) |
- System
System类的常用方法
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止当前运行的 Java 虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前时间(以毫秒为单位) |
使用currentTimeMillis()可以计算代码的运行时间,也可以通过Date来实现。 |
- toString
所有的toString方法都继承与Object类,一般使用toString方法输出类的信息,通常可以通过编辑器自动生成。类似于get和set方法。 - equals()
equals方法用于返回对象之间的比较,返回布尔类型,equals方法比较的是具体的内容,和==有些许不同。
如过equals方法不满足需求,可以选择重写方法。equals方法也可以通过编辑器自动重写。 - BigDecimat
这个类的作用是为了精度计算使用的,由于二进制的限制,精度会有误差,为了解决这个问题使用这个类来解决。
构造方法
方法名 | 说明 |
---|---|
BigDecimal(double val) | 参数为double |
BigDecimal(String val) | 参数为String |
常用方法
方法名 | 说明 |
---|---|
public BigDecimal add(另一个BigDecimal对象) | 加法 |
public BigDecimal subtract (另一个BigDecimal对象) | 减法 |
public BigDecimal multiply (另一个BigDecimal对象) | 乘法 |
public BigDecimal divide (另一个BigDecimal对象) | 除法 |
public BigDecimal divide (另一个BigDecimal对象,精确几位,舍入模式) | 除法 |
BigDecimal 用来进行精度计算,经常使用在金融领域,构造对象时使用字符串。
String类
String 类是不可变的,这意味着一旦创建了字符串对象,其值就无法更改。这是因为 Java 中的字符串池(String Pool)的设计。每当我们创建一个字符串时,它会被存储在字符串池中。如果我们尝试修改字符串的值,实际上是创建了一个新的字符串对象,而原始字符串保持不变。这对于字符串的安全性和性能都有好处。
- 使用构造方法创建
使用new创建字符串对象,会在堆空间里面申请一个内存空间,如果在字符串常量池里面有这个字符串会直接引用,如果没有就在池中创建。 - 直接赋值创建
直接赋值创建会直接在字符串常量池中创建对应的对象,有就直接指向,在字符串池中的字符串可以共享。
String类常用方法
方法名 | 说明 |
---|---|
public char charAt(int index) | 返回 char指定索引处的值 |
public boolean equals(Object anObject) | 将此字符串与指定对象进行比较 |
public int hashCode() | 返回此字符串的哈希码 |
public int length() | 返回此字符串的长度 |
public boolean matches(String regex) | 告诉这个字符串是否匹配给定的 regular expression |
public boolean replace(char oldChar, char newChar) | 返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。 |
public String[] split(String regex) | 将此字符串分割为给定的 regular expression的匹配。 |
public String substring(int beginIndex) | 返回一个字符串,该字符串是此字符串的子字符串 |
StringBuilder
当我们使用“+”来链接字符串的时候,其底层是怎么实现的。就是使用的stringBuilder来实现的,StringBuilder是String的一个拓展,是为了在大规模字符串拼接的场景中使用的,当作字符串拼接的时候,会在堆空间创建一个StringBuilder对象,这个对象会将拼接的字符串通过append方法来拼接,最后通过toString方法化为String对象,这个时候String对象存储在堆空间中。
StringBuffer
StringBuffer和StringBuild的功能几乎完全一致,差别就在于Stringbuffer是线程安全的,可以在多线程的情况下使用,StringBuild则是线程不安全的,不能在多线程情况下使用。
包装类
包装类(Wrapper Class)是 Java 中用于将原始数据类型(如 int、char、float 等)转换为相应对象的类。这些包装类位于 java.lang 包中,用于解决基本数据类型无法直接参与面向对象操作的问题。
自动拆箱
将包装对象转换为原始类型
要将包装对象转换回原始类型,我们可以使用每个包装类中对应的值方法,例如 intValue()、doubleValue() 等。以下示例演示了如何将包装对象转换为原始类型:
Integer aObj = Integer.valueOf(23);
Double bObj = Double.valueOf(5.55);
int a = aObj.intValue();
double b = bObj.doubleValue();
System.out.println("a 的值:" + a);
System.out.println("b 的值:" + b);
自动装箱
将基本类型转换为包装对象,我们可以使用 valueOf() 方法将原始类型转换为相应的包装对象。例如,以下示例演示了如何将原始类型转换为包装对象:
int a = 5;
double b = 5.65;
Integer aObj = Integer.valueOf(a);
Double bObj = Double.valueOf(b);
if (aObj instanceof Integer) {
System.out.println("创建一个 Integer 对象。");
}
if (bObj instanceof Double) {
System.out.println("创建一个 Double 对象。");
}
缓存机制
包装类的缓存机制是 Java 中的一个有趣特性,它有助于节省内存并提高性能。
- 当通过自动装箱创建包装类对象时,首先会判断数值是否在缓存范围内(通常是 -128 到 127)。
- 如果在缓存范围内,会从缓存中寻找指定数值对应的包装类对象,而不是新建对象。
- 如果不在缓存范围内,会创建一个新的对象。
- Integer、Byte、Short、Long、Character 这五个包装类都有缓存机制,范围是 -128 到 127。Float、Double、Boolean 这三个包装类没有缓存机制。
时间日期类
java提供了许多用于处理日期和时间的类,方便使用者直接调用。
Date
- Date 类是 Java 最早的日期和时间类之一,但它已被弃用。
- 它表示自 1970 年 1 月 1 日 00:00:00 GMT(格林尼治标准时间)以来的毫秒数。
- Date 对象创建后,可以调用以下方法:
- after(Date date):判断当前 Date 对象是否在指定日期之后。
- before(Date date):判断当前 Date 对象是否在指定日期之前。
- getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。
其他方法如 clone(), compareTo(), equals(), hashCode() 等。
SimpleDateformat
这个类是用于Date对象的拓展处理,但只能完成一些简单的操作,主要用于以区域设置敏感的方式格式化和解析日期。
SimpleDateformat的构造方法
方法名 | 说明 |
---|---|
public SimpleDateFormat() | 构造一个SimpleDateFormat,使用默认模式和日期格式 |
public SimpleDateFormat(String pattern) | 构造一个SimpleDateFormat使用给定的模式和默认的日期格式 |
SimpleDateformat常用方法
- 格式化(从Date到String)
- public final String format(Date date):将日期格式化成日期/时间字符串
- 解析(从String到Date)
- public Date parse(String source):从给定字符串的开始解析文本以生成日期
LocalDateTime
Java 8 引入了 java.time 包,其中包含了新的日期时间类,LocalDate,LocalTime,LocalDateTime,这些类能够更加精确的表示日期和时间,避免了以前Date类的一些问题。
常用方法
方法名 | 说明 |
---|---|
public static LocalDateTime now() | 获取当前系统时间 |
public static LocalDateTime of (年, 月 , 日, 时, 分, 秒) | 使用指定年月日和时分秒初始化一个LocalDateTime对象 |
例如:
public class JDK8DateDemo2 {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 11, 11, 11);
System.out.println(localDateTime);
}
}
LocalDateTime还有许多方便的方法用于获取具体的日期或者时间。
方法名 | 说明 |
---|---|
public int getYear() | 获取年 |
public int getMonthValue() | 获取月份(1-12) |
public int getDayOfMonth() | 获取月份中的第几天(1-31) |
public int getDayOfYear() | 获取一年中的第几天(1-366) |
public DayOfWeek getDayOfWeek() | 获取星期 |
public int getMinute() | 获取分钟 |
public int getHour() | 获取小时 |
DateTimeFormatter
LocalDateTime也提供了可以解析和格式化的方法,也就是DateTimeformatter用于获取日期模板。
public class Test2 {
public static void main(String[] args) throws ParseException {
Test2.func1("2000-10-01 12:20:12");
Test2.func2(LocalDateTime.now());
}
// 解析
public static void func1(String date){
DateTimeFormatter fm = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime a = LocalDateTime.parse(date,fm);
System.out.println(a);
}
// 格式化
public static void func2(LocalDateTime date){
DateTimeFormatter fm = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
String b = date.format(fm);
System.out.println(b);
}
}
其中func1能够将String类型的字符串日期解析成LocalDateTime对象,而func2则是将Local DATe Time对象解析成需要的字符串形式。
异常处理
在 Java 中,异常处理是一种重要的编程概念,用于处理程序执行过程中可能出现的错误或异常情况。异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
Exception
在Exception中也分为两个异常。
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这些异常在编译时强制要求程序员处理。例如,要打开一个不存在的文件时,就会抛出异常。这类异常通常使用 try-catch 块来捕获并处理,或者在方法声明中使用 throws 子句声明方法可能抛出的异常。
try {
// 可能会抛出异常的代码
} catch (IOException e) {
// 处理异常的代码
}
public void readFile() throws IOException {
// 可能会抛出 IOException 的代码
}
可以使用try-catch来捕捉异常,也可以使用trrows来向上抛出异常,将异常交给上一级处理,异常会一直向上抛出,直到mian方法抛出,jvm处理时选择停止程序并抛出异常。
- 非检查时异常(运行时异常)这些异常在编译时不强制要求处理,通常是由程序中的错误引起的,例如 NullPointerException、ArrayIndexOutOfBoundsException 等。这类异常可以选择处理,但并非强制要求。
try {
// 可能会抛出异常的代码
} catch (NullPointerException e) {
// 处理异常的代码
}
注意事项
-
如果 try 中没有遇到问题,怎么执行?
会把try中所有的代码全部执行完毕,不会执行catch里面的代码
-
如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?
那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了
当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码 -
如果出现的问题没有被捕获,那么程序如何运行?
那么try…catch就相当于没有写.那么也就是自己没有处理.
默认交给虚拟机处理. -
同时有可能出现多个异常怎么处理?
出现多个异常,那么就写多个catch就可以了.
注意点:如果多个异常之间存在子父类关系.那么父类一定要写在下面
finally与return
我们直到ruturn有程序执行完毕的意思,而finally语句又是语句最后一定会执行的,那么它们的优先级又是怎样的呢。
public class Test2 {
public static void main(String[] args) {
Test2 t = new Test2();
System.out.println(t.exceptionDemo());
}
public int exceptionDemo(){
int a = 2;
try {
if (a==2){
// 主动抛出异常
throw new ArrayIndexOutOfBoundsException();
}
a = a+1;
}catch (ArrayIndexOutOfBoundsException e){
return a;
}finally {
return a+1;
// a = a+1;
}
}
}
在这个代码里面,首先执行try里面的语句,当判断a等于2时,主动抛出异常,异常会被catch捕获,执行catch中的语句,但是当在finally也具有return的时候,最终返回的是以finally中的return为准的。如果在finally里面对return的值进行了更改,是不会影响前面返回的值(基本数据类型)。
Error
错误不是异常,而是脱离程序员控制的问题,例如栈溢出。它们在编译时也检查不到。这些问题一般为jvm出现的问题,一般不由程序员处理。