我们知道, 在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常量池.docx
java常量池分析.pdf
主要介绍了深入探索Java常量池,涉及静态常量池和运行时常量池的介绍,常量池的好处,8种基本数据类型的包装类和常量池等相关内容,具有一定参考价值,需要的朋友可以了解下。
主要介绍了JAVA 常量池的相关资料,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
面试中经常问道的常量池优化技术,Java中的常量值技术是为了方便快捷的创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果没有则创建一个,创建一个比引用一个要耗时),则在需要重复创建相等...
Java堆、栈和常量池——内存剖析
【Java面试题】对String常量池的理解
在Class文件结构中,头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,由于...
本篇文章给大家通过理论原理等方便彻底分析了Java常量池的相关知识,有兴趣的朋友阅读学习下吧。
主要介绍了Java 常量池的实例详解的相关资料,Java的常量池中包含了类、接口、方法、字符串等一系列常量值,需要的朋友可以参考下
主要介绍了探究Java常量本质及三种常量池(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
下面小编就为大家带来一篇浅谈java常量池。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构。 关于class文件常量池的部分可以参考之前的博文实例探索Class文件。 1...
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
Java内存分配之堆、栈和常量池 Java内存分配主要包括以下几个区域:1. 寄存器:我们在程序中无法控制2. 栈:存放基本类型的数据和对象的引用,但对象本身不
清楚的介绍了java中基本数据类型和引用数据类型在内存中的分配
详细的总结了java中在内存中创建的堆、栈、方法区、常量池的区别和用途
JVM常量池 Class常量池(静态常量池) 运行时常量池 字符串常量池(全局常量池) 包装类型缓存池 JVM常量池 Jvm常量池分为: Class常量池(静态常量池) 运行时常量池 字符串常量池(全局常量池) 包装类型缓存池 Class常量...
常量池专门用来用来存放常量的内存区域,常量池分为:静态常量池和运行时常量池; 静态常量池:*.class文件中的常量池,class文件中的常量池不仅仅包含字符串,数值字面量,还包含类、方法的信息,占用class...
很好的解释了Java中内存的分配,使用,和回收的一些过程,让我们在理解和开发是能够的心应手。