java中String到底存放在栈中还是堆中?

本文详细解析了Java中String对象的两种创建方式:使用new关键字和直接赋值,并对比了双等号(==)与equals方法的区别。强调了在比较String内容时,应使用equals方法而非==操作符。

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

第一种

String str = new String("helloworld");

new 的这种写法会在堆中创建对象,然后栈中保存堆中的地址

第二种

String str = "helloworld";

这种写法,会现在栈中创建一个引用变量 str,然后查找栈中有没有 “helloworld” 这个字符串,如果有,str 指向它,如果没有就会将 “helloworld” 存进栈,str 再指向它

== 以及 equals

所以我们在使用==时候比较的实际是栈中的值,满足下面的形式

String str1 = "a";
String str2 = "a";

但是不满足 equals,因为 equals 比的是真实 string 的值,所以对于下面 new 对象的形式我们应该用 equals 比较

String str1 = "a";
String str2 = new String("a");
String str3 = new String("a");

不管是 str1 和 str2 比较,还是 str2 和 str3 比较,都应该用 equals 方法

### Java的区别及用途 #### (Stack) 是一种后进先出的数据结构,在Java中主要用于存储方法调用过程中所需的信息。每当一个方法被执行时,一个新的帧会被压入顶,这个帧包含了该方法的局部变量表、操作数、动态链接返回地址等信息。由于的操作非常简单且高效,因此其访问速度较快。 - **生命周期短**:上的数据通常只存在于当前方法的执行期间,一旦方法结束,对应的帧就会弹出并释放资源。 - **线程私有**:每个线程都有自己独立的空间,不同线程之间的互不干扰[^1]。 ```java public void exampleMethod() { int localVariable = 10; // 局部变量存放在中 } ``` #### (Heap) 相对于而言,是一片较大的内存区域,主要用来存放由`new`关键字创建的对象实例以及数组。这些对象可以在整个应用运行周期内存在,并可被多个线程共享使用。为了防止内存泄漏,JVM提供了垃圾收集机制来自动清理不再使用的对象所占据的空间。 - **生命周期长**:相比于中的临时性数据,里的对象往往具有更持久的生命期,直到没有任何引用指向它为止才会被GC回收。 - **线程共享**:所有线程都可以访问同一份区内的对象,这使得多线程协作成为可能[^4]。 ```java class ExampleClass { String instanceField; public static void main(String[] args) { ExampleClass obj = new ExampleClass(); // 对象存放在中 obj.instanceField = "This is an object on the heap"; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

abcnull

您的打赏是我创作的动力之一

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

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

打赏作者

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

抵扣说明:

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

余额充值