前言:String类是我们很常见的一种创建文本的类,但它也有许多有趣的地方,或者是可以深入了解一下的地方,所以我们本篇博客将带你深入String类。
上一篇博客中我们了解了字符串的一些常用方法,然后这一篇我们继续讲解到字符串中的其他方法,以及StringBuffer 和 StringBuilder。
每文一图:
深入String类
一.其他字符串方法
除了上一篇博客中的字符串常用方法,我们还有一些没有归类的字符串常用方法,如下表:
NO | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | pubilc String trim() | 普通 | 去掉字符串中的左右空格,保留中间空格 |
2 | public String toUpperCase() | 普通 | 字符串转大写 |
3 | public String tolowerCase() | 普通 | 字符串转小写 |
4 | public native String intern() | 普通 | 字符串入池操作 |
5 | public String concat(String str) | 普通 | 字符串拼接,等同于"+",不入池 |
6 | public int length() | 普通 | 取得字符串的长度 |
7 | public boolean isEmpty() | 普通 | 判断是否为空字符串,但不是null,而且长度为0 |
接下来我们一个一个的举例子说明,看看这些字符串又有什么样的奥秘。
1.pubilc String trim()
trim方法是去除字符串两边空格的方法,也就是使用后字符串两边会没有空格,但不会去除中间的空格,举个例子就很好理解了:
public static void main(String[] args) {
String str =" abc de ";
String ret =str.trim();
//trim去除了前后两边的空格
System.out.print("字符串前后");//更容易观察前面是否没有空格
System.out.print(ret);
System.out.println("是连续的,没有空格");//更容易观察后面面是否没有空格
}
//打印:字符串前后abc de是连续的,没有空格
2.public String toUpperCase()/ tolowerCase()
这个方法就是字符串转大写,也就是把字符串中小写字符转大写,但是其他不用转的大写以及不能转的比如123这些数字,或者汉字,就不会转变。
例子:
public static void main(String[] args) {
String str ="abcedeFG123张三";
String ret = str.toUpperCase();
System.out.println(ret);
//打印ABCEDEFG123张三
}
同样的 tolowerCase()
就是有大写的转小写,其他不变,比如:
public static void main(String[] args) {
String str ="ABCDEfg123张三";
String ret = str.toLowerCase();
System.out.println(ret);
//打印abcdefg123张三
}
3.public native String intern()
这里是一个字符串入池的操作:
判断字符串常量池中是否存在一个引用,这个引用指向的字符串对象和当前对象相等(使用 equals 方法判断相等),如果存在直接返回这个引用,如果不存在则创建一个字符串对象并将其引用存入字符串常量池。
我们用例子来更好的理解一下:
public static void main(String[] args) {
//代码基于JDK 8
//s1指向字符串常量池中的"我是张三"
String s1 = "我是张三";
//s2也指向字符串常量池中的"我是张三"
String s2 = "我是张三";
//s3指向堆中的某个对象
String s3 = new String("我是张三");
//因为字符串常量池中已经存在"我是张三"的引用,直接返回这个引用
String s4 = s3.intern();
//创建一个字符串对象
String s5 = new String("hhh");
//常量池中不存在指向"hhh"的引用,创建一个"hhh"对象,并将其引用存入常量池
String s6 = s5.intern();
//创建一个字符串对象
String s7 = new String("hhh");
//常量池中存在指向"hhh"的引用,直接返回
String s8 = s7.intern();
}
实际上就是有就直接拿引用,没有就创建的意思。
4.public String concat(String str)
这里是字符串拼接,之前我们看见过字符串拆分,所以这里也有字符串拼接的方法,上面说明中写道:这个方法是字符串拼接,等同于"+",不入池,我们用一个例子解释一下:
public static void main(String[] args) {
String str = "aaaaa";
String ret =str.concat("bbb");
System.out.println(ret);
//打印aaaaabbb
}
这里就是相当于"aaaaa"+“bbb”,而说明中的不入池的意思是拼接后的数组aaaaabbb不入池,而不是aaaaa或者bbb不入池。
5.public int length()
这个length就是老熟人了,取得字符串的长度,之前我们也有取得数组的长度,但是这两者有一个()
的不同,千万不要把()
省略了。
例子:
public static void main(String[] args) {
int [] array = {1,2,3,4,5,6};
String str = "abcde";
System.out.println(array.length);//6
System.out.println(str.length());//5
}
6.public boolean isEmpty()
这个方法是判断是否为空字符串,但不是null,而且长度为0的字符串。
public static void main(String[] args) {
String str1 = "";
String str2 = " ";
String str3 = "123456";
System.out.println(str1.isEmpty());//true
System.out.println(str2.isEmpty());//false
System.out.println(str3.isEmpty());//false
}
像上面的就是,str1就是空字符串且不是null,长度为0;而str2就不是,它看起来好像没东西,但是里面都是空格,所以并不是空的。
二.StringBuffer 和 StringBuilder
首先来回顾下String类的特点:
通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类。而StringBuffer 和 StringBuilder 大部分功能是相同的。
首先我们先来观察:观察StringBuffer使用
public class Test{
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append("World");
fun(sb);
System.out.println(sb);
}
public static void fun(StringBuffer temp) {
temp.append("\n").append("www.csdn.com.cn");
}
}
这里的append其实就是相当于String中使用"+"来进行字符串连接,而这里很明显我们在加了又加,所以这里就突出了一个点:
这就是String和StringBuffer的区别。
然后就到我们的StringBuffer 和 StringBuilder的区别了,这两个的区别就是一个线处安全的区别,StringBuffer有一个东西,能让他保证线程安全,适合多线程的使用,我们从源码看一下:
这里我们可以看到,大家都是类似于String的“+”的函数,但是在StringBuffer中就多了一个修饰,也就是synchronized,这就是一个相当于是🔒的概念,如果在多线程中,你可以想象是在公共厕所中没有门锁,疯狂有人冲进你正在上的厕所,就很恐怖了。
这就是两者的区别。
然后关于这三者,需要注意:
String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
比如:
/**
* StringBuffer或者StringBuilder-》String
* 调用toString方法
*
* @return
*/
public static String func() {
StringBuilder sb = new StringBuilder();
return sb.toString();
}
/**
* String->StringBuffer或者StringBuilder
* 使用构造方法
*
* @return
*/
public static StringBuffer func2() {
String str = "abcdef";
StringBuffer sb = new StringBuffer();
sb.append(str);
return sb;
//return new StringBuffer(str);
}
最后我们再总结一下这三者的区别:
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改。
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。
这就是String类的全部内容了。
这就是本篇深入String类4的全部内容啦,4片博客终于是结束了。欢迎关注。一起学习,共同努力!也可以期待这个系列接下来的博客噢。
链接:都在这里! Java SE 带你从零到一系列
还有一件事: