java基础学习 day31(字符串,“+”操作,字符串的内存分析)

文章详细阐述了Java中字符串操作的细节,包括“+”作为字符串连接符的用法,字符串的不可变性,以及不同方式创建String对象的内存影响。字符串连接会自动转换不同类型的数据,如布尔值和变量。String类在java.lang包中,无需额外导入。创建String对象时,直接赋值会利用字符串池可能实现复用,而使用new始终会在堆内存中创建新对象,可能导致内存浪费。
摘要由CSDN通过智能技术生成

1. 字符串的“+”操作
注意点:

  • 当“+”操作临近的前后出现字符串时,这个“+”是字符串连接符,而不是算术运算符。他会将前后的数据进行拼接,并产生一个新的字符串。
  • 当进行连续“+”操作时,从左到右逐个执行

例如:
System.out.println(“abc” + true);//“abctrue”

  • 此时的true是一个布尔类型的常量值,所以可以直接和abc进行拼接(就相当于数字13),产生一个新的字符串“abctrue”

int age = 18;
System.out.println(“我的年龄是” + age + “岁”);
//“我的年龄是18岁”

  • 此时的age是一个变量,在执行“+”操作时,会将变量里的值拿出来,用拿出来的值进行拼接操作。

System.out.println(“我的年龄是” + “age” +“岁”);
//“我的年龄是age岁”

  • 而此时的“age”是字符串“age”,并没有存储什么值,所以在进行“+”操作时,是直接进行拼接操作

System.out.println(1 + 2 + “abc” + 2 + 1);
//“3abc21”

2. 字符串的注意事项

  • String是java定义好的一个类。定义在java.lang包中,因为java.lang包是java的核心包,使用的时候不需要导包,所以String类使用的时候也不需要导包。
  • java程序中的所有字符串文字(例如“abcdefg”),都为String类的对象。
  • 字符串不可变,它们的值在创建后不能被更改
    例如:String name = “尼古拉斯阿伟”; //创建一个字符串“尼古拉斯阿伟”,并把它赋值给name变量
    name = “尼古拉斯凯奇”; //创建一个新的字符串“尼古拉斯凯奇”,再把它赋值给name变量,并没有改变“尼古拉斯阿伟”这个字符串里面的内容。所以在这个过程中,一共产生两个字符串。
  • 字符串也有索引,与数组类似,也是从0开始到字符串长度-1结束

3. 创建String对象

  • 直接赋值
    String s1 = “abc”;
    System.out.println(s1);//abc

  • 使用new的方式来获取一个字符串对象

a.空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println(“@” + s2 + “!”);//@!

b. 传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象,就有两个相同的字符串对象,多此一举了。
String s3 = new String(“abc”);
System.out.println(s3);

c. 传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
//应用场景:需要修改字符串的内容,正常来说字符串的内容不能更改,但可以采用这种方法间接修改。
//例如:abc --> Qbc
//可以:abc --> {‘a’,‘b’,‘c’} --> {‘Q’,‘b’,‘c’} --> “Qbc”

Char【】 chs = {‘a’,‘b’,‘c’,‘d’};
String s4 = new String(chs);
System.out.println(s4);//abcd

d. 传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象,即先拿字节数组里的数字去ASCII码表里查对应的字符,再进行拼接
//应用场景:以后在网络当中传输的数据都是字节信息(ascii码),我们需要把字节信息进行转换,转成字符串,就要用到这个构造了

byte【】 bytes = {97,98,99,100};
String s5 = new String(bytes);
System.out.println(s5);//abcd

4. 创建字符串的内存分析

  • 当使用双引号直接赋值时,系统会检查该字符串在串池(StringTable)中是否存在。
    若不存在:在串池中,创建新的字符串对象
    若存在:复用,即用这个存在的字符串对象
    特点:支持复用,节省内存空间,代码简单。

注意:StringTable(串池)在JDK7版本开始,从方法区挪到了堆内存中。

如图:
在这里插入图片描述

  • 当使用new关键字,来获取一个字符串对象时,每new一次,就会在堆内存中开辟一片新空间。
    特点:不支持复用,若相同字符串比较多,会浪费内存空间

如图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丿罗小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值