前言:String类是我们很常见的一种创建文本的类,但它也有许多有趣的地方,或者是可以深入了解一下的地方,所以我们本篇博客将带你深入String类。
上一篇博客中我们了解了字符串的一些常用方法,然后这一篇我们继续讲解到字符串中的其他方法,以及StringBuffer 和 StringBuilder。
每文一图:
深入String类一.其他字符串方法
1.pubilc String trim()2.public String toUpperCase()/ tolowerCase()3.public native String intern()4.public String concat(String str)5.public int length()6.public boolean isEmpty() 二.StringBuffer 和 StringBuilder
一.其他字符串方法除了上一篇博客中的字符串常用方法,我们还有一些没有归类的字符串常用方法,如下表:
接下来我们一个一个的举例子说明,看看这些字符串又有什么样的奥秘。
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的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
通常来讲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最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。
这就是String和StringBuffer的区别。
然后就到我们的StringBuffer 和 StringBuilder的区别了,这两个的区别就是一个线处安全的区别,StringBuffer有一个东西,能让他保证线程安全,适合多线程的使用,我们从源码看一下:
StringBuilder的函数:
StringBuffer的函数:
这里我们可以看到,大家都是类似于String的“+”的函数,但是在StringBuffer中就多了一个修饰,也就是synchronized,这就是一个相当于是的概念,如果在多线程中,你可以想象是在公共厕所中没有门锁,疯狂有人冲进你正在上的厕所,就很恐怖了。
这就是两者的区别。
然后关于这三者,需要注意:
String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuffer:利用StringBuffer的构造方法或append()方法
StringBuffer变为String:调用toString()方法。
比如:
public static String func() { StringBuilder sb = new StringBuilder(); return sb.toString(); } public static StringBuffer func2() { String str = "abcdef"; StringBuffer sb = new StringBuffer(); sb.append(str); return sb; //return new StringBuffer(str); }
最后我们再总结一下这三者的区别:
面试题:请解释String、StringBuffer、StringBuilder的区别:
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改。StringBuffer与StringBuilder大部分功能是相似的StringBuffer采用同步处理,属于线程安全 *** 作;而StringBuilder未采用同步处理,属于线程不安全 *** 作。
这就是String类的全部内容了。
这就是本篇深入String类4的全部内容啦,4片博客终于是结束了。欢迎关注。一起学习,共同努力!也可以期待这个系列接下来的博客噢。
链接:都在这里! Java SE 带你从零到一系列
还有一件事:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)