0-包装类
🌕 针对八种基本数据类型的相应的引用类型就是包装类,作用就是,是类之后,就拥有了类的特点,可以调用类的方法
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
📌 了解以上关系后,可以更明确的知道这些类都有一些什么方法可以使用。从基本数据类型到包装类,叫 装箱
,反之叫 拆箱
- 🐼 包装类 ←> String
// -> String
Integer i = 10;
// 第一种
String a = i + "";
// 第二种
a = i.toString();
// 第三种
a = String.valueOf(i);
// -> 包装类
i = new Integer(a); // 直接创建,有字符串的构造器
i = Integer.valueOf(a);
🚩🚩🚩 关于
Integer.valueOf()
补充一个细节,当我们用一个int
的基本类型装箱时,默认调用的就是这个方法,而这个方法,如果值在-128~127
这个范围内的话,则直接从预先创建的数组中返回,如果不在,在创建新的对象返回
1-String 类
String
其本质还是在用一个char
的数组来进行存储,其字符使用的是Unicode
编码,该编码不区分字母还是汉字,均占用两个字节String
有很多构造器,它是final
类,所以不能被继承String
存放字符的char
数组是private final char values[]
,是final
修饰的- 方法较多,用到再看吧
📌 细节
,下图中,因为 abc
是一个常量,两种方式最后都会指到同一个 地址
📌 String.intern()
方法,判断常量池中有没有和该字符串内容相同的字符串,如果有,则返回该常量的引用,如果没有,则将该字符串加入常量池,再返回引用
3-StringBuffer
🧠 StringBuffer
类是 String
类的一个扩展,主要区别在于其字符的存储
String
中保存的是字符串的常量,里面的值不能更改,每次更新实际上都是更改了常量的地址,效率比较低StringBuffer
保存的是字符串变量,因为其没有用final
关键字来修饰其存放字符的数组,所以是保存在堆
中的,而不是常量区
中,这样就可以直接更新内容,而不用更新地址
🐼 String
←> StringBuffer
// 第一种
String a = "hello";
StringBuffer b = new StringBuffer(a);
// 第二种
StringBuffer b1 = new StringBuffer();
b1 = b1.append(a);
// 反转第一种
a = b1.toString();
// 反转第二种
String a1 = new String(b1);
4-StringBuilder
StringBuilder
一个可变的字符序列,该类兼容StringBuffer
的API
,但是不保证同步(StringBuilder
不是线程安全的)。所以该类被设计来做StringBuffer
的简易替换,如果是单线程,则建议优先采用该类,其大多数实现比StringBuffer
要快。其主要操作是append
和insert
方法,可以重载这些方法,以接收任意类型的数据
类型 | 字符序列是否可变 | 特点 |
---|---|---|
String | 不可变 | 效率低,但复用率高 |
StringBuffer | 可变 | 效率较高(增删),线程安全 |
StringBuilder | 可变 | 效率最高,线程不安全 |
- 📌
用法总结
1>
字符串大量修改,用StringBuffer
或StringBuilder
2>
大量修改,单线程,用StringBuilder
3>
大量修改,多线程,用StringBuffer
4>
很少修改,被多个对象引用,用String
,如配置信息等
5-Math
和数学计算相关的一个类,其方法基本上都是静态方法,直接使用即可
方法 | 作用 |
---|---|
abs | 绝对值 |
pow | 幂运算 |
ceil | 向上取整 |
floor | 向下取整 |
sqrt | 开方 |
round | 四舍五入 |
random | 随机数,范围 [0, 1] |
max | 两个数的最大值 |
min | 两个数的最小值 |
6-Arrays
和数组相关的一个类,用来管理和操作数组,也是包含了很多静态方法
方法 | 作用 |
---|---|
toString() | 返回数组的字符串形式 |
sort() | 排序,可以通过实现Comparator接口自定义排序 |
binarySearch() | 通过二分搜索法进行查找(该数组必须有序) |
copyOf() | 数组元素复制 |
fill() | 用给定元素填充数组 |
equals() | 比较两个数组元素是否完全一致 |
asList() | 将一组数据转成 list |
7-System
系统类
方法 | 作用 |
---|---|
exit() | 退出当前程序 |
arraycopy() | 复制数组元素,适合底层调用 |
currentTimeMillens() | 返回当前时间距离1970-1-1的毫秒数 |
gc() | 运行垃圾回收机制 |
8-BigInteger&BigDecimal
BigInteger
用来保存特别大的整数,BigDecimal
用来保存特别高精度的浮点数,用这两个类保存的数据,其加减乘除
需要调用指定的方法:add
subtract
multiply
divide
9-日期类
🚩 第一代日期类
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DataDemo {
public static void main(String[] args) throws ParseException {
// 获取当前系统时间
Date d1 = new Date();
System.out.println(d1); // Mon Sep 11 21:07:50 CST 2023
// 格式化日期
SimpleDateFormat s1 = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
System.out.println(s1.format(d1)); // 2023年09月11日 09:07:50
// 将字符串转成对应的 Date String s = "1992年09月24日 10:39:59 星期五";
Date d2 = s1.parse(s);
System.out.println(d2); // Thu Sep 24 10:39:59 CST 1992
}
}
🚩 第二代日期类(问题:可变性,日期类应该不可变;偏移性,月份从0开始;格式化只对 Date 有用,对该类不行;线程不安全;不能处理闰秒)
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar c = Calendar.getInstance(); // 创建日历对象,不能自己 new // 对应字段
System.out.println("年 " + c.get(Calendar.YEAR));
System.out.println("月 " + (c.get(Calendar.MONDAY) + 1));
System.out.println("日 " + c.get(Calendar.DATE));
System.out.println("小时 " + c.get(Calendar.HOUR));
System.out.println("24小时进制 " + c.get(Calendar.HOUR_OF_DAY));
System.out.println("分钟 " + c.get(Calendar.MINUTE));
System.out.println("秒 " + c.get(Calendar.SECOND));
}
}
🚩 第三代日期类(LocalDate 包含日期/年月日;LocalTime 包含时间/时分秒;LocalDateTime 包含日期时间/年月日时分秒)
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDemo {
public static void main(String[] args) {
LocalDateTime ldt = LocalDateTime.now();
System.out.println(
"年 " + ldt.getYear() + "\n月 " + ldt.getMonth()
+ "\n月(数字) " + ldt.getMonthValue() + "\n日 " + ldt.getDayOfMonth()
+ "\n小时 " + ldt.getHour() + "\n分钟 " + ldt.getMinute()
+ "\n秒 " + ldt.getSecond()
);
// 格式化
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtf.format(ldt));
}
}
🚩 此外还有时间戳的类
Instant