【Java】带你从零到一系列17 深入String类4

【Java】带你从零到一系列17 深入String类4,第1张

【Java】带你从零到一系列17 深入String类4

前言: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

一.其他字符串方法

除了上一篇博客中的字符串常用方法,我们还有一些没有归类的字符串常用方法,如下表:

NO方法名称类型描述1pubilc String trim()普通去掉字符串中的左右空格,保留中间空格2public String toUpperCase()普通字符串转大写3public String tolowerCase()普通字符串转小写4public native String intern()普通字符串入池 *** 作5public String concat(String str)普通字符串拼接,等同于"+",不入池6public int length()普通取得字符串的长度7public 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的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。

通常来讲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 带你从零到一系列

还有一件事:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5709235.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存