文章目录
- 一、String类常用的构造方法
- 二、常见的四种String对象的比较
- 1.使用``==``比较
- 2.使用``equals()``方法比较
- 3.使用``compareTo()``方法比较
- 4.使用``compareToIgnoreCase()``方法比较
- 三、字符串的查找
- 四、字符串的转化
- 1.数字和字符串间的转化
- 2.大小写转化
- 3.字符串和数组间的转化
- 五、字符串的替换
- 1.replaceAll()
- 2.replaceFirst()
- 六、字符串的分割
- 七、字符串的截取
- 八、去除字符串中的左右空格
- 九、字符串的不可变性
- 十、StringBuilder和StringBuffer
- 十一、String类OJ面试题
给个关注叭
个人主页
JavaSE专栏
前言:本片文章主要整理了String类常用的一些方法、及StringBuilder 和 StringBuffer 的用法及区别
一、String类常用的构造方法
1.常量字符串构造
String str = "abcd";
2.直接new String
对象
String str = new String("abcd");
3.使用字符数组构造
char[] array = {'a','b','c','d'};
String str = new String(array);
在JDK8中,String 类的底层字符串使用字符数组(char[])来存储的;在JDK17中字符串使用字节数组(byte[])来存储的
【注意】几种字符串为空的情况
- 字符串长度为零,字符串为空
String str = "";
System.out.println(str.length);//0
System.out.println(str.isEmpty());//true
- 字符串 str 为null,代表 str 引用不指向任何的对象
String str = null;
System.out.println(str.length);//空指针异常
System.out.println(str.isEmpty());//空指针异常
这里再重复一下,关于 引用类型 容易搞混淆的知识点
- 一个引用不可以指向多个对象(只能指向一个对象)
- 引用不可以指向引用(这种说法是错误的),下面代码的解读是 str2引用 指向了 str1引用所指向的对象
String str1 = new String("abc");
String str2 = str1;
- 引用等于null,代表此时该引用不指向任何的对象
String str = null;
二、常见的四种String对象的比较
1.使用==
比较
对于基本数据类型来说,使用==
比较,比较的是变量中的数值是否相同;对于引用数据类型来说,使用==
比较,比较的是 引用所指向的对象是否相同(引用所指向的地址是否相同)
int a = 3;
int b = 3;
System.sout.println(a == b);//true
String str1 = "Hello";
String str2 = "Hello";
System.sout.println(str1 == str2);//false
str1 = str2;
System.sout.println(str1 == str2);//true
2.使用equals()
方法比较
equals()方法底层的比较规则是:先比较两个引用是否为同一个类型,然后比较两个引用所指向的是否为同一对象,最后比较字符串中的内容是否相同。返回值为true或false
String str1 = new String("hello");
Stirng str2 = new String("world");
Stirng str3 = new String("hello");
System.out.println(str1.equals(str2));//false
System.out.println(str1.equals(str3));//true
3.使用compareTo()
方法比较
和equals()方法不同,compareTo()方法的返回值是 整型int. 返回值大于零,前者大于后者;返回值小于零,前者小于后者;返回值等于零,前者等于后者。compareTo()方法,字符串的大小 取决于 字符串中第一个不相等的字符 所比较的大小。str1和str2 比较,第一组不相等的字符就是 ‘a’ 和 ‘A’,所以整个字符串的大小 取决于 ‘a’ 和 ‘A’ 的大小。
String str1 = new String("abcd");
Stirng str2 = new String("Abcd");
Stirng str3 = new String("abcd");
System.out.println(str1.compareTo(str2));// 返回值大于零
System.out.println(str1.compareTo(str3));// 返回值等于零
System.out.println(str2.compareTo(str3));// 返回值小于零
4.使用compareToIgnoreCase()
方法比较
此方法会忽略大小写
String str1 = new String("abcd");
Stirng str2 = new String("Abcd");
System.out.println(str1.compareTo(str2));// 返回值等于零
三、字符串的查找
四、字符串的转化
1.数字和字符串间的转化
数字转字符串
String str1 = String.valueOf(1234);
String str2 = String.valueOf(1.234);
字符串转数字
int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");
2.大小写转化
String s1 = "hello";
String s2 = "HELLO";
// 小写转大写
System.out.println(s1.toUpperCase());
// 大写转小写
System.out.println(s2.toLowerCase());
【注意】这里的大小写转化,转化后,原来的字符串不会发生任何改变,调用方法后,会产生一个新的String对象,新的对象里面就会存放转化好的字符串
3.字符串和数组间的转化
String s = "hello";
// 字符串转数组
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
System.out.println();
// 数组转字符串
String s2 = new String(ch);
System.out.println(s2);
五、字符串的替换
1.replaceAll()
替换所有的指定字符
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
2.replaceFirst()
替换第一次出现的指定字符
String str = "helloworld" ;
System.out.println(str.replaceFirst("l","_"));
【注意】这里的大小写转化,转化后,原来的字符串不会发生任何改变,调用方法后,会产生一个新的String对象,新的对象里面就会存放转化好的字符串
六、字符串的分割
String str1 = "name=zhangSan=age=12";
String[] ret = str1.split("=");//以'='分割,分割后存放在字符串数组中
System.out.println(Arrays.toString(ret));
String[] ret2 = str1.split("=",3);//以'='分割,最多分三组
System.out.println(Arrays.toString(ret2));
运行结果:
[name, zhangSan, age, 12]
[name, zhangSan, age=12]
几种特殊情况的分割
- 以字符 ‘.’ 分割,需要加上转义字符"\"。字符 “|”, “*”, “+” 都得加上转义字符,前面加上 “\\”
String str1 = "192.168.34";
String[] ret = str1.split("\\.");//以'.'分割,需要加上"\\"
System.out.println(Arrays.toString(ret));
2.以字符 ‘\’ 分割,需要用 “\\\\”
String str1 = "192\\123";
String[] ret = str1.split("\\\\");//以'\'分割
System.out.println(Arrays.toString(ret));
3.如果一个字符串中有多个分隔符,可以用"|"作为连字符
String str1 = "name=zhangSan&age=10";
String[] ret = str1.split("=|&");//以'=' 和 '&' 分割,中间加'|'
System.out.println(Arrays.toString(ret));
七、字符串的截取
【注意】截取部分内容(下标区间内),下标区间为左闭右开区间—>[begin,end);
如果区间为[0,str.length()),那么返回的新的字符串对象还是原来的字符串对象
八、去除字符串中的左右空格
代码示例如下:
String str = " hello world ";
String ret = str.trim();
System.sout.printfln(ret);
运行结果:
hello world
前后都没有空格
九、字符串的不可变性
通过观察 String 的源码,String 类被 final 修饰,表明这个String 类不能被继承;类中的数组 也被 final 修饰,说明这个数组不能指向新的对象,但是可以通过下标改变数组中的值,所以说 “字符串的不可变性就是因为 数组被final修饰了,里面的值才不能被改变” 这种说法是错误的.字符串的不可变性是因为,被 private 关键字修饰,在类外无法访问数组,进而无法改变字符串的内容。
十、StringBuilder和StringBuffer
如果想要修改字符串中的内容,可以使用String类 进行字符串的拼接,但是这种效率很低
String str = "Hello";
str += " world"
System.sout.printfln(str);
将上述代码反汇编:
观察反汇编之后的代码,上面三段语句就等效于以下代码:
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Hello");
stringBuilder.append(" world");
String ret = stringBuilder.toString();
【注意】这种方法不推荐使用,这种方法效率非常低,因为中间创建了很多的临时对象
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。所以要对字符串进行修改,建议使用 StringBuilder 和 StringBuffer 类。这两个类大部分功能是相同的,以下是一些常用的方法:
面试题:String、StringBuffer、StringBuilder的区别
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操
作
StringBuffer属于线程安全操作,类似于在公共厕所,每次进去一个人,都会上锁,另外一个人就进不去,只有前面的人完成方便之后,厕所门锁才会开。
【注意】虽然使用StringBuffer 比较安全,但是也会造成系统资源的消耗,因此在单线程下使用StringBuilder;在多线程下使用StringBuffer。
十一、String类OJ面试题
-
字符串中的第一个唯一字符
-
字符串中最后一个单词的长度
-
检测字符串是否为回文串