JavaSE 常用类(String类实例化的两种方式及内存结构)

本文详细解析Java中String的两种实例化方式,包括直接赋值与new关键字创建的区别,探讨其内存实现机制,以及字符串常量池的运作原理。同时,通过面试题深入理解字符串操作与内存分配的关系。

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

一:String实例化的方式一:

String实例化的方式:
方式一:通过字面量定义的方式(即直接赋值的方式);
方式二:通过new + 构造器的方式;

1.特性:

1.String声明为final的,不可继承的;
2.String实现了Serializable接口:表示字符串时支持序列化的;String实现了Comparable接口:表示String可以比较大小;
3.String 内部定义了final char[] value 用于存储字符串数据;
4.String:代表不可变的字符序列,简称 不可变性

  • 当字符串重新赋值时,需要重写指定区域内赋值,不能使用原有的value进行赋值。
  • 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能在原有的value上进行赋值。
  • 当调用string的replace()方法时,也必须重新指定内存区域赋值。不能在原有的value进行赋值。

5.通过字面量的方式(即:new的方式)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
6.字符串常量池中是不会存储相同内容的字符串的。(即不会在常量池中开辟两个空间存储相同的内容)

2.内存实现:

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

如果s1再赋值hello,则会重新在方法区开辟一个空间,s1指向这个空间的地址。而不是在它本身改变。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上是针对String实例化的第一种方式

二:String实例化的方式二:

1.内存实现:

我们先来看一道题;

在这里插入图片描述
这样既基本明白new一个String对象和直接通过赋值的方式创建String的区别。
理解了上面的图,则下面四道题便很简单。
在这里插入图片描述
扩展一下:
在面向对象中经常有创建对象时用到string
在这里插入图片描述
我们来分析一下这内存结构:

在这里插入图片描述

2.面试题:

String s = new String(“abc”);方式创爱对象,在内存中创建了几个对象?

两个:一个是在堆空间中new结构,另一个是在char[]对应的常量池中的数据:“abc”

第二个题:
在这里插入图片描述
根据此图的题,我们引入三个结论:

1.常量与变量的拼接在常量池中,并且常量池中不会存在相同的常量;

2.只要其中有一个变量,结果就在堆中

3.如果拼接的结果调用intern()方法;返回值就在常量池中;

第三道面试题:
在这里插入图片描述
这道题主要是考察值传递。
当传参的时候另一个str进栈指向test ok 然后随着函数被调用完毕,最上面的str便出栈,随意最后str仍然是good。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值