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中基本数据类型的封装类的自动装箱拆箱
相关推荐
在Java中,内存主要分为四个区域:寄存器、栈、堆和方法区(包括常量池)。以下是这四个区域的详细说明: 1. **寄存器**: 这是计算机硬件的一部分,用于存储非常快速访问的数据。在Java中,寄存器主要由JVM直接管理...
在Java内存管理中,堆(Heap)、栈(Stack)、常量池(Constant Pool)和方法区(Method Area)是四个核心概念,它们在Java程序运行时扮演着不同的角色。 首先,方法区是用来存放类的信息、常量、静态变量等数据的...
### Java堆、栈和常量池——内存剖析 #### 寄存器 寄存器作为最快的存储区域之一,由编译器自动管理分配与回收,它位于CPU内,用于存储临时变量,例如局部变量和一些操作数。由于寄存器的数量有限且由编译器自动...
在深入探讨Java中的堆、栈以及常量池之前,我们先来简要回顾一下Java内存模型的基本概念。Java程序运行时会使用到不同的内存区域来存储各种类型的数据,这些区域包括:寄存器、虚拟机栈、本地方法栈、Java堆、方法区...
### Java堆、栈和常量池详解 #### 一、Java内存模型概述 Java程序运行时,内存可以分为几个不同的区域: 1. **寄存器**:这部分内存由硬件直接支持,程序无法直接控制。 2. **栈**:用于存储基本类型的数据和对象...
常量池是Java内存模型中的一个重要组成部分,它存储字符串常量和基本类型的final常量。在编译阶段,所有的字符串文字会被放入常量池,以实现对象的共享,从而节省内存和提高运行效率。比较字符串时,使用`==`会检查...
在Java中,内存被划分为几个不同的区域,包括堆、栈、常量池和寄存器等。下面我们将详细讨论这些概念。 1. 寄存器: 寄存器是计算机硬件的一部分,用于快速访问数据。在Java中,寄存器由编译器根据需要自动分配和...
Java编程语言中的内存管理是通过堆、栈和常量池三个关键区域来实现的,这些区域各有其特定的用途和特点。 首先,寄存器是最快的存储区,它由编译器自动分配和管理,程序员无法直接控制。寄存器主要用于存储运算过程...
1. **直接赋值**:如 `String str = "abc"`,此时会在字符串常量池中查找是否存在 `"abc"` 的字符串对象,如果不存在,则创建;如果存在,则直接使用。 2. **使用new关键字**:如 `String str = new String("abc")`...
在Java中,内存主要分为两个区域:栈内存和堆内存。这两部分内存各自有不同的特点和用途。 首先,栈内存主要负责存储基础数据类型(如byte, short, int, long, float, double, boolean, char)和对象的引用。当在...
Java 中的字符串常量池是一种为了提高性能和减少内存开销的机制。它是 JVM 实例化字符串常量时进行的一些优化,主要是为了减少字符串对象的创建和存储。 字符串常量池的设计思想是基于字符串是不可变的这个特点,...
总的来说,理解Java内存机制的堆和栈有助于编写更高效、更稳定的代码。正确地管理内存可以避免性能瓶颈和内存溢出问题,而深入理解对象创建和引用的工作方式则有助于优化程序设计,尤其是在处理大量对象或复杂数据...
Java内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)五大部分: 1. **堆**:Java对象主要存储在堆中,它是所有线程共享的一块区域。...
### 深层解析Java虚拟机中的栈与堆:对象的内存分布 #### 核心概念:栈与堆的本质及作用 在Java编程语言中,理解栈(stack)和堆(heap)的概念及其工作原理对于深入掌握Java虚拟机(JVM)如何管理内存至关重要。栈和堆...
本文将聚焦于Java内存分配的核心概念,包括栈、堆、常量池等关键区域的功能与使用场景,帮助读者深入理解Java内存管理的内在逻辑。 ### 一、Java内存模型概述 Java内存模型主要包括以下几个部分: 1. **寄存器**...
Java 数据结构中的栈和堆是两种重要的内存管理方式,它们在程序执行时分别扮演着不同的角色。栈主要负责存储程序运行过程中的局部变量、函数调用等信息,而堆则是用于动态分配对象内存的区域。 栈的优势在于其存取...
2. 在字符串常量池中查找是否存在值为"abc"的字符串,若不存在则创建一个新的`String`对象,并将字符串值"abc"放入常量池,若存在则直接返回该字符串的引用。 3. 将变量`str`指向这个`String`对象的引用。 这种方式...
Java内存分配主要涉及五个区域:寄存器、栈、堆、静态域和常量池。在Java编程中,理解这些内存区域的分配规则对于优化代码性能和避免内存泄漏至关重要。 1. **寄存器**:这是最快捷的存储区域,但不在Java程序员的...
字符串常量池和intern 字符串常量池是Java语言中的一种机制,旨在...在Java中,字符串常量池的使用可以提高性能和减少内存开销。Java提供了两种创建字符串对象的方式,可以根据实际情况选择合适的方式创建字符串对象。