`
itace
  • 浏览: 178330 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java内存堆、栈、常量池

    博客分类:
  • java
 
阅读更多

 

1. 栈:存放基本类型的变量对象的引用
2. 堆:存放所有new出来的对象(new String("abc");)

3. 常量池:存放字符串常量基本类型的常量(public static final)

 

String s = new String(“abc”);如果常量池中没有abc对象(有则不创建),则创建一个abc对象,然后堆中再创建一个常量池中abc对象的拷贝对象。
s存在中,abc存在中,abc也存在常量池

 

jdk1.6之前运行时常量池是方法区的一部分,jdk1.7之后被转移到了堆内存中(来源)

 

String a = "abc";
String b = new String("abc");
System.out.println(a==b);//false,b有两个地址
System.out.println(a==b.intern());//true
//intern - 返回字符串在常量池的引用(有则返回引用,没有建一个返回)
String a1 = new String("123");
String a2 = new String("123");
System.out.println(a1==a2);//false
String a3 = "123";
String a4 = "123";
System.out.println(a3==a4);//true

 



 

 DEMO

		int i1 = 1000;
		Integer i2 = 1000;
		Integer i3 = new Integer(1000);
		Integer i4 = Integer.valueOf(1000);// This method will always cache values in the range -128 to 127,
		
		System.out.println(i1==i2);//true
		System.out.println(i1==i3);//true
		System.out.println(i1==i4);//true
		System.out.println(i2==i3);//false
		System.out.println(i2==i4);//true:100换成1000=false,可以理解为>127时,i4指向了常量池
		System.out.println(i3==i4);//false
		
		System.out.println("----------------------------");
		
		String s1 = "abc";
		String s2 = "abc";
		String s3 = new String("abc");
		String s4 = new String("abc");
		String s5 = new String("abc").intern();
		String s6 = String.valueOf("abc");
		String s7 = new String("abc").toString();//s6和s7相似,结果一样
		System.out.println(s1==s2);//true
		System.out.println(s3==s4);//false
		System.out.println(s1==s5);//true
		System.out.println(s3==s5);//false
		System.out.println(s1==s6);//true
		System.out.println(s3==s6);//false
		System.out.println(s5==s6);//true

 

 This method will always cache values in the range -128 to 127, inclusive, and may cache other values outside of this range. 

 

		Integer a1 = 200;
		Integer a2 = 200;
		Integer a3 = 100;
		Integer a4 = 100;
		System.out.println(a1==a2);//false
		System.out.println(a3==a4);//true
		System.out.println(a1>a3);//true

 扩展阅读:java8中基本数据类型的封装类的自动装箱拆箱

  • 大小: 24 KB
分享到:
评论

相关推荐

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

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

    Java堆、栈和常量池——内存剖析

    ### Java堆、栈和常量池——内存剖析 #### 寄存器 寄存器作为最快的存储区域之一,由编译器自动管理分配与回收,它位于CPU内,用于存储临时变量,例如局部变量和一些操作数。由于寄存器的数量有限且由编译器自动...

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

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

    Java堆,栈和常量池详解

    在深入探讨Java中的堆、栈以及常量池之前,我们先来简要回顾一下Java内存模型的基本概念。Java程序运行时会使用到不同的内存区域来存储各种类型的数据,这些区域包括:寄存器、虚拟机栈、本地方法栈、Java堆、方法区...

    java堆、栈和常量池

    ### Java堆、栈和常量池详解 #### 一、Java内存模型概述 Java程序运行时,内存可以分为几个不同的区域: 1. **寄存器**:这部分内存由硬件直接支持,程序无法直接控制。 2. **栈**:用于存储基本类型的数据和对象...

    java堆栈常量池笔记

    Java 内存模型是理解Java程序运行机制的关键部分,它...总的来说,Java内存分配的核心在于栈内存的快速访问、堆内存的动态分配以及常量池的共享机制。理解这些概念对于调试程序、优化性能以及预防内存问题至关重要。

    java堆-栈-堆栈常量池的区别,史上最全总结

    常量池是Java内存模型中的一个重要组成部分,它存储字符串常量和基本类型的final常量。在编译阶段,所有的字符串文字会被放入常量池,以实现对象的共享,从而节省内存和提高运行效率。比较字符串时,使用`==`会检查...

    Java中的堆、栈和常量池_.docx

    在Java中,内存被划分为几个不同的区域,包括堆、栈、常量池和寄存器等。下面我们将详细讨论这些概念。 1. 寄存器: 寄存器是计算机硬件的一部分,用于快速访问数据。在Java中,寄存器由编译器根据需要自动分配和...

    Java堆、栈和常量池

    Java编程语言中的内存管理是通过堆、栈和常量池三个关键区域来实现的,这些区域各有其特定的用途和特点。 首先,寄存器是最快的存储区,它由编译器自动分配和管理,程序员无法直接控制。寄存器主要用于存储运算过程...

    详解java堆和栈

    1. **直接赋值**:如 `String str = "abc"`,此时会在字符串常量池中查找是否存在 `"abc"` 的字符串对象,如果不存在,则创建;如果存在,则直接使用。 2. **使用new关键字**:如 `String str = new String("abc")`...

    Java 中的堆和栈

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

    Java String 字符串常量池解析

    Java 中的字符串常量池是一种为了提高性能和减少内存开销的机制。它是 JVM 实例化字符串常量时进行的一些优化,主要是为了减少字符串对象的创建和存储。 字符串常量池的设计思想是基于字符串是不可变的这个特点,...

    java内存机制 堆和栈.doc

    总的来说,理解Java内存机制的堆和栈有助于编写更高效、更稳定的代码。正确地管理内存可以避免性能瓶颈和内存溢出问题,而深入理解对象创建和引用的工作方式则有助于优化程序设计,尤其是在处理大量对象或复杂数据...

    java 虚拟机 内存和栈 分析工具 ha456.rar

    Java内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)五大部分: 1. **堆**:Java对象主要存储在堆中,它是所有线程共享的一块区域。...

    java中的栈(深层了解java虚拟机对对象的内存分布)

    ### 深层解析Java虚拟机中的栈与堆:对象的内存分布 #### 核心概念:栈与堆的本质及作用 在Java编程语言中,理解栈(stack)和堆(heap)的概念及其工作原理对于深入掌握Java虚拟机(JVM)如何管理内存至关重要。栈和堆...

    深入Java核心 Java内存分配原理精讲

    本文将聚焦于Java内存分配的核心概念,包括栈、堆、常量池等关键区域的功能与使用场景,帮助读者深入理解Java内存管理的内在逻辑。 ### 一、Java内存模型概述 Java内存模型主要包括以下几个部分: 1. **寄存器**...

    Java数据结构之栈与堆

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

    关于Java栈与堆的思考

    2. 在字符串常量池中查找是否存在值为"abc"的字符串,若不存在则创建一个新的`String`对象,并将字符串值"abc"放入常量池,若存在则直接返回该字符串的引用。 3. 将变量`str`指向这个`String`对象的引用。 这种方式...

    java内存分配情况

    Java内存分配主要涉及五个区域:寄存器、栈、堆、静态域和常量池。在Java编程中,理解这些内存区域的分配规则对于优化代码性能和避免内存泄漏至关重要。 1. **寄存器**:这是最快捷的存储区域,但不在Java程序员的...

    string常量池和intern_韩雅茹Java系列2021.pdf

    字符串常量池和intern 字符串常量池是Java语言中的一种机制,旨在...在Java中,字符串常量池的使用可以提高性能和减少内存开销。Java提供了两种创建字符串对象的方式,可以根据实际情况选择合适的方式创建字符串对象。

Global site tag (gtag.js) - Google Analytics