字符串相关的类
String
一.特性
- String:字符串,使用一对""引起来表示。
- String声明为final的,不可被继承。
- String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小。
- String内部定义了final char[] value用于存储字符串数据。
- String:代表不可变的字符序列。简称:不可变性。
体现:当对字符串重新赋值时,当对现有的字符串进行连接操作时,当调用String的replace()方法修改指定的字符或字符串时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。 - 通过字面量的方式(区别于new)给一个字符赋值,此时的字符串值声明在字符串常量池中。
- 字符串常量池中是不会存储相同内容的字符串。
- String的实例化方式
方式一:通过字面量定义的方式 (声明在方法区中的字符串常量池里)
方式二:通过new+构造器的方式 (对象保存的地址值是数据在堆空间中开辟空间以后对应的地址值)
结论
1.常量和常量的拼接结果在常量池,且常量池不会存在相同内容的常量。
2.只要其中一个是常量,结果就在堆中。
3.如果拼接的结果调用了intern()方法,返回值在常量池中。
面试题:String s = new String(“abc”)方式创建对象,在内存中创建了几个对象?
A:两个。一个是堆空间中new结构,另一个是char[]对应的常量池的数据:“abc”。
二.常用方法
三.之间的转换
String与char[]之间的转换
- String -----> char[]:调用String的ToCharArray()
- char[] -----> String:调用String的构造器
String与byte[]之间的转换
- 编码(看得懂 -----> 看不懂的二进制数据):String -----> byte[]:调用String的getBytes()
- 解码(看不懂的二进制数据 -----> 看得懂):byte[] -----> String:调用String的构造器
- ps:解码时,要求解码使用的字符集必须与编码使用的字符集一致,不然会出现乱码。
StringBuffer和StringBuilder
一.异同
String:不可变的字符序列;底层使用char[]存储
StringBuffer:可变的字符序列;线程安全,效率低;底层使用char[]存储
StringBuilder:可变的字符序列;(JDK5.0新增的)线程不安全,但效率高;底层使用char[]存储
扩容问题:如果要添加的数组底层盛不下了,那就需要扩容底层的数组。默认情况下,扩容到原来容量的2倍+2,同时将原有的数组元素复制到新的数组中。
效率的对比
从高到低:StringBuilder > StringBuffer > String
二.常用方法
JDK8之前的日期时间API
System类
Date类
1.两个构造器的使用
- Date():创建一个对应当前时间的Date对象
- Date(long date):创建指定毫秒数的Date对象
2.两个方法的使用
- toString():显示当前的年月日时分秒
- getTime():获取当前对象对应的毫秒数(时间戳)
3.java.sql.Date对应着数据库中的日期类型的变量
- 如何实例化
- 如何将java.util.Date对象转换成java.sql.Date对象
SimpleDateFormat类
一.两个操作
1.格式化
日期 --------> 字符串
(按照指定的格式进行格式化和解析:调用带参的构造器)
2.解析(格式化的逆过程)
字符串 --------> 日期
解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器识别),否则会抛异常。
二.课后习题
1.将字符串"2020-08-17"转换成java.sql.Date
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatTest {
@Test
public void testExer() throws ParseException {
String birth = "2020-08-17";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf1.parse(birth);
java.sql.Date birthDate = new java.sql.Date(date.getTime());
System.out.println(birthDate);
}
}
2.“三天打鱼两天晒网” 从date1:1990-01-01开始,问xxxx-xx-xx是在晒网还是打渔?
举例date2:2020-08-09 分析
总天数%5 == 1,2,3则是打渔
总天数%5 == 4,0则是晒网
总天数的计算
①先换成毫秒数,相减后转换成天数
(date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1
②直接算天数
Calendar类
一.实例化
1.创建其子类(GregorianCalendar)的对象
2.调用其静态方法getInstance()
二.常用方法
- get()
- set()
- add()
- getTime():日历类 -------> Date
- setTime():Date -------> 日历类
JDK8中新日期时间API
LocalDate LocalTime LocalDateTime
类似于Calendar
- now():获取当前的日期,时间,日期 + 时间
- of():获取指定的年月日时分秒,没有偏移量
- getXxx():获取相关的属性
- withXxx():设置相关的属性
LocalDateTime相较于其他两个使用频率更高
Instant
类似于java.util.Date类
now():获取本初子午线对应的标准时间
DateTimeFormatter类
类似于SimpleDateFormat
格式化:日期 -------> 字符串
解析:字符串 ----------> 日期
其他类
Java比较器
Java中的对象,在正常情况下,只能进行比较:==或 !=,不能使用> 或 <,但是在开发场景下,我们需要对多个对象进行排序,言外之意,就是要比较对象的大小。如何实现,就要使用两个接口中的任何一个:Comparable, Comparator
Comparable接口(自然排序)
1.像String,包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方法。
2.像String,包装类重写了compareTo(obj)方法以后,进行了从小到大的排列。
3.重写compareTo(obj)方法的规则
4.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。在compareTo(obj)方法中指明如何排序
Comparator接口
两者的对比
Comparable接口的方式一旦指定,保证Comparable接口实现类的对象在任何位置都可以比较大小。而Comparator接口属于临时类的比较。
System类
Math类
BigInteger BigDecimal