【Java】String类字符串的解析❤(下)

简介: 六、比较字符串的方法用法:代码图示:七、判断两个字符串地址是否相等StringBuilder和StringBuffer的区别

六、比较字符串的方法


我们在比较两个数字是否相同时,一般用的是==来判断,那么要比较两个字符串相等


用的是什么呢,答案是用equals。


==用来判断两个字符串的地址是否相同,相同返回true,不同返回false。


equals用来比较两个字符串的值是否相同,相同返回true,不同返回false。


用法:


public class String1 {
    public static void main(String[] args) {
        String s1="hello";
        String s2="world";
        String  s3= "helloworld";
        String s4=s1+s2;
        System.out.println(s7==s8);//0
        System.out.println(s3==s4);//比较两个字符串的地址是否相同
        System.out.println(s3.equals(s4));//比较两个字符串中的值是否相同
    }
}


代码图示:


微信图片_20220105183721.png


原因下文分析。

七、判断两个字符串地址是否相等


在字符串中,两个字符串相加可以的到一个新的字符串,这是我们知道的,但是地址会是


一样的吗


看下列代码:


public class String1 {
    public static void main(String[] args) {
        String s1="hello";
        String s2="world";
        String  s3= "helloworld";
        String s4=s1+s2;
        String s5="he"+"llo";
        String s6="hello"+"world";
        String s7="hello"+s2;
        String s8=s1+"world";
        System.out.println(s3==s6);//比较两个地址是否相同
        System.out.println(s1==s5);
        System.out.println(s3==s7);
        System.out.println(s3==s8); 
        System.out.println(s7==s8);
        System.out.println(s3==s4);
        System.out.println(s3.equals(s4));//比较两个字符串中的值是否相同
    }
}


我们仔细分析:


第一个:


   String  s3= "helloworld";
   String s6="hello"+"world";


s3首先在常量池中创建了一个helloworld的常量,s6是有两个新的字符串连接起来的,

这两个字符串常量创建新的字符串常量,存储在常量池中时,因为helloworld已经存在,

所以常量池就不会创建新的字符串了,直接把已经存在的s3地址赋值给s6,所以他们地址

相同。


第二个:


String s1="hello";
 String s5="he"+"llo";


这个分析和第一个一样,地址相同。


第三个:


  String s2="world";
String  s3= "helloworld";
String s7="hello"+s2;


s2在常量池中创建world,s3在常量池中创建helloworld,s7是由一个变量s2连接一


个新的字符串"world",首先会在常量池创建字符串"world",然后两者之间进行"+"


操作,根据字符串的串联规则,s7会在堆内存中创建StringBuilder(或StringBuffer)


对象,通过append方法拼接s2和字符串常量"world”,此时拼接成的字符

串"helloworld"


是StringBuilder(或StringBuffer)类型的对象,通过调用toString方法转成String对


象"helloworld",所以s7此时实际指向的是堆内存中的"helloworld"对象,堆内存中对


象的地址和常量池中对象的地址不一样。


StringBuilder和StringBuffer的区别


1.StringBuffer 对几乎所有的方法都实现了同步,线程比较安全,在多线程系统中可以保

证数据同步。


2.StringBuilder 没有实现同步,线程不安全,在多线程系统中不能使用 StringBuilder。


3.当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。


第四个:

 String s1="hello";
String  s3= "helloworld";
 String s8=s1+"world";


解释同上,重新简单的说一下,s3在先在常量池中创建helloworld,s8是由变量s1和常量


world加起来的,会先在常量池中创建world,然他他们现在之后会在堆内存中存在,所以


他们的地址不同。


微信图片_20220105184055.png


总结:一般带有变量的相加操作是在堆中创建的


第五个:


       String s1="hello";
        String s2="world";
        String s7="hello"+s2;
        String s8=s1+"world";


解释和上面有些相似之处,他们都是有变量加常量,所以他们都是在堆内存中创建的,


堆内存的地址是不会相同的。


第六个:


 String s1="hello";
  String s2="world";
 String  s3= "helloworld";
   String s4=s1+s2;


首先在常量池中创建唯一的常量,然后再,s4进行两个变量的相加操作,所生成的是在


堆内存中的,所以地址不同。

目录
相关文章
|
2月前
|
SQL JSON Java
告别字符串拼接:用Java文本块优雅处理多行字符串
告别字符串拼接:用Java文本块优雅处理多行字符串
355 108
|
4月前
|
SQL JSON Java
告别拼接噩梦:Java文本块让多行字符串更优雅
告别拼接噩梦:Java文本块让多行字符串更优雅
535 82
|
4月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
337 14
|
8月前
|
存储 缓存 安全
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
200 17
|
8月前
|
存储 缓存 安全
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
226 13
|
8月前
|
存储 设计模式 Java
重学Java基础篇—ThreadLocal深度解析与最佳实践
ThreadLocal 是一种实现线程隔离的机制,为每个线程创建独立变量副本,适用于数据库连接管理、用户会话信息存储等场景。
288 5
|
8月前
|
存储 监控 安全
重学Java基础篇—类的生命周期深度解析
本文全面解析了Java类的生命周期,涵盖加载、验证、准备、解析、初始化、使用及卸载七个关键阶段。通过分阶段执行机制详解(如加载阶段的触发条件与技术实现),结合方法调用机制、内存回收保护等使用阶段特性,以及卸载条件和特殊场景处理,帮助开发者深入理解JVM运作原理。同时,文章探讨了性能优化建议、典型异常处理及新一代JVM特性(如元空间与模块化系统)。总结中强调安全优先、延迟加载与动态扩展的设计思想,并提供开发建议与进阶方向,助力解决性能调优、内存泄漏排查及框架设计等问题。
377 5
|
8月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
503 3

热门文章

最新文章

推荐镜像

更多
  • DNS
  • 下一篇
    oss云网关配置