`

String s =new String()分析堆与栈,是先定义S,还是先new string()

阅读更多
<转自http://marssuburbs.iteye.com/blog/1001547>

先定义S

1. String str1 = "abc"; 
  System.out.println(str1 == "abc"); 

步骤: 
1) 栈中开辟一块空间存放引用str1, 
2) String池中开辟一块空间,存放String常量"abc", 
3) 引用str1指向池中String常量"abc", 
4) str1所指代的地址即常量"abc"所在地址,输出为true 

2. String str2 = new String("abc"); 
  System.out.println(str2 == "abc"); 

步骤: 
1) 栈中开辟一块空间存放引用str2, 
2) 堆中开辟一块空间存放一个新建的String对象"abc", 
3) 引用str2指向堆中的新建的String对象"abc", 
4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false 

3. String str3 = new String("abc"); 
  System.out.println(str3 == str2); 

步骤: 
1) 栈中开辟一块空间存放引用str3, 
2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象, 
3) 引用str3指向另外新建的那个String对象 
4) str3和str2指向堆中不同的String对象,地址也不相同,输出为false 

4. String str4 = "a" + "b"; 
  System.out.println(str4 == "ab"); 

步骤: 
1) 栈中开辟一块空间存放引用str4, 
2) 根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"ab", 
3) 引用str4指向池中常量"ab", 
4) str4所指即池中常量"ab",输出为true 

5. final String s = "a"; 
  String str5 = s + "b"; 
  System.out.println(str5 == "ab"); 

步骤: 
同4 

6. String s1 = "a"; 
  String s2 = "b"; 
  String str6 = s1 + s2; 
  System.out.println(str6 == "ab"); 

步骤: 
1) 栈中开辟一块中间存放引用s1,s1指向池中String常量"a", 
2) 栈中开辟一块中间存放引用s2,s2指向池中String常量"b", 
3) 栈中开辟一块中间存放引用str5, 
4) s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象, 
5) 引用str6指向堆中(s1 + s2)所还原的新String对象, 
6) str6指向的对象在堆中,而常量"ab"在池中,输出为false 

7. String str7 = "abc".substring(0, 2); 
  
步骤: 
1) 栈中开辟一块空间存放引用str7, 
2) substring()方法还原一个新的String对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象, 
3) 引用str7指向堆中的新String对象, 

8. String str8 = "abc".toUpperCase(); 
  
步骤: 
1) 栈中开辟一块空间存放引用str6, 
2) toUpperCase()方法还原一个新的String对象"ABC",池中并未开辟新的空间存放String常量"ABC", 
3) 引用str8指向堆中的新String对象
分享到:
分享到:
评论

相关推荐

    String a="hello" String b="hello" a==b 返回true的问题分析

    //这种用new关键字定义的字符串,是在堆中分配空间的。而分配空间就是由new去完成的,由new去决定分配多大空间,并对空间初始化为字符串"hello world" 返回其在堆上的地址。 通过上面的原理,可以做如下实验: ...

    String对象创建问题

    当使用`new String()`构造函数创建`String`时,会在堆内存中创建一个新的对象。即使两个`new`操作的字符串值相同,它们也会分别创建独立的对象。例如: ```java String s3 = new String("hello"); String s4 = new ...

    Java堆和栈的区别

    而第二种是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令 str 指向”abc”,如果已经有”abc” 则直接令 str 指向“abc”。 在比较类里面的...

    Java中的堆和栈

    #### 四、堆与栈的区别 1. **生命周期**:栈内存中的变量在其定义的方法执行结束后就会被销毁;而堆内存中的对象直到没有引用指向它才会被垃圾回收。 2. **内存分配**:栈内存分配和释放速度快,而堆内存的分配涉及...

    String对象的内存分析

    本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...

    String和string区别以及string详解.doc

    标题与描述中提到的知识点是关于C#编程语言中`String`与`string`的区别,以及`string`类型的...通过以上分析,我们可以深入了解C#中`String`与`string`的区别及其使用细节,这对于提高代码质量和程序性能具有重要意义。

    String型的不可变性

    Java 把内存划分为两种:一种是栈(stack)内存,一种是堆(heap)内存。在函数中定义的一些基本类型的变量和对象的引用变量都在栈内存中分配。当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间...

    区别Java中堆与栈区别Java中堆与栈

    堆是一个运行时数据区,类的对象从中分配空间,通过new、newarray、anewarray 和 multianewarray 等指令建立,垃圾回收器会自动收走这些不再使用的数据。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉...

    Java中的堆和栈[定义].pdf

    堆是一个运行时数据区,用于存放由 new 创建的对象和数组。Java 虚拟机的自动垃圾回收器负责管理堆中的内存,垃圾回收器会自动收走不再使用的数据。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,...

    解析Java栈与堆

    转化为以下几个步骤:先定义一个名为str的对String类的对象引用变量,然后在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o的字符串值...

    java中int_char_string三种类型的相互转换

    Java 中 int、char、String 三种类型的相互转换详解 Java 作为一种静态类型语言,对变量的类型定义非常严格。然而,在实际开发中,我们经常需要在不同的类型之间进行转换以满足不同的需求。其中,int、char、String...

    java内存机制,分析堆和栈的存储特点.pdf

    Java内存机制主要包括堆内存(Heap)和栈内存(Stack)两个主要部分,它们各自具有不同的特点和作用。栈内存主要用于存储基本类型变量和对象的引用,而堆内存则用于存储对象实例。 首先,栈内存的分配是线性的,...

    深入了解java 中的String

    使用 `new` 关键字创建 `String` 对象时,虽然语法上看起来类似直接赋值的方式,但实际上是在堆内存中创建了一个新的 `String` 对象: ```java String s1 = new String("abc"); ``` 这种方式创建的字符串不会存放在...

    java中堆和栈的区别.pdf

    Java中堆和栈的区别 Java是一种面向对象的编程语言,它的内存管理机制是自动化的,程序员不需要手动地分配和释放内存。Java中堆和栈是两个重要的概念,它们都是Java用于在RAM中存放数据的地方。 栈(Stack)是一块...

    string中的常见问题

    本文将基于提供的代码片段深入探讨与 `String` 类型相关的几个关键概念,包括字符串常量池、字符串比较、以及 `new` 关键字在创建 `String` 对象时的影响。 #### 一、字符串常量池的理解 首先,我们需要理解字符串...

    Java 中的堆和栈.doc

    栈主要用于存储基本类型变量和对象的引用,而堆则是用于存储由`new`关键字创建的对象和数组。 栈内存的特点在于它的快速存取和自动管理。当在代码中定义一个局部变量时,Java会在栈中为这个变量分配内存。一旦超出...

    深入学习C++_String

    `CString`是MFC框架中定义的一个类,它提供了一些额外的功能,但通常不如`std::string`那么通用。 #### 二、boost字符串算法库 **2.1 boost字符串算法库导论** - **2.1.1 boost.algorithm.string是什么?** `...

    list转换成string数组

    - **数组长度**:当使用`new String[list.size()]`创建数组时,确保列表中的元素数量与数组长度一致,避免出现数组越界的问题。 - **性能考虑**:在转换过程中,尽量减少不必要的对象创建,尤其是当列表很大时,这...

    StringFormat的使用(扩展:网络地址)

    总之,`StringFormat`是Android开发中的强大工具,无论是格式化基本类型的数据,还是构建复杂的网络请求URL,都能提供极大的便利。同时,定义全局变量可以有效地管理和复用资源,提升代码的可读性和维护性。

    Android String字符串数组动态增加

    String[] newArray = new String[stringList.size()]; stringList.toArray(newArray); ``` 5. **更新UI**: 如果这个数组是用来更新UI元素(如ListView或RecyclerView),你需要重新加载适配器的数据并调用...

Global site tag (gtag.js) - Google Analytics