Java常见类
1、Object类
Object类是所有Java类的父类。在类的生命中未显示地指明继承Object类,则默认继承Object类。
a、toString()方法
原理:全限定路径
+ @ + 十六进制哈希值
【对象在堆中地址进行哈希处理,获取哈希值,转十六进制】
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
【备注】:一般会重写toString()方法,以便观察对象中的属性。
// 以自定义Person类为例,重写toString方法:
// Person:
// -name:String
// -age:int
// -gender:int
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
b、equals()方法
原理:使用==
进行判断。比较的是对象引用值。
// Object类中原始equals:
public boolean equals(Object obj) {
return (this == obj);
}
重写了 equals()
方法,就应该同时重写 hashCode()
方法。
String、Date、File、包装类等已经重写了equals方法。主要是为了能够比较内容是否一致。
// IDE生成equals、hashCode
@Override
public boolean equals(Object o) {
if (this == o) return true;// 判断引用是否一致
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && gender == person.gender && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age, gender);
}
2、包装类
包装类相对于基本数据类型而言,就是一个数据,加上一些属性、方法、构造器。
包装类中,Byte、Short、Integer、Long,Float、Double直接父类是java.lang.Number
,Character、Boolean直接父类是Object类。
Integer
实现接口:Comparable<Integer>
、Constable
、ConstantDesc
【sealed interface】;final
修饰。
自动拆箱、自动装箱【JDK 1.5
】:
// 自动装箱
Integer i = 1;// Integer.valueOf(1)
//自动拆箱
int num = i2;// i2.intValue()
valueOf(int i):
// valueOf(int i)
public static Integer valueOf(int i) {
// 判定传入int数据是否在IntegerCache中,在,直接返回相应的对象;否则,新创建一个对象。
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
// 内部类:IntegerCache
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer[] cache;//存储Integer对象
static Integer[] archivedCache;
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
h = Math.max(parseInt(integerCacheHighPropValue), 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(h, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
// Load IntegerCache.archivedCache from archive, if possible
CDS.initializeFromArchive(IntegerCache.class);
int size = (high - low) + 1;
// Use the archived cache if it exists and is large enough
if (archivedCache == null || size > archivedCache.length) {
Integer[] c = new Integer[size];
int j = low;
for(int i = 0; i < c.length; i++) {
c[i] = new Integer(j++);
}
archivedCache = c;
}
cache = archivedCache;
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
}
3、日期相关类
- 第一批日期时间API :JDK1.0中使用java.util.Date类
- 第二批日期时间API :JDK1.1引入Calendar类
缺陷:
(1) 可变性 : 像日期和时间这样的类应该是不可变的;
(2) 偏移性 : Date中 的年份是从1900开始的,而月份都从0开始;
(3) 格式化 : 格式化只对Date有用,Calendar则不行。
- 第三批日期时间API:JDK1.8新增日期时间API
(1)JDK8之前
a. Date
在JDK17中,存在大量方法已经处于废弃状态。
构造器未过期:空参、以long类型为参数
//过期方法:
toGMTString()、toLocaleString()
getYear()、getMonth()、getDate()、getDay()、
getHours()、getMinutes()、getSeconds()、
getTimezoneOffset()
以及上述对应的setXxx()方法
UTC()
(1)获取时间差:
//返回从 1970年1月1日00:00:00GMT以来此Date对象表示的毫秒数
new Date().getTime();
//本地方法。静态方法,可以用于衡量算法执行时间
System.currentTimeMillis();
//例如:
long start = System.currentTimeMillis();
method();
long end = System.currentTimeMillis();
System.out.println(end - start);
区分:java.util.Date
和java.sql.Date
java.sql.Date
继承自java.uti.Date
java.util.Date
、java.sql.Date
、String
相互转换:
b. java.text.SimpleDateFormat
在进行String
向java.sql.Date
转换过程中,String格式只能是年-月-日
拼接的形式。否则,出现异常:IllegalArgumentException
。
使用SimpleDateFormat
解决:
SimpleDateFormat
继承自DateFormat
- 使用:
//格式标准
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//String-> Date:parse
try {
Date d = simpleDateFormat.parse("2024-4-7 22:14:28");
} catch (ParseException e) {
e.printStackTrace();
}
//Date-> String:format
String format = simpleDateFormat.format(new Date());
c. Calendar
- 抽象类:不能直接创建对象
- 创建子类对象:
GregorianCalendar
- 静态方法:
getInstance()
- 创建子类对象:
- 一些get、set方法:
calendar.get(Calendar.YEAR);
calendar.get(Calendar.MONTH);
calendar.get(Calendar.DATE);
calendar.get(Calendar.DAY_OF_WEEK);
//获取当月日期的最大天数
calendar.getActualMaximum(Calendar.DATE);
//获取当月日期的最小天数
calendar.getActualMinimum(Calendar.DATE);
calendar.set(Calendar.YEAR, 1900);
calendar.set(Calendar.MONTH, 3);
calendar.set(Calendar.DATE, 16);
- String、Calendar、java.sql.Date转换:
/*
String -> Calendar:
String -> java.sql.Date
java.sql.Date -> Calendar
*/
java.sql.Date date = java.sql.Date.valueOf("2024-4-7");
calendar.setTime(date);
(2)JDK8
a. LocalDate、LocalTime、LocalDateTime
(1)now()
:获取当前日期、时间、日期+时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
(2)of()
:设置指定日期、时间、日期+时间
LocalDate localDate1 = LocalDate.of(2024, 1, 1);
LocalTime localTime1 = LocalTime.of(12, 11, 12);
LocalDateTime localDateTime1 = LocalDateTime.of(1890, 12, 23, 13, 24, 15);
(3)getXxx()
:获取信息;withXxx()
设置
localDateTime.getYear());//2024
localDateTime.getMonth());//APRIL
localDateTime.getMonthValue());//4
localDateTime.getDayOfYear());//98
localDateTime.getDayOfMonth());//7
localDateTime.getDayOfWeek());//SUNDAY
localDateTime.getHour());//23
localDateTime.getMinute());//15
localDateTime.getSecond());//11
//修改重新返回一个LocalDateTime对象,方法的调用者本身没有改变。
//而在Calendar中,修改会改变调用者本身
LocalDateTime localDateTime2 = localDateTime.withMonth(8);
System.out.println(localDateTime);//2024-04-07T23:20:29.482425500
System.out.println(localDateTime2);//2024-08-07T23:20:29.482425500
(4)加减操作:同样不会修改调用者本身
LocalDateTime localDateTime3 = localDateTime.plusMonths(4);
LocalDateTime localDateTime4 = localDateTime.minusMonths(1);
b. DateTimeFormatter
I. 获取DateTimeFormatter对象
(1)预定义的标准格式:
ISO_LOCAL_DATE_TIME
ISO_LOCAL_DATE
ISO_LOCAL_TIME
DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
(2)本地化相关的格式。
例如:pflocalizedDateTime()。
参数:
- FormatStyle.LONG:2024年4月7日 下午23点20分42秒
- FormatStyle.MEDIUM :2024-4-7 23:20:42
- FormatStyle.SHORT:24-4-7 下午11:21
DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
(3)自定义格式
例如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
II. 使用
// LocalDateTime extends Temporal
// Temporal extends TemporalAccessor
//LocalDateTime->String: format
//format参数:TemporalAccessor类型
String str = df1.format(LocalDateTime.now());
//String->LocalDateTime: parse
TemporalAccessor parse = df1.parse("2024-04-07T23:20:29");
c. Period、Duration; Instant
4、String、StringBuffer、StringBuilder
a. String
- "abc"是String类的一个具体对象,存放在字符串常量池中。
- 不可变
- final类:不可被继承,不会有子类
- 底层:
- JDK9之前:char数组
- JDK9及以后:byte数组 + coder【byte】=>【减少内存空间开支】
- 常见方法:
- 构造器:String()、String(“xxx”)、String(char[])、String(byte[])
- 长度:lenght();判空:isEmpty();下标对应字符charAt()
- 相等:equals()【Object类】
- 比较大小:compareTo()【Comparable接口】
- 截取:subString();拼接:concat()
- 字符替换:replace()
- 含有特定字符的字符串分裂成数组:split()
- 大小写转换:toUpperCase()、toLowerCase()
- 去除结尾空格:trim()
- toString()、其他基本类型转换成String:String.valueOf(false)
- 创建对象:
- 字符串直接赋值/字面量拼接:
字符串拼接在赋值:- 进行简单的字符串字面常量拼接:
String str = "ab"+"c";
会被编译器优化成拼接结果,直接赋值。
此时,会去常量池中取。第一次没有的话,会放入常量池。 - 变量参与拼接:`String a = “ab”; String b = a + “c”;
- JDK 8:使用StringBuilder进行拼接,还原String
- JDK 17:直接进行字符串拼接
- JDK 8:使用StringBuilder进行拼接,还原String
- 进行简单的字符串字面常量拼接:
- new创建对象:
String str = new String("abc");
会在堆上开辟空间创建对象,然后引用到常量池中的字符串。
- 字符串直接赋值/字面量拼接:
b. StringBuilder、StringBuffer
- 相同点:
- 可变字符串
- 都继承自AbstractStringBuilder
- JDK9之后:都改为使用
byte[] + byte
,之前使用char[]
- 空参构造器:初始会对value数组初始化,长度为16;传入String对象作为参数的构造器:会初始化一个长度为传入字符串长度+16的数组【JDK9之后会根据编码调整】
- 常用方法:append、insert、reverse、setCharAt、setLength;转成String:toString
- 不同点:
- StringBuilder是JDK1.5新增的
- StringBuffer线程安全、StringBuilder线程不安全,性能略高
5、Math、Random; 金额操作(BigDecimal、Concurrency、Java Money)
a. Math
- final类:不能被继承;
- 构造器私有化:不能创建Math类对象;
- 内部所有属性、方法都被static修饰:无需创建对象,直接使用类名获取。
- 常用属性:PI【圆周率】
- 常用方法:
- 随机数:random()【返回 [0.0,1.0) 的一个double类型的伪随机数】
- 绝对值:abs()
- 近似:
- 向上取整【天花板数】:ceil()
- 向下取整【地板数】:floor()
- 四舍五入:round()
- 最值:
- 最大值:max()
- 最小值:min()
- 随机数:random()【返回 [0.0,1.0) 的一个double类型的伪随机数】
- 静态导入:静态导入后,可以直接用属性/方法名访问静态属性和方法。目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序。但是,滥用静态导入会使程序更难阅读,更难维护。
b. Random
在Math.random()
中已有提及。
c. 金额操作
JAVA中如何处理金额类数据
java.util工具类之Currency类
JavaMoney规范(JSR 354)与对应实现解读
6、Stream、Optional
7、File
Java中操作文件系统中的文件/目录,使用java.io.File
,是文件/目录的路径名的抽象表示。不能获取到文件/目录中的内容。所以要使用到IO流的相关内容
绝对路径、相对路径
8、URL_URI
URI(uniform resource identifier,统一资源标识符),用来唯一的标识一个资源。
URL(Uniform Resource Locator,统一资源定位符),是互联网上用来标识某一处资源的地址,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
引用:
(1)Java中重写了equals()和toString()方法的类有哪些