1.1 StringBuffer和StringBuilder类
1.1.1 可变字符串概述
String类型提供了对字符串的只读操作,也即调用字符串的部分方法都会返回一个新的字符串。
如果需要对包装的字符数组进行增、删、改、查时,就需要可变字符串。
java中提供了两类可变字符串的类型StringBuffer、StringBuilder,位于java.lang包中
1.1.2 StringBuffer
StringBuffer封装了一个字符数组,并提供了对该字符数组进行增、删、改、查的方法。所以,我们完全可以把StringBuffer看成一个"字符的容器"!
可变字符串内存图
StringBuffer构造方法
StringBuffer() : 初始化默认容量是16的可变字符串 StringBuffer(int capacity) 初始化容量是capacity的可变字符串
StringBuffer常用方法
append / insert / delete
setCharAt / replace
public static void main(String[] args) {
//创建一个可变字符串容器,默认容量是16个字符
StringBuffer sb = new StringBuffer();
//创建一个可变字符串容器,容量是100个字符
//StringBuffer sb2 = new StringBuffer(100);
//【1】追加
sb.append('A');
sb.append('B');
//链式操作
sb.append("C").append("D");
System.out.println(sb.toString());
//【2】添加 insert sb.insert(0, 'E');
sb.insert(0, "hello").insert(0, "world"); System.out.println(sb);
//返回容器的容量
System.out.println(sb.capacity());
//返回容器中字符的个数
System.out.println(sb.length());
//当空间不足时,能否继续添加?=> 自动拓容 sb.append(123); System.out.println(sb.length()); System.out.println(sb.capacity());
//【3】删除
//删除指定位置index的字符
sb.deleteCharAt(10);
//删除指定范围的字符 delete(start,end) 含头不含尾 sb.delete(0, 10); System.out.println(sb);
//【4】修改
sb.replace(0, 5, "eabcd");
System.out.println(sb);
sb.setCharAt(0, 'f');
System.out.println(sb);
}
1.1.4 StringBuilder
StringBuffer在源代码级别上已经做到了线程安全,所以StringBuffer非常适合多线程环境。
如果在单线程条件下使用可变字符串序列时,一定优先考虑StringBuilder
面试题: StringBuffer和StringBuilder的区别
相同点:都是字符串可变缓冲区,api提供了相同的增删改查和自动拓容操作。
不同点:
StringBuffer 线程安全,效率低;StringBuilder线程不安全,效率高。
StringBuffer jdk1.0; StringBuilder jdk1.5
1.2. Math
Math 类包含用于执行简单的数学运算的方法,如随机数、最大值最小值、指数等,该类的方法都是static修饰的,在开发中其实运用并不是很多,里面有一个求随机数的方法,偶尔会用到。
Math类位于java.lang包中。
1.3. Random
Random类用于生产一个伪随机数(通过相同的种子,产生的随机数是相同的),Math类的random方法底层使用的就是Random类的方式。
Random位于java.util包中。
常用方法
nextInt(int n) : 产生范围在[0,n)的随机数
需求:随机产生4位的小写英文字母的验证码
1.4. UUID (掌握)
UUID表示通用唯一标识符 (Universally Unique Identifier) ,其算法通过电脑的网卡、当地时间、随机数等组合而成,优点是真实的唯一性,缺点是字符串太长了。
UUID位于java.util包中,jdk1.5 才出现的类
常用方法
randomUUID() : 产生一个随机的唯一标识符,格式:678f9568-8967-4637-a48e-f0eae30faf43
提示:
在java中不通过new构建一个对象的静态方法就称为静态工厂方法,类似地,Integer.valueOf()
1.5. 日期时间
1.5.1 日期时间概述
问题1:计算机如何表示时间?
因为日期时间是变化的,计算机不直接存储具体时间。
时间戳(time stamp):具体时间(特定的瞬间)距离历元(1970年01月01日 00:00:00:000) 经过的毫秒数,用long类型存储。
计算机很容易存储long类型数据,所以计算机通过时间戳存储并表示日期时间。
问题2:为什么时间戳一样,时间却不同?
中国时间和国外时间的时间戳都一样,但时区不同。时区导致时间不同。
计算机以格林尼治所在地的标准时间作为时间统一协调时,这个时间在民间称为格林尼治时间(GMT),为了统一国际用法,也称世界协调时(UTC)
问题3:如何计算当地时间?
当地时间 = UTC + 时区偏移
中国位于东八区,时区偏移为(+8:00)
中国时间 = UTC + 8:00
日本时间 = UTC + 9:00
1.5.2 Date
Date 位于java.util包中,表示特定的瞬间,内部包装了一个long类型的fastTime,通过运算可以把fastTime转换成年月日时分秒。
常用方法
Date()
getTime()
15.2.1 SimpleDateFormat
打印Date对象时,默认打印的是欧美人的日期时间风格,如果需要输出自定义的时间格式,比如2020年12月12日 12:12:12格式或者2020-12-12 12:12:12,此时可以使用SimpleDateFormat类。
SimpleDateFormat类,顾名思义是日期的格式化类,主要包括两个功能的方法:
格式化(format):Date类型转换为String类型:String format(Date date)
解析(parse):String类型转换为Date类型:Date parse(String source)
无论是格式化还是解析都需要设置日期时间的模式,所谓模式就是一种格式。
日期模式举例:
yyyy-MM-dd | 如2020-12-12 | |
HH:mm:ss | 如20:12:12 | |
yyyy-MM-dd HH:mm:ss | 如2020-12-12 | 20:12:12 |
yyyy/MM/dd HH:mm:ss | 如2020/12/12 | 20:12:12 |
yyyy年MM月dd日 HH时mm分ss秒 | 如2020年12月12日 20时12分12秒 | |
格式化和解析代码如下
1.6.Calendar
Calendar 日历类,其内部封装了一个long time 表示时间戳,其内部提供了方法通过对time计算出年月日时分秒...等日历字段,这些字段都被存储到一个数组中,通过get(字段)可以去数组中提取对于字段的值。
Calendar还提供了用来对日期做相加减,重新设置日期时间功能。
Calendar本身是一个抽象类,通过getInstance方法获取对象,其底层创建的是Calendar的子类对
象
1.7. 正则表达式
正则表达式,简写为regex和RE/Re。
正则表达式用来判断某一个字符串是不是符合某一种规则,在开发中通常用于判断检测操作、替换操作、分割操作等。
19.1. 正则表达式规则
正则表达式匹配规则一:元字符 ( 正则表达式中已定义好的字符,这些字符有特定的含义 )
正则表达式匹配规则二:量词