JAVA-String 字符串以及String内存详解。

String 字符串

1 string概述

java.lang.String 类代表字符串,java程序中的所有字符串文字(如“abc”)都为此类对象。

  • 注意点:字符串内容是不会发生改变的,它的对象在创建后不能被更改
String name1 = "小孔";
String name2 = "你好";
 System.out.print(name1 + name2);//产生一个新的字符串"小孔你好"
String name3 = "大聪明";
  name3 = "小聪明";
  上面为两个字符串
    //2.使用new的方式来获取一个字符串对象
    //空参构造:可以获取一个空白的字符串对象
    String s2 = new String();
    System.out.println("@" + s2 + "!");//""

    //传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
    String s3 = new String("abc");
    System.out.println(s3);

    //传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
    //需求:我要修改字符串的内容。  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

    //传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
    //应用场景:以后在网络当中传输的数据其实都是字节信息
   //我们一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了。
    byte[] bytes = {97, 98, 99, 100};
    String s5 = new String(bytes);
    System.out.println(s5);//abcd

}

2 String内存图

直接赋值

  • 字符串存在堆内存里的字符串常量池(即 串池)并且有内存地址,通过等号将内存地址值赋给等号左边,如下图所示,s1和s2通过 地址值匹配对应的字符串。

  • 当执行到String s2 = "abc"时,会去串池里检查是否有"abc",如果有,会复用此时"abc"的地址值。此时s1和s2指向同一个地址值。

  • 当使用双引号直接复制时,系统会检查该字符串在串池中是否存在。如果不存在会创建新的地址空间,如果存在则复用。

在这里插入图片描述

new出来

  • 每new 一次会会在堆中开辟一小块空间

在这里插入图片描述

3字符串比较

== 比的是什么?

  • 基本数据类型比较的是具体的数据值

  • 引用数据类型比较的是地址值

//基本数据类型比较的是具体的数据值,如:
int a = 10;
int b = 20;
System.out.print(a==b);// false

========================================================
  
 //引用数据类型比较的是地址值,如:
 String s1 = new String("abc");
 String s2 = new String("abc");
System.out.print(s1==s2);// false
 String s1 = "abc";
 String s2 = "abc";
System.out.print(s1==s2);// true

============================================================
String s1 = new String("abc");//记录堆里面的地址值
 String s2 = "abc";// 记录串池中的地址值
System.out.print(s1==s2);// false
  • equals:比较内容完全一致才为true

  • equalsIgnoreCase:忽略大小写,如:a =A

  public static void main(String[] args) {
        //1.创建两个字符串对象
        String s1 = new String("abc");
        String s2 = "Abc";
    
    //2.==号比较
    //基本数据类型:比的是数据值
    //引用数据类型:比的是地址值
    System.out.println(s1 == s2);//false
    
     //3.比较字符串对象中的内容是否相等
    boolean result1 = s1.equals(s2);
    System.out.println(result1);// false

    //4.比较字符串对象中的内容是否相等,忽略大小写
    //1 一 壹 这不行
    //忽略大小写只能是英文状态下的a A
    boolean result2 = s1.equalsIgnoreCase(s2);
    System.out.println(result2);//true
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蔚一

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

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

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

打赏作者

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

抵扣说明:

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

余额充值