`

java 堆 栈

 
阅读更多
由String看Java堆栈问题,包括==以及equal()。
首先看代码:
1
Java代码 复制代码 收藏代码java 堆 栈 - 依米 - 菜鸟,努力!
public class TestString {  
    public static void main(String[] args) {  
        String a0 = "abc";  
        String b0 = "abc";  
        if (a0 == b0) {  
            System.out.print("==");  
        } else {  
            System.out.print("!=");  
        }  
    }  


执行结果为:
==
2
Java代码 复制代码 收藏代码java 堆 栈 - 依米 - 菜鸟,努力!
public class TestString {  
    public static void main(String[] args) {  
        String a0 = String.valueOf("abc");  
        String b0 = String.valueOf("abc");  
        if (a0 == b0) {  
            System.out.print("==");  
        } else {  
            System.out.print("!=");  
        }  
    }  



执行结果为:
==
3
Java代码 复制代码 收藏代码java 堆 栈 - 依米 - 菜鸟,努力!
public class TestString {  
    public static void main(String[] args) {  
        String a0 = "abc"+"def";  
        String b0 = "abcdef";  
        if(a0==b0){  
            System.out.print("==");  
        }else{  
            System.out.print("!=");  
        }  
    }  

执行结果为:
==
4
Java代码 复制代码 收藏代码java 堆 栈 - 依米 - 菜鸟,努力!
public class TestString {  
    public static void main(String[] args) {  
                  String a0 = "abc";  
        String b0 = "def";  
        String c0 = "abcdef";  
        String d0 = a0 + b0;  
        if (c0 == d0) {  
            System.out.print("==");  
        } else {  
            System.out.print("!=");  
        }  
    }  

执行结果为:
!=
5
Java代码 复制代码 收藏代码java 堆 栈 - 依米 - 菜鸟,努力!
public class TestString {  
    public static void main(String[] args) {  
        String a0 = new String("abc");  
        String b0 = new String("abc");  
        if (a0 == b0) {  
            System.out.print("==");  
        } else {  
            System.out.print("!=");  
        }  
    }  


执行结果为:
!=
6
Java代码 复制代码 收藏代码java 堆 栈 - 依米 - 菜鸟,努力!
public class TestString {  
 
    public static void main(String[] args) {  
 
        String a0 = String.valueOf("abc")+String.valueOf("def");  
        String b0 = String.valueOf("abcdef");  
 
        if (a0 == b0) {  
            System.out.print("==");  
        } else {  
            System.out.print("!=");  
        }  
    }  
 


执行结果为:
!=
我们的都知道,Java的内存分配策略:栈中存放基本数据类型(或者叫内置类型)以及引用类型(或者叫对象句柄),而堆中存放对象数据。
String很特殊,根据Think In Java介绍:“通过编译器和特殊的覆盖或过载运算符+和+=,可将引号字符串转换成一个String”。可见引号字符串本身并不是一个String,而是通过运算符的重载转换成了String。注意:没有=号。
故此:我们要问,引号字符串通过重载以后转换成String存在于什么位置?
查询网上没有具体的分析,书籍上也没有准确的说明。
根据执行结果猜想:
学习过类加载可能知道,有个常量区。
暂且假设将此部分数据存放于此空间中,看能否得到合理的解释。
Java的内存分配栈中存放两种类型数据:
1、基本数据类型:此处疑问?存放的是具体的数据还是也是一个内存地址。
假设1:栈中存放的是具体的数据,当然所有出现在基本类型的操作均可以解释。
假设2:数据存放于上边提到的常量区,而栈中存放的是此常量区对应数据的地址。所有基本数据类型操作似乎也可以解释。
其实Java设计师们很注重内存的利用,我们可能看见很多文章曾提到这样一个概念,当int n =1;时,Java会在内存中搜索,看有没有1的存在,假如有的话,则不会重新分配空间建立1,如果没有的话,则会建立1,假如int m=1;则Java不会再建立1的空间。可见似乎内存中存在一个存放数据的地方。如果用次观点解释假设2完全成立。
现在以下的结论均在假设2下展开。
2、引用类型:栈中存放的是对象的引用,此引用是通过new创建的对象在对中分配的地址。
现在分析String。
属于什么类型?基本数据类型、引用类型。
当作为String str = "abc";建立时,作为基本类型的假设2合理一些(参见第1部分代码)。
当作为String str = new String("abc");建立时,毫无疑问作为引用类型处理(参见第5部分代码)。
我们暂且将+作为一种Java特殊的处理机制,当它处理引号字符串时不会采用new方式建立String(即像"abc"+"def"),而对于栈中数据处理时会采用new方式建立String(即像a+b)。(参见第3、4、6部分代码)。
当作为String str = String.valueOf("abc");建立或者执行+时,完全可以解释通过。
其实String.valueOf()可以看做是对"abc"的封装,但不是new的(参见第2、6部分代码)。
其实现在要是按照以上的观点,可以得出这样一种结论:
栈中存放的是句柄,包括基本数据类型。内存中存在另外一块区域(常量区),存放基本数据类型数据以及引号字符串数据。
堆中存放的是对象,且必须是new的或者通过+运算符的重载隐式new的。
乱想了一通,与一些理论违背,因为好多东西解释不通,所以胡思乱想了。
欢迎评论,谢谢。
分享到:
评论

相关推荐

    java 内存中 堆、栈、常量池、方法区的总结

    在Java内存管理中,堆(Heap)、栈(Stack)、常量池(Constant Pool)和方法区(Method Area)是四个核心概念,它们在Java程序运行时扮演着不同的角色。 首先,方法区是用来存放类的信息、常量、静态变量等数据的...

    Java堆和栈的区别

    "Java 堆和栈的区别" Java 堆和栈是 Java 中的两种内存管理机制,它们都是 Java 用来在 RAM 中存放数据的地方。但是,它们有很多不同之处。 Java 堆是一个运行时数据区,类的对象从中分配空间。这些对象通过 new、...

    java内存分配之常量池,栈,堆1

    在Java中,内存主要分为四个区域:寄存器、栈、堆和方法区(包括常量池)。以下是这四个区域的详细说明: 1. **寄存器**: 这是计算机硬件的一部分,用于存储非常快速访问的数据。在Java中,寄存器主要由JVM直接管理...

    Java中的堆和栈

    ### Java中的堆和栈 #### 一、概述 在Java编程语言中,内存管理是非常重要的一个概念。Java程序运行时的内存主要分为两大区域:**堆内存**和**栈内存**。这两种内存区域有着各自独特的用途和管理机制,对理解和...

    详解java堆和栈

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

    Java中堆内存与栈内存分配浅析

    ### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...

    Java 中的堆和栈

    在Java中,内存主要分为两个区域:栈内存和堆内存。这两部分内存各自有不同的特点和用途。 首先,栈内存主要负责存储基础数据类型(如byte, short, int, long, float, double, boolean, char)和对象的引用。当在...

    关于Java栈与堆的思考

    关于Java栈与堆的深入解析 Java作为一种广泛使用的编程语言,其内存管理机制是学习者必须掌握的核心概念之一。在Java中,栈(Stack)与堆(Heap)是用于存储数据的主要区域,它们各自承担着不同的职责,对于理解...

    Java中栈内存和堆内存详解

    Java中栈内存和堆内存详解,非常容易理解

    解析Java栈与堆

    Java栈与堆的存储机制解析 Java栈和堆是Java语言中两个最基本的存储机制,它们都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 1. 栈的存储机制: 栈的优势是...

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

    Java 中堆与栈的区别 Java 中的堆和栈是两个不同的内存区域,分别用于存放不同类型的数据。堆是一个运行时数据区,类的对象从中分配空间,通过new、newarray、anewarray 和 multianewarray 等指令建立,垃圾回收器...

    Java 中的堆和栈.doc

    Java编程语言将内存划分为两种主要区域:栈内存和堆内存。栈主要用于存储基本类型变量和对象的引用,而堆则是用于存储由`new`关键字创建的对象和数组。 栈内存的特点在于它的快速存取和自动管理。当在代码中定义一...

    关于Java栈与堆的思考-

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    JAVA中堆和栈的概念

    声明变量是在栈空间开辟了一个位置,实例化之后才会开辟一个堆空间 被赋予空值的话则是将栈空间地址指向一个新的堆空间位置

    java 栈和堆,Java自动管理栈和堆

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    区别Java中的堆与栈

    标题:“区别Java中的堆与栈” 描述:本文深入探讨了Java中堆和栈的基本概念、工作原理以及它们之间的显著差异,特别关注了它们在资源管理、性能表现和内存分配策略上的不同。 ### Java中的堆(Heap) Java的堆是...

    Java中堆内存和栈内存详解

    ### Java中堆内存和栈内存详解 #### 一、引言 Java作为一种广泛使用的编程语言,其内存管理机制是理解程序行为的关键。本文将深入探讨Java中的两种主要内存区域:堆内存(Heap Memory)和栈内存(Stack Memory)。...

    Java数据结构之栈与堆

    Java 数据结构中的栈和堆是两种重要的内存管理方式,它们在程序执行时分别扮演着不同的角色。栈主要负责存储程序运行过程中的局部变量、函数调用等信息,而堆则是用于动态分配对象内存的区域。 栈的优势在于其存取...

Global site tag (gtag.js) - Google Analytics