String类型

本文探讨了Java中String类型的存储机制,指出无论通过哪种方式创建,相同值的String最终都会指向方法区常量池中的同一地址。通过源码分析揭示String实际上是char数组,并讨论了试图修改String值时遇到的挑战,包括String的final属性和内部数组的private final修饰。通过反射机制,展示了如何实际修改String对象的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String类型

String的存储机制的理解

1.1#创建String的两种常用方法有和区别
String s1="jiang";
String s2="jiang"
System.out.println(s1==s2);//true
String s3=new String("jiang");
String s4=new String("jiang");
System.out.println(s3==s1);//false
System.out.println(s4==s3);//false

在这里插入图片描述

所以说其实String类型的值最后都会存储在方法区的常量池中.

S1==s2;//true;

原因他们直接从常量池中取值,地址直接指向同一块空间,所以他们在栈中的地址相等.

S3==s1;//false
s4==s3;//false

此处==比较地址,s3和s4是new 出来的值存于堆中,他们字面量是指向堆空间对象的地址.指向对象不同,值自然也不同,不过两者对象里存储的value都是指向常量池中的同一个String的地址.

结论

​ 只要值相同String类型最终都会指向在常量池中的那个值;

1.2 String类型的进一步理解(源码)

我们来看看创建一个String类型到底String类是怎么实现的(建议配合idea自己跟着点进去看源码).

String s1=new String("nore");//创建一个String类型数据
//此处进入String类,他是一个final类.当使用上述方法创建String对象是调用这个构造器
public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
//源码写的很清楚,valus是用来存储字符的
/** The value is used for character storage. */
    private final char value[];

所以String类型本质上是一个char数组类型.

1.3 #对1.1的结论的验证

验证1.1的结论:只要我们修改其中一个的值其他三个一起改变了,就可以说明他们本质上指向的一个值;

验证1.1的结论有几个难处:

  • String是final修饰的
  • 一旦更改一个s的值,并不会真正更改,而是创建了一个新的String;
  • String的本质上是的数组,但那个数组是private final修饰的;

这里就用到java的反射机制了,不多说,上代码…

System.out.println("----修改value[]-----");
        //获取String的类对象
        Class<? extends String> Class1=s1.getClass();
        //获取String value 属性
        Field field=Class1.getDeclaredField("value");
        //设置访问权限
        field.setAccessible(true);
        //获取value的值
        char[] v=(char[]) field.get(s1);
        System.out.println("v的长度"+v.length);
        v[0]='x';

这样就修改号了,可以试一试.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值