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[ ...
随机推荐
- Linux下定时任务Crontab的使用
使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令.例如系统管理员安排一个备份任务使其每天都运行 入门 # crontab –e 这样可以已编辑模式打开个人的cro ...
- IOS在Document目录下创建文件夹、保存、读取、以及删除文件
// 在Documents目录下创建一个名为LaunchImage的文件夹 NSString *path = [[NSHomeDirectory() stringByAppendingPathComp ...
- C的动态链表建立
运用到的函数为: 动态内存分配函数malloc() 比如:char *name=(char *)malloc(20); 相当与c++的new关键字 动态内存释放函数free ...
- 使用POI对excel进行操作生成二维数组
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Form表单如何传递List数组对象到后台的解决办法(转)
举例说明: [后台有一个对象 User 一个PhotoDo对象],结构如下: public class User{ private String username; private List&l ...
- 读取JSON文件并 排序,分组,
读取.json文件 public string GetFileJson(string filepath) { string json = string.Empty; using (FileStream ...
- mysql主从简单配置
第一步.配置主从,来自于博文 https://www.cnblogs.com/gl-developer/p/6170423.html 下面配置的步骤就直接复制了. 一.准备工作: 1.主从数据库版本最 ...
- springMVC+Mybatis的maven-web项目的pom.xml文件内容
pom.xml文件内容 <!-- 第一行是XML头,指定了该xml文档的版本和编码方式 --> <project xmlns="http://maven.apache.or ...
- SpringBoot RestFul集成Swagger2
一.依赖: <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swa ...
- bzoj 1257 [CQOI2007]余数之和——数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1257 \( n\%i = n - \left \lfloor n/i \right \rfl ...