1. String类型的常用方法:
1. contains
- 判断一个字符串是否包含某个字符串
- 返回值类型为boolean
- 参数类型为String
2. equals
- 判断两个字符串是否相同
- 返回值类型为boolean
- 参数类型为String
3. charAt
- 返回指定索引处的char值(从0开始)
- 返回值类型:char
- 参数类型:int
4. endsWith&&startsWith
- 判断字符串是否以某个字符串结尾&&开头
- 返回值类型:boolean
- 参数类型:String
5. indexOf
- 返回子字符串第一次出现的索引
- 返回值类型:int
- 参数类型:String,int(从指定索引处开始查询,可有可无)
6. trim
- 消除字符串中的空格
- 返回值类型:String
7. isEmpty
- 判断字符串是否为空
- 返回值类型:boolean
8. replace
- 使用某字符串代替源字符串中的子字符串
- 参数类型:char
9. split
- 以字符串中的某个符号分割该字符串
- 返回值类型:String[]
- 参数类型:String(行使分隔的字符串元素,或正则表达式)
10. toCharArray
- 将字符串装转换为字符数组
- 返回值类型:char[]
- 参数类型:String
11. toUpperCase&&toLowerCase
- 将字符串转换为全大写&&全小写
- 返回值类型:String
12. intern
- 返回字符串对象的规范表示,也就是如果字符串常量池中已经创建有了该字符串的地址,则直接返回该地址值的引用,不再开辟新的内存空间
其实String类型常用的方法还有很多,在今后的开发中也会不断用到,所以我认为备一份jdk的API文档随时查阅是很有必要的
2. String 具有不可变性:
说明:
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
- 当对现的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
代码举例:
public class Example {
public static void main(String[] args) {
String a = "Hello"; //字面量的定义方法
String b = "Hello";
String c = new String("Hello");
String d = new String("Hello");
System.out.println(a == b); //true 比较地址值
System.out.println(a == c); //false
System.out.println(a.equals(c)); //true
System.out.println(c == d); //false
System.out.println(c.equals(d)); //true
}
}
上述代码的结果中的第一个比较结果完全是巧合,原因是字符串刚生成时调用的是同一块字符串常量池,而字符串常量池不会存在相同类型的常量,这也就意味着这两个字符串的地址值是相同的
如果我们再对a和b赋值然后再比较就能说明问题了
public class Example {
public static void main(String[] args) {
String a = "Hello";
a += "c";
String b = "Hello";
b += "c";
System.out.println(a == b);
}
}
运行结果:
我们同时也可以发现,String实例化的方式有两种:
- 通过字面量的方式定义
- 通过new + 构造器的方式
第一种方式是在方法区的字符串常量池中直接开辟空间
第二种方式则是在堆生成对象,但引用的值还是来自字符串常量池
String是引用类型,涉及到引用类型的变量的比较,都用equals方法比较稳妥
3. StringBuilder和StringBuffer:
StringBuilder和StringBuffer都是用来拼接字符串的,后期会经常用到
首先看一下String,StringBuilder,StringBuffer三者之间的相关说明:
- String:不可变的字符序列;底层使用char[]存储
- StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
- StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
StringBuilder和StringBuffer的内存解析:
以StringBuffer为例:
public class Example {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer();
//查看StringBuffer的初始容量
System.out.println(sb1.capacity());
//查看StringBuffer的长度
System.out.println(sb1.length());
}
}
运行结果:
可以看到,StringBuilder的初始容量为16,没赋值时长度为零
当我们插入的字符串长度超过StringBuilder的初始容量时,StringBuilder会进行扩容,扩容的方式是:
原长度*2 + 2,同时将旧的数组赋值到新的数组中
StringBuilder和StringBuffer中的常用方法:
public class Example {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer();
//使用StringBuffer的append()方法拼接字符串
sb1.append("Hello");
System.out.println(sb1.toString()); //输出
sb1.delete(0, 3); //删除字符方法,输入索引,左闭右开
System.out.println(sb1.toString());
sb1.setCharAt(0, 'h'); //修改字符,输入索引和修改后的字符
System.out.println(sb1.toString());
sb1.insert(0, 'l'); //插入字符,输入索引和要插入的字符
System.out.println(sb1.toString());
}
}
运行结果:
4. Date工具类:
声明方式:
Date date = new Date();
这里实例化出来的对象打印出来是这样的
可以发现,虽然控制台打印的是正确的日期,但是可读性并不好,这时候可以用到SimpleDateFormat的方法
//先声明SimpleDateFormat对象,参数里规定日期格式,按顺序分别是年月日时分秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//调用format方法,返回值类型为String
System.out.println(sdf.format(date));
运行结果:
当然,SimpleDateFormat类还有一个方法,可以将输入的格式转换成默认格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2021-07-23 22:01:23"); //要按照上面规定的格式输入日期
System.out.println(date);
运行结果:
后续出现了Calendar类,一定程度上替换Date类,有需要时翻阅API文档即可,所以不做记录