我们知道, 在java中,对象的比较要用equals,对于下面这段代码:
public class EqualsTest {
public static void main(String[] args) {
String a = "a";
String b = "a";
System.out.println("a == b ? " + (a == b));
}
}
输出结果为:
a == b ? true
对于下面这段代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a = "a";
String b = in.nextLine();
System.out.println("a == b ? " + (a == b));
}
}
运行时输入a后回车, 输出的结果为:
a == b ? false
Java中有常量池的概念。编译器编译时对代码做一定的优化。比如,在编译期能够确定的字符串,
如果不同的字符串对象拥有相同的字面量,则会将这样的字符串对象指向同一个个字符串对址。
这就是为会么在第一段代码中输出结果为true.
对于编译期不能确定的字符串常量,如第二段代码中的b, 编译器无法优化。所以,即使用户输入的
的与变量a相同字面量的"a",输出结果也是false,即a!=b, 但a.equals(b).
其实,常量池不光字符串有。有以下代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 1;
Integer b = 1;
System.out.println("a == b ? " + (a == b));
}
}
输出结果为:
a == b ? true
如果换成以下:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
Integer e = -128;
Integer f = -128;
Integer g = -129;
Integer h = -129;
System.out.println("a == b ? " + (a == b));
System.out.println("c == d ? " + (c == d));
System.out.println("e == f ? " + (e == f));
System.out.println("g == h ? " + (g == h));
}
}
输出结果为:
a == b ? true
c == d ? false
e == f ? true
g == h ? false
再看以下代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 127;
Integer b = in.nextInt();
System.out.println("a == b ? " + (a == b));
}
}
输入127, 输出结果为:a == b ? true
首先,运行a == b 时,并没有发生unbox,确实是两个对象在比较。
由程序可以看出,Integer也有池,大小为[-128, 128).
但是对于new 出来的对象,不管表示的值相不相等,用==来判断都是不相等的,如
Integer a = new Integer(1);
Integer b = new Integer(1);
些时的a == b 为false;
分享到:
相关推荐
Java常量池是Java编程语言中的一个重要概念,它在JVM(Java虚拟机)的运行时数据区中占据着核心地位。常量池是每个类或接口在编译时都会生成的一部分,它存储了各种类型的常量,包括字面量(如字符串、整数、浮点数...
详解JAVA 常量池 JAVA 常量池是JAVA语言中的一种机制,用于存储常量...JAVA常量池是JAVA语言中的一种重要机制,用于存储常量和符号信息。它可以帮助开发者更好地理解JAVA语言的工作机制,并且可以提高编程效率和性能。
详解Java常量池.docx
深入探索Java常量池 Java常量池是Java虚拟机(JVM)中一个非常重要的概念,它主要分为两种:静态常量池和运行时常量池。静态常量池是class文件中的常量池,包括字符串(数字)字面值、类和方法的信息,占用了class...
Java常量池是Java编程语言中的一个重要概念,它涉及到JVM(Java虚拟机)的内存管理,特别是关于字符串和类的加载。常量池在Java中分为两种形态:静态常量池和运行时常量池。 静态常量池是存在于`.class`文件中的,...
### Java堆、栈和常量池——内存剖析 #### 寄存器 寄存器作为最快的存储区域之一,由编译器自动管理分配与回收,它位于CPU内,用于存储临时变量,例如局部变量和一些操作数。由于寄存器的数量有限且由编译器自动...
【Java面试题】对String常量池的理解
Java常量池是一种内存管理机制,它在Java虚拟机(JVM)中扮演着重要的角色。常量池主要存储程序中的常量,如字符串字面量、符号引用等,其目的是为了提高内存效率和程序执行速度。下面我们将深入探讨Java常量池的...
在Class文件结构中,头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,由于...
"探究Java常量本质及三种常量池" Java中的常量池是Java虚拟机(JVM)中的一种机制,用于存储编译期常量和运行期常量。常量池是JVM中的一种重要机制,它可以将常量存储在内存中,并提供快速的访问和共享机制。 Java...
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
主要介绍了Java 常量池的实例详解的相关资料,Java的常量池中包含了类、接口、方法、字符串等一系列常量值,需要的朋友可以参考下
在Java中,内存主要分为四个区域:寄存器、栈、堆和方法区(包括常量池)。以下是这四个区域的详细说明: 1. **寄存器**: 这是计算机硬件的一部分,用于存储非常快速访问的数据。在Java中,寄存器主要由JVM直接管理...
在Java内存管理中,堆(Heap)、栈(Stack)、常量池(Constant Pool)和方法区(Method Area)是四个核心概念,它们在Java程序运行时扮演着不同的角色。 首先,方法区是用来存放类的信息、常量、静态变量等数据的...
在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构。 关于class文件常量池的部分可以参考之前的博文实例探索Class文件。 1...
### Java堆、栈和常量池详解 #### Java内存模型概览 在深入探讨Java中的堆、栈以及常量池之前,我们先来简要回顾一下Java内存模型的基本概念。Java程序运行时会使用到不同的内存区域来存储各种类型的数据,这些...
在Java编程语言中,字符串常量池(String Constant Pool)是一个重要的概念,它与程序的内存管理和性能优化密切相关。理解这个概念对于任何Java开发者来说都至关重要。字符串常量池是Java虚拟机(JVM)在运行时为...
常量池分为静态常量池、运行时常量池、字符串常量池和整型常量池。静态常量池存在于每个*.class文件中,包含了字面量和符号引用,这部分在类加载的链接阶段会被解析成直接引用。运行时常量池则是在虚拟机运行时载入...