java ==和=_Java ==和equals()的区别

前言

本篇文章讲的是从JVM角度比较==和equals的区别

一:** Java数据类型分类**

08445889bbb1

Paste_Image.png

1:基本数据类型

又称为原始数据类型,他们之间的比较应该使用(==),比较的是他们的值。

2:引用数据类型

当引用数据类型用(==)进行比较,比较的是他们在内存中的存放地址。

当复合数据类型之间进行equals比较时,这个方法的初始行为是比较对象在堆内存中的地址。

equals()方法是用来判断其他的对象是否和该对象相等.

//equals()方法在object类中定义如下:

public boolean equals(Object obj) {

return (this == obj);

}

但在一些诸如String,Integer,Date类中把Object中的这个方法覆盖了,作用被覆盖为比较内容是否相同。

// 比如在String类中如下:

public boolean equals(Object var1) {

if(this == var1) {

return true;

} else {

if(var1 instanceof String) {

String var2 = (String)var1;

int var3 = this.value.length;

if(var3 == var2.value.length) {

char[] var4 = this.value;

char[] var5 = var2.value;

for(int var6 = 0; var3-- != 0; ++var6) {

if(var4[var6] != var5[var6]) {

return false;

}

}

return true;

}

}

return false;

}

}

很明显,这是进行的内容比较,而已经不再是地址的比较。依次类推Math、Integer、Double等这些类都是重写了equals()方法的,从而进行的是内容的比较。当然,基本类型是进行值的比较。

二: String类的讨论

String a = "abc";

String b = "abc";

System.out.println(a == b);//true

输出true

说明:==在进行复合数据类型比较时,比较的是内存中的存放地址。因此a与b引用同一个String对象。

String b = "abc";

String c = new String("abc");

System.out.println(c == b);//false

System.out.println(c.equals(b));//true

输出:

false

true

说明:b,c分别引用了两个对象。显然,两者内容是相同的,因此equal返回true。第一个例子也一样。

三: 解释

String str1= "hello";

String str2= new String("hello");

String str3= str2;

首先看一张内存上述的内存分配图

08445889bbb1

Paste_Image.png

从图中可以发现每个String对象的内容实际是保存到堆内存中的,而且堆中的内容是相等的,但是对于str1和str2来说所指向的地址堆内存地址是不等的,所以尽管内容是相等的,但是地址值是不相等的

“==”是用来进行数值比较的,所以str1和str2比较不相等,因为str2和str3指向同一个内存地址所以str2和str3是相等的。所以“==”是用来进行地址值比较的。

5. 为什么Java中1000==1000为false而100==100为true?

Integer i1 = 100, i2 = 100;

System.out.println(i1 == i2);//true

Integer i3 = 1000, i4 = 1000;

System.out.println(i3 == i4);//fales

查看Integer.java类,会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。

看源码

private static class IntegerCache {

static final int low = -128;

static final int high;

static final Integer[] cache;

private IntegerCache() {

}

static {

int var0 = 127;

String var1 = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

int var2;

if(var1 != null) {

try {

var2 = Integer.parseInt(var1);

var2 = Math.max(var2, 127);

var0 = Math.min(var2, 2147483518);

} catch (NumberFormatException var4) {

;

}

}

high = var0;

cache = new Integer[high - -128 + 1];

var2 = -128;

for(int var3 = 0; var3 < cache.length; ++var3) {

cache[var3] = new Integer(var2++);

}

assert high >= 127;

}

}

所以例子中i1和i2指向了一个对象。因此100==100为true。

Demo地址

最后

不懂得地方欢迎私信我,我会在第一时间给予回复,如阅读中发现写错的地方,欢迎纠正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZOJ 3804 YY's Minions (简单模拟)

1 /*2 题意&#xff1a;一个矩阵中有 n*m个宠物&#xff0c;每一个宠物都有一个状态&#xff0c; 1醒着的&#xff0c;0睡着的3 X离开的&#xff01;如果这个宠物&#xff08;醒着的&#xff09;的周围醒着的个数>3 || <2它就会睡着&#xff0c;4 如果这个宠物&…

java接口方法实现_Java接口的简单定义与实现方法示例

本文实例讲述了Java接口的简单定义与实现方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1、接口是Java中最终要的概念&#xff0c;接口可以理解为一种特殊的类&#xff0c;里面全部是由全局常量和公共的抽象方法所组成。2、接口的格式:interface interfaceName{全…

NYOJ995硬币找零(简单dp)

1 /*2 题意&#xff1a;给你不同面额的硬币&#xff08;每种硬币无限多&#xff09;&#xff0c;需要找零的面值是T&#xff0c;用这些硬币进行找零&#xff0c;3 如果T恰好能被找零&#xff0c;输出最少需要的硬币的数目&#xff01;否则请输出剩下钱数最少的找零方案…

docker mysql命令大全_Docker命令大全

Docker run 命令docker run [OPTIONS] IMAGE [COMMAND] [ARG...]OPTIONS说明&#xff1a;-a stdin: 指定标准输入输出内容类型&#xff0c;可选 STDIN/STDOUT/STDERR 三项&#xff1b;-d: 后台运行容器&#xff0c;并返回容器ID&#xff1b;-i: 以交互模式运行容器&#xff0c;…

NYOJ 1023 还是回文(DP,花最少费用形成回文串)

1 /*2 题意&#xff1a;给出一串字符(全部是小写字母)&#xff0c;添加或删除一个字符&#xff0c;都会产生一定的花费。3 那么&#xff0c;将字符串变成回文串的最小花费是多少呢&#xff1f; 4 5 思路&#xff1a;如果一个字符串增加一个字符 x可以形成一个回文串…

java mapreduce教程_Java搭建MapReduce完成二次排序步骤

1、构建新的作业Configuration confgetConf();Job jobJob.getInstance(conf);job.setJarByClass(SortYearAndTemp2.class);2、设置输入输出目录Path inpathnew Path(conf.get("inpath"));Path outpathnew Path(conf.get("outpath"));FileInputFormat.addIn…

contentprovider java_创建Contentprovider,

创建Contentprovider:1. 创建一个provider----ExampleContentProvidera. 设计authority b. 设计path c.处理content URI IDs d.Content URI patterns)定义MIME Types(One of the required methods that you must implement for any provider.A method that youre expected to i…

hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)

1 /*2 题意&#xff1a;给出一个无向图&#xff0c;去掉一条权值最小边&#xff0c;使这个无向图不再连同&#xff01;3 4 tm太坑了...5 1,如果这个无向图开始就是一个非连通图&#xff0c;直接输出06 2&#xff0c;重边&#xff08;两个节点存在多条边&am…

poj1273Drainage Ditches

1 #include<iostream>2 /*3 题意&#xff1a;就是寻找从源点到汇点的最大流&#xff01;4 要注意的是每两个点的流量可能有多个&#xff0c;也就是说有重边&#xff0c;所以要把两个点的所有的流量都加起来5 就是这两个点之间的流量了&#xff0…

Java11.0.2怎么生成JRE_java环境变量配置,jdk13.0.1中没有jre解决办法

标签&#xff1a;完成后 回车 手动 完成 cmd 没有 alt span 环境变量配置java.Oracle中下载了最新的jdk13.0.1&#xff0c;安装之后发现没自动生成jre&#xff0c;导致环境变量配置一直不成功如果没有自动生成jre&#xff0c;需要手动生成jre手动生成办法&…

hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)

1 /*************************************************************************2 > File Name: j.cpp3 > Author: HJZ4 > Mail: 2570230521qq.com 5 > Created Time: 2014年08月28日 星期四 12时26分13秒6 ***********************************…

java二期_享学二期java架构师

前言-薇:itstudy01在我们工作和学习的过程中&#xff0c;Java线程我们或多或少的都会用到&#xff0c;但是在使用的过程上并不是很顺利&#xff0c;会遇到各种各样的坑&#xff0c;这里我通过讲解Thread类中的核心方法&#xff0c;以求重点掌握以下关键技术点&#xff1a;线程的…

poj3342Party at Hali-Bula(树形dp)

1 /*2 树形dp&#xff01;3 判重思路&#xff1a;4 当dp[v][0]dp[v][1]时&#xff0c;很自然&#xff0c;flag[u][0]必然是有两种方案的。flag[u][1]则不然&#xff0c;5 因为它只和dp[v][0]有关系。而若flag[v][0]不唯一时&#xff0c;则必然flag[u][1]也不唯一6 …

mysql django构架图_(一)Django项目架构介绍

项目的架构为&#xff1a;1、虚拟环境virtualenv安装Django2.1.3安装pymysql安装mysqlclient安装其他等2、项目结构为&#xff1a;应用APP&#xff1a;blog -- 管理博客account -- 管理用户注册/登录/等后台数据库&#xff1a;mysql路由分层及命名空间&#xff1a;根据应用进行…

poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)

LCA思想&#xff1a;http://www.cnblogs.com/hujunzheng/p/3945885.html 在求解最近公共祖先为问题上&#xff0c;用到的是Tarjan的思想&#xff0c;从根结点开始形成一棵深搜树&#xff0c;非常好的处理技巧就是在回溯到结点u的时候&#xff0c;u的子树已经遍历&#xff0c;这…

LCA算法的理解

LCA思想&#xff1a;在求解最近公共祖先为问题上&#xff0c;用到的是Tarjan的思想&#xff0c;从根结点开始形成一棵深搜树&#xff0c;非常好的处理技巧就是在回溯到结点u的时候&#xff0c;u的子树已经遍历&#xff0c;这时候才把u结点放入合并集合中&#xff0c; 这样u结点…

java连加密的mysql_Java 实现加密数据库连接

一、前言在很多项目中&#xff0c;数据库相关的配置文件内容都是以明文的形式展示的&#xff0c;这存在一定的安全隐患。在开发和维护项目时&#xff0c;不仅要关注项目的性能&#xff0c;同时也要注重其安全性。二、实现思路我们都知道项目启动时&#xff0c;Spring 容器会加载…

codeforces Gargari and Bishops(很好的暴力)

1 /*2 题意&#xff1a;给你一个n*n的格子&#xff0c;每一个格子都有一个数值&#xff01;将两只bishops放在某一个格子上&#xff0c;3 每一个bishop可以攻击对角线上的格子&#xff08;主对角线和者斜对角线&#xff09;&#xff0c;然后会获得格子上的4 数值&a…

java词汇速查手册_java 词汇表速查手册

Abstract class 抽象类:抽象类是不允许实例化的类&#xff0c;因此一般它需要被进行扩展继承。Abstract method 抽象方法:抽象方法即不包含任何功能代码的方法。Access modifier 访问控制修饰符:访问控制修饰符用来修饰Java中类、以及类的方法和变量的访问控制属性。Anonymous …

codeforces Gargari and Permutations(DAG+BFS)

1 /*2 题意&#xff1a;求出多个全排列的lcs&#xff01;3 思路&#xff1a;因为是全排列&#xff0c;所以每一行的每一个数字都不会重复&#xff0c;所以如果有每一个全排列的数字 i 都在数字 j的前面&#xff0c;那么i&#xff0c; j建立一条有向边&#xff01;4 …