【Java入门到精通】String类字符串的解析
小职 2021-11-04 来源 :csdn 阅读 758 评论 0

摘要:本篇主要介绍了【Java入门到精通】String类字符串的解析,通过具体的内容展现,希望对Java开发的学习有一定的帮助。

本篇主要介绍了【Java入门到精通】String类字符串的解析,通过具体的内容展现,希望对Java开发的学习有一定的帮助。

【Java入门到精通】String类字符串的解析

一、前言

在java中,和C语言一样,也有关于字符串的定义,并且有他自己特有的功能,下面我们


一起来学习一下。


二、String类概述

string在软件包java.lang下,所以不需要导包。


String字符串是java中的重点,String 类表示字符串类 ,所有的字符串(如"adf")都属于


此类,也就是说有" "双引号括起来的都属于此类,


三、字符串的特点

字符串不可变,他们的值在创建之后不能被改变。


虽然String的值的不可变的,但是他们可以被共享。共享就是其他成员也可以拥有这个值,


字符串效果相当于数组(char[]),但是底层原理是字节数组(byte[])


jdk8以前是字符数组,jdk9以后是字节数组。


四、String 构造方法

public String()  //创建一个空白字符串对象,不含有任何内容。


public String(char[] ch)//根据字符数组的内容来创建字符对象。


public String (byte[] b)//根据字节数组的内容来创建字节对象。


String s=“abc”         //字节赋值的方式创建对象,内容就是abc。


图示: 

【Java入门到精通】String类字符串的解析


代码演示:

public class StringDemo {

    public static void main(String[] args) {

        String s1=new String();//创建空的字符串,其中不包括任何内容

        System.out.println("s1:"+s1);

        char[]chs={'a','b','c'};

        String s2=new String(chs);//给chs创建对象

        System.out.println("chs:"+s2);//输出ch:abc

        byte[]bys={97,98,99};

        String s3=new String(bys);

        System.out.println("bys:"+s3);//输出bys:abc,他会 转化成对应的Ascll码值

        String s4="abc";

        System.out.println("s4:"+s4);//输出s4:abc

    }

}

综上看,推荐使用直接赋值的方式得到字符串对象。


五、String类对象的特点

通过new创建的的字符串对象,每一次new都会申请一个内存空间,虽然内容一样,


但是地址不同


通过直接赋值的方式来创建对象,赋值相同的值,因为是常量在堆内存的常量池中,


进入常量池的规则是:如果常量池中没有这个常量,则在常量池中创建一个,如果有


,则把已经存在的常量地址赋值给他,所以创建不同的变量去接受相同的值,他的内容


是一样的,地址也是一样的 。


六、比较字符串的方法

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


用的是什么呢,答案是用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));//比较两个字符串中的值是否相同

    }

}

代码图示:

【Java入门到精通】String类字符串的解析


 原因下文分析。


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

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


看下列代码:


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,然他他们现在之后会在堆内存中存在,所以


他们的地址不同。

【Java入门到精通】String类字符串的解析



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


 第五个:


       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进行两个变量的相加操作,所生成的是在

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


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

【Java入门到精通】String类字符串的解析

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved