一.基本概念

①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. 安装redis-3.2.10单节点

    前段时间安装好的redis,今天用脚本安装的时候突然出现版本异常的问题,所以更新一篇为大家提供参考 本次安装在CentOS6.5,采用的redis-3.2.10,最新的redis-4.0.1安装同样适 ...

  2. Android:LinearLayout布局中Layout_weight的深刻理解

    首先看一下LinearLayout布局中Layout_weight属性的作用:它是用来分配属于空间的一个属性,你可以设置他的权重.很多人不知道剩余空间是个什么概念,下面我先来说说剩余空间. 看下面代码 ...

  3. 安装vmware exsi 6.0(自制虚拟服务器)

    安装准备:2枚U盘.每个U盘大于2G.或者1枚光盘外加一枚U盘. exsi是一个虚拟服务容器.是一个专门运行虚拟的服务器系统. 关于服务的要求.由于exsi是专业的虚拟服务容器.所以服务器要求比较苛刻 ...

  4. LeetCode - Course Schedule 解题报告

    以前从来没有写过解题报告,只是看到大肥羊河delta写过不少.最近想把写博客的节奏给带起来,所以就挑一个比较容易的题目练练手. 原题链接 https://leetcode.com/problems/c ...

  5. windows客户端远程访问linux下mysql方法

    windows客户端远程访问linux下mysql方法 1. 改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 &q ...

  6. python(三):函数

    一.函数.名称空间与作用域 1.函数的构成 python有三种层次的抽象:(1)程序可分成多个模块:(2)每个模块包含多条语句:(3)每条语句对对象进行操作.函数大致处于第二层.函数有它的定义格式.参 ...

  7. 《DSP using MATLAB》示例Example6.29

    代码: % The following funciton computes the filter % coefficients shown in Table 6.2 b = firpm(30, [0, ...

  8. Let’s Encrypt 将于 2018 年免费提供通配符证书

    旨在让每个网站都启用 HTTPS 加密的 Let's Encrypt CA 宣布将于 2018 年 1 月免费提供通配符证书(Wildcard certificate).通配符证书是一种可被多个子域使 ...

  9. Linux之 iostat 解读磁盘io

    1.iostat[oracle@orastb log]$ iostatLinux 3.10.0-327.el7.x86_64 (orastb.bonc.com.cn) 09/07/2017 _x86_ ...

  10. MyEclipse中将普通Java项目convert(转化)为Maven项目

    在MyEclipse10中将Maven项目转成普通Java项目后,想将Java项目转成Maven项目,结果一下子傻眼了.根本就没有攻略中提到的config标签.仔细一看,喵咪的,人家用的是Eclips ...