一.基本概念

①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()与==的更多相关文章

  1. Java常量池解析与字符串intern简介

    在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构. 关于class文件常量池的部分可以参考之前的博文 ...

  2. 基本数据类型的常量池与String类型常量池解析

    抛出样例: Integer a1  = new Integer(123);        Integer a2  = new Integer(123);        System.out.print ...

  3. 第46节:Java当中的常量池

    Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区. 程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方 ...

  4. 19、java内存分配 常量池详解

    在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...

  5. 【Java_基础】java中的常量池

    1.java常量池的介绍 java中的常量池,通常指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,各线程间共享该运行常量池. java常量池简介:java常量池中保存了一份在 ...

  6. Java中的常量池

    JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...

  7. 讲一讲Java的字符串常量池,看完你的思路就清晰了

    前言 很多朋友Java的字符串常量池的概念困扰了很长一段时间,最近研究了一下jvm指令码,终于对它有了大概的了解. 在展示案例前,我们需要先搞清楚一个概念,众所周知,jvm的内存模型由程序计数器.虚拟 ...

  8. Java堆/栈/常量池以及String的详细详解(转)------经典易懂系统

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  9. Java的Integer常量池和String常量池

    1.Integer的常量池 看下面一段代码: package cn.qlq.test; public class ArrayTest { public static void main(String[ ...

随机推荐

  1. Linux服务器运行环境搭建(二)——Redis数据库安装

    官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxv ...

  2. 全面进军javascript!

    前两天经过新华书店,进去转了转,又买了两本书.这次买的是<javascript学习指南>和<HTML5经典实例>(都是图灵动物系列,我已经有三本了*^_^*),其实我是想去买& ...

  3. BZOJ1412 ZJOI2009 狼和羊的故事 【网络流-最小割】

    BZOJ1412 ZJOI2009 狼和羊的故事 Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和 ...

  4. 错误:Authentication with old password no longer supported, use 4.1 style passwords.

    今天重新装了系统,mysql connector 使用了官网的最新版本(6.8.3). 启动项目出现标题中的错误.原因大家谷歌. 解决方法,使用低版本的 connector. 我使用的是 6.5.6 ...

  5. modsecurity3.0 nginx 安装

    备注: 使用的是modsecurity 3.0 的版本,也是nginx 官方推荐使用的,同时使用的是nginx 的dynamic module 1. 环境准备 https://github.com/S ...

  6. (QPS)TPS指标概述

    性能测试关注指标-TPS概述 一.TPS(Transaction per Second)定义 TPS是Transactions Per Second 的缩写,也就是事务数/秒.它是软件测试结果的测量单 ...

  7. php+ajax+jquery 定时刷新页面数据

    testajax.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  8. 『备忘录』elasticsearch 去重分页查询

    一开始数据结构设计的很复杂,又是父子关系又是嵌套关系,结果发现不能通过简单的查询得到想要的结果:比如一个商店只出现一件符合条件的商品,弄得查询语句就变成这样了 curl -XPOST http://l ...

  9. python2.7 + ubuntu14.4 + dlib19.7

    0.首先需要Cmake以及编译C++成python程序的工具 sudo apt-get install libboost-python-dev cmake 1.download dlib19.7 fr ...

  10. Mock&Spring集成

    Mock&Spring集成 常规Mock单元测试 请参考上一篇文档Mock mock框架的功能性对比 http://jmockit.github.io/MockingToolkitCompar ...