type
status
date
slug
summary
tags
category
icon
password
@ZZHow(ZZHow1024)
参考课程:
【韩顺平 循序渐进学Java】
本章 Project:
0459_八大Wrapper类
- 包装类:
- 针对八种基本数据类型相应的引用类型—包装类。
- 有了类的特点,就可以调用类中的方法。
- 父类:Number
0460_装箱和拆箱
- 包装类和基本数据的转换。
- 演示 包装类 和 基本数据类型的相互转换,这里以int 和 Integer演示:
- JDK5 前的手动装箱和拆箱方式。
- JDK5 以后(含JDK5)的自动装箱和拆箱方式。
- 自动装箱底层调用的是value0f方法,比如Integer.valueOf()。
装箱:基本类型 → 包装类型,拆箱:包装类型 → 基本类型。
案例演示:com.zzhow.wrapper 中的 Integer.java
0462_包装类方法
- 案例:Integer 与 String 相互转换
- 案例:Integer类和Character类的常用方法
案例演示:com.zzhow.wrapper 中的 WrapperMethod.java
0465_String结构剖析
- String类的理解和创建对象:
- String 对象用于保存字符串,也就是一组字符序列。
- 字符串常量对象是用双引号括起的字符序列。
- 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节。
- String 类较常用构造方法(其它看手册):
例如:"你好”、"12.97"、"boy"等
案例演示:com.zzhow.string_ 中的 String_.java
0466_String创建剖析
- 两种创建String对象的区别
- 方式一:直接赋值
String s1 = "DNX";
- 方式二:调用构造器
String s2 = new String("DNX");
- 方式一:先从常量池查看是否有"DNX”数据空间,如果有,直接指向;如果没有则重新创建,然后指向。
- 方式二:先在堆中创建空间,里面维护了value属性,指向常量池的DNX空间。如果常量池没有"DNX",重新创建,如果有,直接通过value指向。
s1 最终指向的是常量池的空间地址。
s2 最终指向的是堆中的空间地址。
0469-0470_String对象特性
- 特性一
- String 是一个final类,代表不可变的字符序列。
- 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。
- 特性二
- 编译器不傻,做一个优化,判断创建的常量池对象,是否有引用指向。
String a = "hello" + "abc";
→String a = "helloabc";
- 特性三
- 两个 String 的对象用“+”连接,底层是
- 重要规则:
String c1 = "ab" + "cd";
常量相加,看的是池。String c1 = a + b;
变量相加,是在堆中。
StringBuilder sb = new StringBuilder();
sb.append(a);
sb.append(b);
sb是在堆中,并且append是在原来字符串的基础上追加的。
0471-0473_String常用方法
- 说明:
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此Java设计者还提供了 StringBuilder 和 StringBuffer 来增强String的功能并提高效率。
- String类的常见方法一览:
- equals //区分大小写,判断内容是否相等
- equalsIgnoreCase //忽略大小写的判断内容是否相等
- length //获取字符的个数,字符串的长度
- indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
- lastIndexOf //获取字符在字符串中最后1次出现的索引,索引l从0开始,如找不到,返回-1
- substring //截取指定范围的子串
- trim //去前后空格
- charAt //获取某索引处的字符
- toUpperCase //转换成大写
- toLowerCase //转换成小写
- concat //拼接字符串
- replace //替换字符串中的字符
- split //分割字符串,对于某些分割字符,我们需要转义比如 \\等
- compareTo //比较两个字符串的大小,如果前者大,则返回正数,后者大,则返回负数,如果相等,返回 0。
- 逻辑:先逐个比较,若出现不一样的字符,返回前边的Unicode码 - 后边的Unicode码,比到其中一个字符串没了,返回前边的字符串长度 - 后边的字符串长度。
- toCharArray //转换成字符数组
- format //格式字符串
- 注意:这里的%.2f会自动进行四舍五入
案例演示:com.zzhow.string_ 中的 StringMethod.java
String类总结:它继承了Object类,实现了Serializable接口(可以串行化)、Comparable(String对象可以比较) 和 CharSequence接口。
0474_StringBuffer结构剖析
- 基本介绍
- java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删。
- 很多方法与 String 相同,但 StringBuffer 是可变长度的。
- StringBuffer是一个容器。
- 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final。该 value 数组存放字符串内容,所以 StringBuffer 中的字符串内容存放在堆中。
- StringBuffer 是一个 final 类,不能被继承。
- String VS StringBuffer
- String 保存的是字符串常量,里面的值不能更改,每次 String 类的更新实际上就是更改地址,效率较低
- StringBuffer 保存的是字符串变量,里面的值可以更改,每次 StringBuffer 的更新实际上可以更新内容,不用每次更新地址,效率较高。
//
private final char value[];
//存放在方法区中的常量池中//
char[]value;
//存放在堆中StringBuffer类总结:它继承了AbstractStringBuilder类。AbstractStringBuilder类继承了Object类,实现了Appendable接口 和 CharSequence接口。StringBuffer类实现了Serializable接口(可以串行化)。
0475_StringBuffer转换
- StringBuffer的构造器
- String ---> StringBuffer
- StringBuffer ---> String
0476_StringBuffer方法
- StringBuffer类常见方法:
- 增 append()
- 删 delete(start, end)
- 改 replace(start, end, string) //将start----end间的内容替换掉,不含end。
- 查 indexOf //查找子串在字符串第1次出现的索引,如果找不到返回-1。
- 插 insert()
- 获取长度 length()
0478_StringBuilder结构剖析
- 基本介绍:
- 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 APl,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
- 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。
- SringBuilder 继承 AbstractStringBuilder 类。
- 实现了 SeriaLizable,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)。
- StringBuilder 是final类,不能被继承。
- StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value; 因此,字符序列在堆中。
- StringBuilder的方法,没有做互斥的处理,即没有synchronized关键字,因此在单线程的情况下使用StringBuilder。
StringBuilder类总结:它继承了AbstractStringBuilder类。AbstractStringBuilder类继承了Object类,实现了Appendable接口 和 CharSequence接口。StringBuilder实现了Serializable接口 和 CharSequence接口。
StringBuffer VS StringBuilder:StringBuilder多用于单线程,StringBuffer 多用于多线程。
0479_StringBuilder应用
- String、StringBuffer 和 StringBuilder的比较:
- StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样。
- String:不可变字符序列,效率低,但是复用率高。
- StringBuffer:可变字符序列、效率较高(增删)、线程安全。
- StringBuilder:可变字符序列、效率最高、线程不安全。
- String使用注意说明:
- String、StringBuffer 和 StringBuilder 的选择
- 如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder。
- 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder。
- 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer。
- 如果我们字符串很少修改,被多个对象引用,使用 String,比如配置信息等。
- StringBuilder 的方法使用和 StringBuffer 一样。
0480_Math方法
- 基本介绍:
Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
方法演示:com.zzhow.math_ 中的 MathMethod.java
0481_Arrays排序源码解读
- Arrays里面包含了一系列静态方法,用于管理或操作数组(比如排序和搜索)。
- toString返回数组的字符串形式
- Arrays.toString(arr)
- sort排序(自然排序和定制排序)
- Integer arr[] = {1, -1, 7, 0, 89};
- inarySearch
- 通过二分搜索法进行查找,要求必须排好序。
- int index = Arrays.binarySearch(arr, 3);
案例演示:com.zzhow.array_ 中的 ArrayMethod1.java
0482_Arrays模拟排序
- 案例:模拟排序
案例演示:com.zzhow.array_ 中的 ArraySortCustom.java
0483_Arrays其他方法
- copyOf 数组元素的复制
Integer[] newArr = Arrays.copyOf(arr, arr.length);
- fill 数组元素的填充
Integer[] num =new Integer[](9,3,2};
Arrays.fill(num, 99);
- equals 比较两个数组元素内容是否完全一致
boolean equals = Arrays.equals(arr, arr2);
- asList 将一组值,转换成list
List<Integer> asList =Arrays.asList(2,3,4,5,6,1);
System.out.println("asList = " + asList);
案例演示:com.zzhow.array_ 中的 ArrayMethod2.java
0484_Arrays课堂练习
- 案例:自定义 Book 类,里面包含 name 和 price,使用定制排序实现。(1)按 price 从大到小排序。(2)按 price 从小到大排序。(3)按 name 长度从大到小排序。
- Book[] books = new Book[4];
- books[0] = new Book("这就是ChatGPT", 29.90);
- books[1] = new Book("大话数据结构", 59.50);
- books[2] = new Book("计算机底层的秘密", 64.90);
- books[3] = new Book("信息学奥赛一本通关", 64.00);
案例演示:com.zzhow.array_ 中的 ArrayExercise.java
0485_System方法
- System 类常见方法和案例
- exit:退出当前程序。
- exit(0) 表示程序退出。
- 0 表示一个状态,表示正常退出。
- arrayCopy:复制数组元素,比较适合底层调用,一般使用Arrays.copyOf完成复制数组。
- currentTimeMillis:返回当前时间距离1970-1-1的毫秒数。
- gc:运行垃圾回收机制System.gc0;
int[] src={1,2,3};
int[] dest = new int[3];
System.arraycopy(src, 0, dest, 0, 3);
//参数解读: // src:源数组 // srcPos:从源数组的哪个索引位置开始拷贝 // dest:目标数组 // destPos:把源数组的数据拷贝到目标数组的哪个索引 // length:从源数组拷贝多少个数据到目标数组
案例演示:com.zzhow.system_ 中的 System_.java
0486_大数处理方案
- Biglnteger和BigDecimal介绍
- 应用场景:
- Biglnteger 适合保存比较大的整型
- BigDecimal 适合保存精度更高的浮点型(小数)
- 四则运算:
- 加法:add 方法
- 减法:subtract 方法
- 乘法:multiply 方法
- 除法:divide 方法
- BigDecimal 做除法运算时需要注意:
// 可能抛出 ArithmeticException 异常(在除不尽的时候出现)
// 需要指定精度
// 保持和被除数精度一样:BigDecimal.ROUND_CEILING(已过时)
// 可以使用 bigDecimal1.scale() 配合四舍五入模式:RoundingMode.HALF_UP、RoundingMode.CEILING、RoundingMode.FLOOR
0487_Date介绍
- 第一代日期类:
- Date:精确到毫秒,代表特定的瞬间。
- SimpleDateFormat:格式和解析日期的类 SimpleDateFormat 格式化和解析日期的具体类。它允许进行格式化(日期->文本)、解析(文本->日期)和规范化。
0488_Date应用实例
- 获取当前系统时间
Date date = new Date();
- 通过毫秒数得到时间
Date d1 = new Date(123456789);
- 把一个格式化的 String 转成对应的 Date
String str = "2024年1月1日 00:00:00 星期一";
Date d2 = null;
try {
d2 = simpleDateFormat.parse(str);
} catch (ParseException e) {
System.
out
.println("日期格式不正确");
}
注意异常处理!
案例演示:com.zzhow.date_ 中的 Date01.java
0489_Calendar介绍
- 第二代日期类
- 第二代日期类,主要就是Calendar类(日历)。
- Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
0490_Calendar应用实例
案例演示:com.zzhow.date_ 中的 Calendar_.java
0491_第三代日期使用
- 第三代日期类
- 可变性:像日期和时间这样的类应该是不可变的。
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
- 格式化:格式化只对Date有用,Calendar则不行。
- 此外,它们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s)。
前面两代日期类的不足分析
JDK1.0中包含了一个 java.util.Date 类,但是它的大多数方法已经在JDK1.1引入Calendar类之后被弃用了。而Calendar也存在问题是:
- 第三代日期类常见方法
- LocalDate(日期/年月日)、LocalTime(时间/时分秒)、LocalDateTime(日期时间/年月日时分秒)[JDK8加入]
案例演示:com.zzhow.date_ 中的 LocalDate_.java
0492_第三代日期方法
- 第三代日期使用 DateTimeFormatter 进行格式化
- 类似于SimpleDateFormat
- Instant 时间戳
- 类似于Date
- 提供了一系列和Date类转换的方式
- 通过静态方法 now() 获取当前时间戳的对象
- Instant → Date:
Date date = Date.from(instant);
- Date → Instant:
Instant instant = date.toInstant();
Instant now = Instant.
now
();
案例演示:com.zzhow.date_ 中的 Instant_.java
- 第三代日期类更多方法
- LocalDateTime类
- MonthDay类:检查重复事件
- 是否是闺年
- 增加日期的某个部分
- 使用 plus 方法测试增加时间的某个部分
- 使用 minus 方法测试查看一年前和一年后的日期