Java-从堆栈常量池解析equals()与==
一.基本概念
①JAVA中的基本数据类型(简单类型,内置类型):
字节型(byte),短整型(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度型(double),布尔型(boolean);注意都是小写的,没有String类型,String类型不是Java中的基本数据类型。
②变量类型(按变量的作用域区分):
全局变量,成员变量,局部变量。
③堆:
存放所有new出来的对象,该对象的引用存在栈中,当栈中的引用消失后堆中的对象的由垃圾回收器负责回收。
④栈:
存放基本类型的变量的引用和其他对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。
⑤常量池:
存放字符串常量和基本类型常量(final修饰的在编译期间就能够确定的并被保存在已编译的.class文件中的一些数据)。
package cn.edu.whu.compare;
public class CompareTest {
public static void main(String[] args) {
// "ab"存在常量池中,a指向常量池中"ab"的地址
String a = "ab";
// “b”存在常量池中
final String bb = "b";
String cc = "b";
String b = "a" + bb;
String c = "a" + cc;
/**
* 变量b的值在编译就可以确定指向常量池中“ab”的地址, 因为bb使用了final修饰并且bb指向确定的字符串
* 变量c的值只有在运行时才能确定,变量c相当于在运行时new了一个String对象,这个新对象存储在堆中
*/
System.out.println(bb == cc);// true
System.out.println(a == b); // true
/**
* a指向“ab”在常量池中"ab"的地址 c指向在运行时创建的对象“ab”在堆中的地址
* c.intern()返回一个String对象,这个String对象指向--->c指向的对象“ab”在常量池中的地址
*/
System.out.println(a == c); // false
System.out.println(a == c.intern()); // true
}
}
二.equals()与==的区别
①关于==操作符
此操作符比较两个对象(上实例中的各种变量名,常量名)在栈中的值(是一个内存地址,该地址存了实际的对象的内容),如果值相等则返回True,否则返回False
②Object类定义的equals方法:
public boolean equals(Object obj) {
return (this == obj);
}
即:Object类的equals是直接通过==比较两个对象的内存地址,那么也就是说任何继承自Object类的子类如果不重写equals方法那么其实equals与==两种比较方法结果是一样的。
③String类定义的equals方法
public boolean equals(Object anObject) {
//当两个比较对象的内存地址相同时就不用在比较了直接返回true,因为内存地址都相等了,存的东西肯定一样啊!!
if (this == anObject) {
return true;
}
//比较字符串中的每一个字符,只有每一个字符值都相等那么两个对象才equals
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
参照上面注释所讲的,多余的不解释了。
版权所有,转载请注明出处!
Java-从堆栈常量池解析equals()与==的更多相关文章
- Java常量池解析与字符串intern简介
在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构. 关于class文件常量池的部分可以参考之前的博文 ...
- 基本数据类型的常量池与String类型常量池解析
抛出样例: Integer a1 = new Integer(123); Integer a2 = new Integer(123); System.out.print ...
- 第46节:Java当中的常量池
Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区. 程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方 ...
- 19、java内存分配 常量池详解
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
- 【Java_基础】java中的常量池
1.java常量池的介绍 java中的常量池,通常指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,各线程间共享该运行常量池. java常量池简介:java常量池中保存了一份在 ...
- Java中的常量池
JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...
- 讲一讲Java的字符串常量池,看完你的思路就清晰了
前言 很多朋友Java的字符串常量池的概念困扰了很长一段时间,最近研究了一下jvm指令码,终于对它有了大概的了解. 在展示案例前,我们需要先搞清楚一个概念,众所周知,jvm的内存模型由程序计数器.虚拟 ...
- Java堆/栈/常量池以及String的详细详解(转)------经典易懂系统
一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...
- Java的Integer常量池和String常量池
1.Integer的常量池 看下面一段代码: package cn.qlq.test; public class ArrayTest { public static void main(String[ ...
随机推荐
- (转) 从windows XP到10的微软官方操作系统虚拟机镜像,即下即用,不用安装
原文地址: https://blog.csdn.net/tool321_com/article/details/50707512 最近在帮朋友安装虚拟机,遇到了这么一个东西,感觉比较不错,分享如下: ...
- vim 强大复制链接
参考文献: http://blog.csdn.net/xiyuan1999/article/details/5680102 vi编辑器中的整行(多行)复制与粘贴就非常必要了. 1.复制 1)单行复制 ...
- python中读取文件的f.seek()方法
用于二进制文件中F.seek方法 作用: 设置读写位置 F.seek(偏移量, whence=相对位置) 偏移量 大于0的数代表向文件末尾方向移动的字节数 小于0的数代表向文件头方向中移动的字节数 相 ...
- git版本管理工具的使用
Git的一些资料 --关于git的介绍就此忽略了--- Git官网http://git-scm.com/ Visual Studio Tools for Git下载地址https://visualst ...
- Java项目中使用Log4J
Log4J下载 官网:http://logging.apache.org/log4j/ Log4J 1.2下载地址:http://logging.apache.org/log4j/1.2/downlo ...
- python 除法
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法
在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论 ...
- github上对一些名词的理解(之如fork)
fork: Fork 的本义是 叉子(名词) . 比较自然的引申成 分叉(动词) ,就像上面叉子,从左到从右,一条线变成多条了. Git/GitHub 用户下面的图 来表达 Fork:分叉.克隆 出一 ...
- hessian协议原理
Hessian 原理分析 一. 远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . t ...