Java String相加底层原理分析

 更新时间:2023年09月16日 08:35:29   作者:LililililililMeng  
这篇文章主要介绍了Java String相加底层原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Java String相加底层原理

代码

        String a = "a";
        String b = "b";
        String c = "c";
        String s1  = "a"+"b"+"c";
        String s2 = a+b+c;
        System.out.println(s2==s1);
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));

粗略解释

首先了解字符串常量池,创建字符串对象分别有两种,一种是字面值创建,一种是 new 创建,这两者存储的内存地址是不一样的。

如果是字面值创建的方式,如 String a="a",JVM会先去字符串常量池中寻找有没有“a”这个字符串,若有,则将其地址给 a;若没有,则先在常量池里创建“a”,然后再把地址给a;而通过 new a =  new String("a")的方式创建对象,则是在堆中创建“a”对象,a 指向这个对象。

当字符串进行拼接时,如果是字面值进行拼接,在编译阶段会进行优化,直接变成字符串”abc“。

当字符串变量相加时,因被final修饰,字符串不能修改,会 先生成StringBuilder对象,通过append()方法进行字符串拼接,在调用toString()方法形成新的字符串,所以s1可以理解为 

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("a");
        stringBuilder.append("b");
        stringBuilder.append("c");
        String s = stringBuilder.toString();

上好的String 相加

//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
return new String(result, 0, len + resultOffset);

两个String 对象相加,底层先生成一个StringBulider 对象,然后对两个字符串进行append,最后调用StringBuilder的toString方法进行返回 新的String对象 return new String()

            String a="a";
            String b="b";
            String c=a+b;
            String d=new String("ab");
            System.out.println(a+b==c);   //false
            System.out.println((a+b).equals(c));  //ture

调用equals方法时候,String重写了equals ,比较的是String的值, 而==比较的是引用的地址的值,所以只要a+b一次就会返回一个新的String对象

看一个新的方法类似

    public static boolean isAdmin(String userId){
        return userId.toLowerCase()=="admin";
    }
    public static void main(String[] args){
        System.out.println(isAdmin("Admin"));
    }

以上代码返回false  还是一样底层上面方法返回 new String()

注意注意注意

        String test="javaandpython";
        String str1="java";
        String str2="and";
        String str3="python";
        System. out. println(test=="java"+"and"+"python");
        System. out. println(test ==str1 + str2 + str3);

第一个true  第二个false就不讲了,第一个由于是字符串字面量进行+操作,编译阶段直接有一个 javaandpython的字符串再常量池中,而不是通过StringBuilder.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java在算法题中的输入问题实例详解

    Java在算法题中的输入问题实例详解

    在校招笔试中,有的时候我们要自己设计输入输出,所以下面这篇文章主要给大家介绍了关于Java在算法题中的输入问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java SE循环一些基本练习题总结

    Java SE循环一些基本练习题总结

    循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,下面这篇文章主要给大家总结介绍了关于Java SE循环一些基本练习题,需要的朋友可以参考下
    2024-03-03
  • 深入理解Java中的构造函数引用和方法引用

    深入理解Java中的构造函数引用和方法引用

    java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与相同,无返回值。方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。下面我们来详细了解一下它们吧
    2019-06-06
  • 如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    这篇文章主要介绍了如何解决SpringBoot2.x版本对Velocity模板不支持的方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Spring Data JPA的作用和用法小结

    Spring Data JPA的作用和用法小结

    Spring Data JPA是Spring框架的一个模块,它提供了一种数据访问抽象,允许以一种声明式和简洁的方式来处理数据库操作,本文主要介绍了Spring Data JPA的作用和用法小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • JAVA入门教学之快速搭建基本的springboot(从spring boot到spring cloud)

    JAVA入门教学之快速搭建基本的springboot(从spring boot到spring cloud)

    本文主要入门者介绍怎么搭建一个基础的springboot环境,本文通过图文并茂的形式给大家介绍从spring boot到spring cloud的完美搭建过程,适用java入门教学,需要的朋友可以参考下
    2021-02-02
  • Java代理模式实例分析

    Java代理模式实例分析

    这篇文章主要介绍了Java代理模式,结合实例形式对比分析了java代理模式的使用方法与相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • java核心编程之文件过滤类FileFilter和FilenameFilter

    java核心编程之文件过滤类FileFilter和FilenameFilter

    这篇文章主要为大家详细介绍了java文件过滤类FileFilter和FilenameFilter,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • SpringBoot项目中使用腾讯云发送短信的实现

    SpringBoot项目中使用腾讯云发送短信的实现

    本文主要介绍了SpringBoot项目中使用腾讯云发送短信的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java安全之Mojarra JSF反序列化讲解

    Java安全之Mojarra JSF反序列化讲解

    JSF 和类似的 Web 技术之间的区别在于 JSF 使用 ViewStates(除了会话)来存储视图的当前状态(例如,当前应该显示视图的哪些部分),这篇文章主要介绍了Java安全之Mojarra JSF反序列化知识讲解,包括漏洞复现和漏洞分析,需要的朋友可以参考下
    2022-11-11

最新评论