0-包装类

🌕 针对八种基本数据类型的相应的引用类型就是包装类,作用就是,是类之后,就拥有了类的特点,可以调用类的方法

基本数据类型包装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

包装类关系图

📌 了解以上关系后,可以更明确的知道这些类都有一些什么方法可以使用。从基本数据类型到包装类,叫 装箱,反之叫 拆箱

  • 🐼 包装类 > 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 一个可变的字符序列,该类兼容 StringBufferAPI但是不保证同步StringBuilder 不是线程安全的)。所以该类被设计来做 StringBuffer 的简易替换,如果是单线程,则建议优先采用该类,其大多数实现比 StringBuffer 要快。其主要操作是 appendinsert 方法,可以重载这些方法,以接收任意类型的数据

🚩🚩🚩String 🆚 StringBuffer 🆚 StringBuilder 🚩🚩🚩
类型字符序列是否可变特点
String不可变效率低,但复用率高
StringBuffer可变效率较高(增删),线程安全
StringBuilder可变效率最高,线程不安全
  • 📌 用法总结
    • 1> 字符串大量修改,用 StringBufferStringBuilder
    • 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

https://www.bilibili.com/video/BV1fh411y7R8?p=488