`

java堆与栈 java String分配内存空间(详解)转

    博客分类:
  • Java
 
阅读更多

栈内存

堆内存

基础类型,对象引用(堆内存地址

由new创建的对象和数组,

存取速度快

相对于栈内存较慢

数据大小声明周期必须确定

分配的内存由java虚拟机自动垃圾回收器管理。动态分配内存大小

共享特性

栈中如果有字符串,则直接引用

如果没有,开辟新的空间存入值

每new一次在堆内存中生成一个新的对象。

创建之后值可以改变

String类声明后则不可改变    

一、栈内存

基础类型int, short, long, byte, float, double, boolean, char和对象引用

栈的共享特性

String str1 = "abc"; 
String str2 = "abc"; 
System.out.println(str1==str2); //true

1、编译器先处理String str1 = "abc";它会在栈中创建一个变量为str1的引用,然后查找栈中是否有abc这个值,如果没找到,就将abc存放进来,然后将str1指向abc。

2、   接着处理String str2 = "abc";在创建完b的引用变量后,因为在栈中已经有abc这个值,便将str2直接指向abc。这样,就出现了str1与str2同时均指向abc的情况。

二、堆内存

new、newarray、anewarray和multianewarray等指令建立

  要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

三、  ==   内存地址比对

String str1 = "abc"; 
String str2 = "abc"; 
System.out.println(str1==str2); //true    str1
和str2同时指向 栈内存 中同一个内存空间

String str3 = "abc"; 
String str4 = new String("abc") ;

System.out.println(str3 == str4);    //flase str3值在栈内存中,str4值在堆内存中

String hello = "hello" ;

String hel = "hel" ;

String lo = "lo" ;

System.out.println(hello == "hel" + "lo") ; //true

//两个常量相加,先检测栈内存中是否有hello如有有,指向已有的栈中的hello空间

System.out.println(hello == "hel" + lo) ;   //flase

System.out.println(hello == hel + lo) ;     //flase

 //lo是在常量池中,不检查栈内存,在堆中产生一个新的hello

 四、  equals  值进行比对

 public boolean equals(Object anObject)

将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。

 String str5 = "abc"; 
String str6 = new String("abc") ;

System.out.println(str5.equals(str6));    //true   str5的值str6的值比对

 五、  intern    栈中值的内存地址

Public String intern()

当调用 intern 方法时

1、如果池已经包含一个等于此 String 对象的字符串(用equals(Object) 方法确定),则返回池中的字符串。

2、将此 String 对象添加到池中,并返回此 String 对象的引用。

String s7 = new String("abc") ;

String s8 = "abc" ;

System.out.println(s7 == s7.intern()) ;//flase

System.out.println(s8 == s7.intern() );//true

1.检查栈内存中有没有abc对象如果有

2.将s7指向pool中abc

分享到:
评论

相关推荐

    详解java堆和栈

    ### 详解Java堆和栈 #### 一、引言 在Java编程中,理解堆(Heap)和栈(Stack)的概念及其区别对于程序员来说至关重要。本文将深入剖析这两个概念,并探讨它们之间的差异以及如何影响程序的运行。 #### 二、Java...

    Java中堆内存和栈内存详解

    ### Java中堆内存和栈内存详解 #### 一、引言 在Java编程语言中,内存管理是一项核心技能。为了更好地理解和使用Java,必须清楚地了解堆内存与栈内存的区别及其工作原理。本文将深入探讨Java中堆内存与栈内存的概念...

    java内存空间详解

    ### Java内存空间详解 #### 一、Java内存机制概述 Java程序在运行过程中涉及的内存主要分为两大类:栈内存和堆内存。 1. **栈内存**:主要用于存储局部变量和对象的引用变量。栈内存的特点是先进后出,即先压入的...

    Java中堆内存和栈内存详解.doc

    ### Java中堆内存和栈内存详解 #### 一、引言 在Java编程语言中,内存管理是一项核心技能。为了更好地理解和使用Java,了解其内存分配机制至关重要。本文将详细介绍Java中的两种主要内存区域——堆内存(Heap ...

    java内存分配机制详解

    本文旨在详细介绍Java内存分配机制中的几个关键概念:寄存器、栈、堆、静态域、常量池及其在Java运行时环境中的角色与功能。 #### 二、Java内存分配机制概述 Java内存分配主要涉及以下几个区域: 1. **寄存器**:...

    java内存分配详解

    ### Java内存分配详解 #### 一、Java内存区域划分 Java程序在运行过程中涉及的内存主要分为两大类:栈内存和堆内存。 1. **栈内存**:主要用于存储局部变量,如基本数据类型变量(int、long、char等)以及对象的...

    Java堆,栈和常量池详解

    Java栈主要用于存储局部变量等数据结构,它是线程私有的,因此每个线程都有自己的独立栈空间。当一个线程创建时,其栈也随之创建;当线程结束时,其栈也会被销毁。Java栈的特点是先进后出(First In Last Out, FILO...

    详解java学习中堆与栈的内容

    ### 详解Java学习中堆与栈的内容 #### 一、引言 在Java学习过程中,堆(Heap)和栈(Stack)是两个非常重要的概念,它们对于理解Java内存管理机制至关重要。很多初学者在接触到这两个概念时往往感到困惑,本文将...

    Java中堆内存和栈内存详解文.pdf

    Java的内存分配策略与编译原理密切相关。静态存储分配在编译时就确定了存储空间,适用于没有可变数据结构和嵌套/递归结构的场景。栈式分配适用于生命周期短、生存期确定的变量,而堆式分配则适合于需要动态分配和...

    java堆、栈和常量池

    堆内存是Java中最主要的动态内存分配区域,用于存储通过`new`关键字创建的对象和数组。 - **对象存储**:通过`new`关键字创建的对象以及数组都存储在堆内存中。 - **引用变量**:在栈中定义的引用变量指向堆内存...

    java String 使用详解

    Java String 使用详解 Java String 使用详解是 Java 编程语言中最基础也是最重要的一部分,对于 Java 程序员来说,了解 String 类的使用方法是必不可少的。本文将详细介绍 Java String 的使用方法,包括 String ...

    java中堆与栈的区别

    ### Java中堆与栈的区别详解 #### 一、概述 在Java编程语言中,了解堆与栈的区别对于理解和管理程序的内存使用至关重要。本文将详细解释Java中的堆和栈的概念,以及它们之间的区别。 #### 二、Java堆 Java堆是...

    Java中堆和栈的区别

    ### Java中堆和栈的区别详解 #### 一、引言 在Java编程语言中,内存管理是一项非常重要的任务。为了确保程序的高效运行以及资源的有效利用,Java虚拟机(JVM)将内存划分为堆和栈两种类型。这两种内存区域各自承担着...

    附录:Java的内存分配

    ### Java的内存分配详解 #### 一、Java内存模型概览 Java的内存管理是Java程序性能的关键之一。为了确保程序高效稳定地运行,开发者必须理解Java如何管理和分配内存资源。Java程序的内存主要分为以下几个部分: -...

    JAVA内存溢出详解.doc

    - **调整JVM参数**:通过-Xms和-Xmx设置初始和最大堆大小,避免因内存分配不足导致的溢出。例如,可以尝试增大-Xms和-Xmx的值,如`-Xms512M -Xmx1024M`,并使用-Xloggc:gc.log开启GC日志,便于分析内存使用情况。 ...

    JVM内存分配与垃圾回收详解

    JVM 内存分配主要涉及到五个运行时数据区域:程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区。 1. 程序计数器:它是线程私有的,一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号...

    Java内存分配原理精讲

    ### Java内存分配原理精讲 #### 一、引言 Java作为一门广泛应用于企业级开发的语言,其内存管理和分配机制是其核心技术之一。本文旨在深入探讨Java内存分配的基本原理及其在不同内存区域的具体表现,帮助读者更好...

    创建string对象过程的内存分配:

    ### 创建string对象过程的内存分配详解 #### 一、引言 在Java中,`String` 类是最常用的数据类型之一,用于表示不可变的字符序列。`String` 对象的创建涉及复杂的内存分配机制,特别是在Java虚拟机 (JVM) 的环境中...

Global site tag (gtag.js) - Google Analytics