作用:
1,内部类可以给外部类提供额外的功能
2,可以直接访问外部类私有的成员
分类:成员内部类、静态内部类 、局部内部类和匿名内部类。
成员内部类:
定义的位置:类中,方法以外
访问权限修饰符 class 外部类类名{
访问权限修饰符 class 内部类类名{
}
}
注意:
成员内部类中不能定义静态成员
当外部类属性或方法与内部类属性或方法重名如何区分
this.属性名或方法名(实参列表); 内部类提供的属性或方法
外部类类名.this.属性名或方法名(实参列表); 外部类提供的属性或方法
创建成员内部对象
语法:
外部类类名.内部类类名 对象名 = 外部类对象.new 内部类类名(实参列表);
静态内部类
定义的位置:类中,方法以外
语法:
访问权限修饰符 class 外部类类名{
访问权限修饰符 static class 内部类类名{
}
}
创建静态内部类对象
语法:
外部类类名.内部类类名 对象名 = new 外部类类名.内部类类名(实参列表);
局部内部类
定义的位置:方法中
语法:
class 内部类类名{
}注意:
1,不能定义静态成员
2,只能在声明的方法中使用创建对象
内部类类名 对象名 = new 内部类类名(实参列表);
匿名内部类
定义的位置:值或实参
特点
1,没有类名的类
2,一个匿名内部类只能创建一个对象
3,定义与创建对象同时进行语法:
父类名或父接口名 对象名 = new 父类名或父接口名(){
属性
方法
};
Object 类
Object提供的属性与方法是所有类的对象都拥有的属性与方法
1,getClass() 获取对象所属的类的类对象
2,hashcode() 获取对象的哈希码值
3,toString() 将对象转换为字符串注意:打印对象时默认会调用对象的toString方法,所以建议重写,使其便于查看属性值4,equals() 比较对象是否相同
注意:
Object提供的equals方式是比较对象的内存地址是否相同
如果需要比较对象的属性值是否相同,需要重写其类的equlas方法
重写步骤:
1,判断内存地址是否相同
2.判断是否有可比较性
3,将传入的对象转换为该类对象
4,使用属性逐一对比
5,finalize() 对象被回收时有系统调用的方法
包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
自动装箱与拆箱
自动装箱:将基本数据类的变量或值,转换为对应的引用数据类型的对象
如:
int a = 10;
Integer i = a;自动拆箱:将引用数据类型的对象转换为对应的基本数据类型的值
如:
Integer num = new Integer(10);
int a = num;
String str = "xxx";
字符串相关类
不可变的字符串:String
对字符串处理是会生成新的字符串,老的字符串也不会被系统回收,当大量操作将会导致程序运行缓慢,因为占据内存较多
- 不可变性:String 对象是不可变的,一旦创建就不能修改其内容。对 String 的任何修改操作都会创建一个新的 String 对象。
- 线程安全性:String 是线程安全的,可以在多线程环境下共享而无需担心数据竞争。
- 适用场景:适用于字符串不经常改变的情况,比如作为方法参数传递、字符串连接等。
提供的方法
增:
+
截取
//System.out.println(name.substring(2));
subString(startIndex);
作用:从开始位置截取到字符串结尾
参数:
startIndex:开始位置
//System.out.println(name.substring(2,6));
subString(startIndex,endIndex);
作用:从开始位置截取到结束位置
参数:
startIndex:开始位置
endIndex:结束位置
注意:包含开始位置,但不包含结束位置
替换
replace(target, replacement)
作用:替换
参数:
target:要替换的字符串
replacement:替换后的字符串
切割
split(regex)
作用:切割
参数:
regex:根据什么字符串切割
查
length()
作用:查询字符串长度
charAt(int index)
作用:查询字符串指定位置的字符
参数:
index:执行的位置
indexOf(str);
作用:查询str在字符串中第一次出现的位置
如果存在,返回第一次出现位置的下标,如果不存在返回-1
lastIndexOf(String str)
作用:查询str在字符串中最后一次出现的位置
如果存在,返回最后一次出现位置的下标,如果不存在返回-1其他:
equals(Object anObject)
作用:比较字符串内容是否相同
返回值:
为true表示相同,false不相同
compareTo(String anotherString)
作用:比较字符串内容是否相同
0:相同
非0:不同
equalsIgnoreCase(String anotherString)
作用:忽略大小写比较字符串内容是否相同
返回值:
为true表示相同,false不相同
startsWith(String prefix)
作用:判断字符串是否以prefix开始
返回值:
为true表示是,false不是
endsWith(String suffix)
作用:判断字符串是否以suffix结束
返回值:
为true表示是,false不是
toUpperCase()
作用:将字符串转换为大写的字符串
toLowerCase()
作用:将字符串转换为小写的字符串
trim()
作用:忽略前后空白
contains(s)
作用:判断字符串中s是否存在
toCharArray()
作用:将字符串转换为字符数组
getBytes()
作用:将字符串转换为字节数组
可变字符串
StringBuffer :
- 可变性:StringBuffer 对象是可变的,可以通过调用其方法修改字符串内容,而无需创建新的对象。
- 线程安全性:StringBuffer 是线程安全的,对于多线程环境下的字符串操作,推荐使用该类。
- 性能:由于线程安全机制的存在,相对于 StringBuilder,StringBuffer 的性能会稍差一些。
- 适用场景:适用于在多线程环境下频繁操作字符串的场景,比如字符串的拼接、修改等
提供的方法:
append(String str)
作用:尾部添加delete(int start, int end)
作用:删除
参数:
start:开始位置
end:结束位置
注意:包含开始位置,不包含结束位置insert(int offset, String str)
作用:插入
参数:
offset:插入开始的位置
str:插入的字符串
toString()
作用:将可变字符串转换为不可变字符串
StringBuilder:
- 可变性:StringBuilder 对象也是可变的,可以通过调用其方法修改字符串内容。
- 线程安全性:StringBuilder 不是线程安全的,如果在多线程环境下使用,需要自行保证线程安全。
- 性能:由于无需考虑线程安全,相对于 StringBuffer,StringBuilder 的性能更高。
- 适用场景:适用于单线程环境下频繁操作字符串的场景,比如字符串的拼接、修改等。
提供的方法:
append(String str)
作用:尾部添加delete(int start, int end)
作用:删除
参数:
start:开始位置
end:结束位置
注意:包含开始位置,不包含结束位置insert(int offset, String str)
作用:插入
参数:
offset:插入开始的位置
str:插入的字符串
toString()
作用:将可变字符串转换为不可变字符串
字符串类 | String | StringBuffer | StringBuilder | ||
不同点 | 线程是否安全 | 线程安全 | 线程安全 | 线程不安全 | |
线程安全原因 | 不可变序列 | StringBuffer中许多方法带有Synchronized关键字,可以保证线程安全 | StringBuilder没有 Synchronized关键字 | ||
适用情况 | 少量字符串操作 | 多线程,在字符缓冲区进行大量(插入,追加,更改)操作 | 单线程,在字符缓冲区进行 大量(插入,追加,更改)操作 | ||
运行速度/原因 | 最慢 | 较快 | 最快 | ||
相同点 | 都是final类型,不允许被继承,主要是从性能和安全性上考虑,底层使用char[ ]来存储字符串的内容 |
总结:
- 如果字符串不需要被修改,或者在多线程环境下使用,推荐使用 String 类。
- 如果需要频繁修改字符串且在多线程环境下使用,推荐使用 StringBuffer 类。
- 如果需要频繁修改字符串但在单线程环境下使用,推荐使用 StringBuilder 类。
BigDecimal
精确表示大数的类。它可以处理任意长度和精度的十进制数,适用于涉及到金融、货币计算或精确计算的场景。与基本数据类型的浮点数相比,BigDecimal 提供更高的精度和控制。
BigDecimal num1 = new BigDecimal("10.5");
BigDecimal num2 = new BigDecimal(20);
进行计算操作:通过调用BigDecimal对象的方法,可以进行加减乘除等计算操作,得到新的BigDecimal结果对象:
BigDecimal sum = num1.add(num2); // 加法
BigDecimal difference = num1.subtract(num2); // 减法
BigDecimal product = num1.multiply(num2); // 乘法
BigDecimal quotient = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);// 除法,保留两位小数,四舍五入
控制精度和舍入方式:使用setScale()方法设置小数部分的精度,使用setScale()方法的第二个参数指定舍入方式:
BigDecimal result = num1.divide(num2, 4, BigDecimal.ROUND_DOWN);
// 除法,保留四位小数,向下取整
比较大小和相等性判断:使用compareTo()方法进行大小比较,使用equals()方法判断两个BigDecimal对象是否相等:
int comparison = num1.compareTo(num2); // 比较大小
boolean isEqual = num1.equals(num2); // 判断相等性
时间类型
Date:日期
//获取当前系统时间Date date = new Date();System.out.println(date);//距离1970年1月1日00:00:00的时间(格林威治时间)Date date1 = new Date(1*60*60*1000);System.out.println(date1);/*** 作用:比较两个时间是否相同* 如果为0表示相同* 如果为1表示调用该方法的对象时间在传入的对象之后* 如果为-1表示调用该方法的对象时间在传入的对象之前*/int i = date1.compareTo(date);System.out.println(i);/*** 作用:判断调用该方法的对象时间在传入的对象之后*/boolean b = date.after(date1);System.out.println(b);/*** 作用:判断调用该方法的对象时间在传入的对象之前*/boolean b1 = date.before(date1);System.out.println(b1);/*** 作用:获取指定时间与1970年1月1日00:00:00的时间差,单位毫秒*/long time = date.getTime();System.out.println(time);/*** 作用:设置指定时间与1970年1月1日00:00:00的时间差,单位毫秒*/date.setTime(0);System.out.println(date);Date d = new Date();d.setTime(d.getTime() - 1 * 60 * 60 * 1000);System.out.println(d);
Calendar:日历
// 获取当前时间的 Calendar 对象
Calendar calendar = Calendar.getInstance();// 打印当前时间的 Calendar 对象信息
System.out.println(calendar);// 获取年、月、日、小时、分钟、秒和毫秒
int y = calendar.get(Calendar.YEAR);
int m = calendar.get(Calendar.MONTH) + 1;// Calendar.MONTH 的取值范围是 0-11,需要加1
int d = calendar.get(Calendar.DAY_OF_MONTH);
int h = calendar.get(Calendar.HOUR_OF_DAY);
int f = calendar.get(Calendar.MINUTE);
int s = calendar.get(Calendar.SECOND);
int ms = calendar.get(Calendar.MILLISECOND);
System.out.println(y + "/" + m + "/" + d + "\t" + h + ":" + f + ":" + s + "." + ms);
// 设置年份为2024
calendar.set(Calendar.YEAR, 2024);
System.out.println(calendar);
// 将日期增加3个月
calendar.add(Calendar.MONTH, 3);
System.out.println(calendar);
SimpleDateFormat时间格式化
String str = "2021/01/10 13:18:00";
/**
* y:年
* M:月
* d:日
* h:12小时制小时
* H:24小时制小时
* m:分钟
* s:秒
* S:毫秒
*/// 将指定格式的字符串转换为Date对象.创建日期格式化对象
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = format.parse(str);
System.out.println(date);Date date1 = new Date();
//将Date转换为指定格式的字符串
String s = format.format(date1);
System.out.println(s);//将当前日期时间格式化为字符串,获取当前日期时间
Date now = new Date();
// 格式化日期时间为字符串
String formattedDate = sdf.format(now);
System.out.println(formattedDate);
// 解析字符串为日期时间对象
String dateString = "2023-07-26 13:42:46";
Date parsedDate = sdf.parse(dateString);
System.out.println(parsedDate);