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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 六、比较字符串的方法用法:代码图示:七、判断两个字符串地址是否相等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进行两个变量的相加操作,所生成的是在


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

目录
相关文章
|
26天前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
110 65
|
8天前
|
索引 Python
String(字符串)
String(字符串)。
13 3
|
26天前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
40 1
|
29天前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
37 4
|
1月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
24 2
|
1月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
33 5
|
1月前
|
IDE Java 开发工具
Java“未封闭的 String 表达式”怎么解决
要解决Java中的“未封闭的 String 表示”问题,需检查并修正字符串字面量,确保每个字符串被正确地用双引号括起来。若字符串跨越多行,可使用字符串连接操作符(+)或引入文本块(JDK 13 及以上版本)。这能帮助避免语法错误,并使代码更整洁易读。
|
1月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
25 2
|
1月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
34 4
|
1月前
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
43 3

推荐镜像

更多