Java有哪些操作字符串的类?区别在哪?

 更新时间:2021年06月13日 09:08:30   作者:Lf_MrF  
今天给大家爱带来的是关于Java的相关知识,文章围绕着Java操作字符串的类展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

操作字符串的类都有哪些?区别是什么?

操作字符串的类主要用三个,分别是String类,StringBuffer类和StringBuilder类.

不可变字符串

String类

public class StringTest {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");	
        System.out.println(s1 == s2);	// true
        System.out.println(s2 == s3);	// false
        s2 = "abc" + "def";
        System.out.println(s1 == s2);	// false
        String s4 = "abcdef";
        System.out.println(s4 == s2);	// true
    }
}

1.当使用=对String类初始化的时候,会在常量池创建对象,将引用s1指向常量池中的地址.

2.创建s2的时候,会先在常量池中检查是否有"abc"的对象,如果有则直接将s2指向常量池中的"abc".所以s1和s2指向的是相同的对象.

3.使用new关键字创建String对象的时候,会在堆空间中开辟一块内存,然后在堆中对s3进行初始化,s3指向的是堆内存空间中的一块区域.

4.当我们对s2进行修改的时候,其实是在常量池中添加了新的对象"abcdef",此时我们创建新的对象s4会和创建s2的步骤相同.s4在常量池中找到了"abcdef",所以直接指向这个对象.

当我们对String类型的变量进行操作的时候,其实每次改变都是创建除了新的对象.

可变字符串

StringBuffer和StringBuilder类中都提供了增删字符串的方法,下面展示一个在原始对象上增加新的字符的示例.

public class StringTest2 {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("abc");
        StringBuilder sb2 = new StringBuilder("abc");
        System.out.println(sb1.hashCode());	// 460141958
        System.out.println(sb2.hashCode());	// 1163157884
        sb1.append("def");
        sb2.append("def");
        System.out.println(sb1.hashCode()); // 460141958
        System.out.println(sb2.hashCode()); // 1163157884
    }
}

通过这个例子我们能清晰看到,s1和s2在增加元素前后仍旧是同一个对象.
StringBuffer和StringBuilder都继承了AbstractStringBuilder类.

StringBuffer类

和StringBuilder类对比发现,StringBuffer类中的方法没有使用synchronized 关键字进行修饰.

   @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

StringBuilder类

  @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

AbstractStringBuilder类的append方法

扩容方法:调用ensureCapacityInternal()方法检查初始char[] value空间是否足够,如果不够的话,就进行扩容操作.

 public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        // 查看空间是否足够
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
 private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        // 如果空间不够就重新开辟一块新的空间
        if (minimumCapacity - value.length > 0) {
            value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity));
        }
    }

copyOf方法:重新创建一个新的char数组然后将原数组数据拷贝到新数组去.

    public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

小结

Java操作字符串的类主要有三个,分别是String类,StringBuffer类和StringBuilder类.这三个类的底层都是以char[]形式保存字符串对象的.他们之间的区别主要体现在:

1.String类型进行修改操作之后相当于重新创建对象,StringBuffer和StringBuilder进行增删操作都是针对同一个对象.

2.StringBuffer中的大部分方法都没有使用synchronized关键字修饰,所以性能更高(我刷题的时候也都是写这个).单线程情况下首选使用StringBuffer类,多线程环境下需要使用StringBuilder类保证线程安全.

3.如果字符串声明之后不需要进行改动,则直接声明String类是最好的选择,不使用new关键字声明String对象时,它不会再堆内存中开辟空间,而是直接指向String常量池.这样可以实现复用,降低资源消耗.

扩展阅读

Java基础系列第一弹之方法重载和方法重写的区别
Java基础系列第二弹之Java多态成员访问的特点

到此这篇关于Java有哪些操作字符串的类?区别在哪?的文章就介绍到这了,更多相关Java操作字符串的类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Hibernate三种状态和Session常用的方法

    Hibernate三种状态和Session常用的方法

    本文主要介绍了Hibernate三种状态和Session常用的方法,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • 解决SpringBoot整合MybatisPlus分模块管理遇到的bug

    解决SpringBoot整合MybatisPlus分模块管理遇到的bug

    这篇文章主要介绍了解决SpringBoot整合MybatisPlus分模块管理遇到的bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringCloud实现全链路灰度发布的示例详解

    SpringCloud实现全链路灰度发布的示例详解

    灰度发布是指在软件或服务发布过程中,将新版本的功能或服务以较小的比例引入到生产环境中,仅向部分用户或节点提供新功能的一种发布策略,下面我们就来学习一下SpringCloud如何实现全链路灰度发布
    2023-11-11
  • java判断字符串中是否包含中文并过滤中文

    java判断字符串中是否包含中文并过滤中文

    这篇文章主要为大家详细介绍了java判断字符串中是否包含中文,并过滤掉中文,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • dom4j读取XML文件详解

    dom4j读取XML文件详解

    这篇文章主要为大家详细介绍了dom4j读取XML文件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • springboot实现极验校验的项目实践

    springboot实现极验校验的项目实践

    在系统业务中,需要想客户发送手机验证码,进行验证后,才能提交,本文主要介绍了springboot实现极验校验的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • IDEA2020配置Git的方法步骤

    IDEA2020配置Git的方法步骤

    这篇文章主要介绍了IDEA2020配置Git的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java处理时间格式CST和GMT转换方法示例

    Java处理时间格式CST和GMT转换方法示例

    这篇文章主要给大家介绍了关于Java处理时间格式CST和GMT转换方法的相关资料,相信很多小伙伴在时间格式转换的时候非常头疼,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解

    SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解

    这篇文章主要介绍了SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java封装、继承、多态三大特征的理解

    Java封装、继承、多态三大特征的理解

    封装、继承、多态三大特征是java中比较常用的,务必要掌握,下面给大家介绍Java封装、继承、多态三大特征的理解,有不清楚的朋友可以一起学习下
    2016-06-06

最新评论