java中的:++、--、==、equals

java中++深度解析 在上节我们提到了java中的运算符++,这节中我们继续深究它。还是上节课中的例子答案是10;原因我们知道是产生的出一个临时量,假设是tmp,运算步骤是这样的tmp = i;i++;j=tmp。那他在内部到底是怎么运行的,为什么是上述步骤那 ?我们用反汇编来试一下0:bipush          10把常量放入操作数栈中,此时栈里面只有10一个元素2:istore_1把操作数栈顶元素的10,存储到... 阅读详情

本篇主要来说说java中的这几个经常令人头疼的运算符和函数:- -,++,== ,equals

++与–

1、先来看++与- -
代码注释中已经写的很清楚了,这里就不在解释

public static void test1(){
        //++i是先i自加1,然后在使用i的值
        //i++是先用i的值,在i自加1
        int i =1;
        System.out.println(++i);  //  2    ++i,是先i自加1,然后在使用i的值,1+1=2,用i的值就是输出时用了,于是2
        System.out.println(i++);  //  2    i++,是先用i的值,用,这里体现为输出,先输出2,输出过后i再自加1
        System.out.println(i);    //  3
        System.out.println(--i);  //  2    同上
        System.out.println(i--);  //  2
        System.out.println(i);    //  1

        // 可以大概的理解为后缀+与后缀-是整行代码都运行过之后再在自行加或减,在整行代码运行时,取的都是未进行后加或后减之前的值
    }

== 与equals

2、再来看看 == 与equals
首先要说明 == 在判断的时候分为两种情况,基本类型和引用类型
2.1、 == 在比较两个基本类型的时候,比较的是他们的值
2.2、 而 == 在比较两个引用类型的时候,比较的是引用所指向的对象的地址值。所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
看一段代码

		Integer i1= new Integer(1);
        Integer i2= new Integer(1);
        System.out.println(i1==i2);   // false
        System.out.println(i1.equals(i2));  //  true 

        String s1=new String("a");
        String s2=new String("a");
        System.out.println(s1==s2);        // false
        System.out.println(s1.equals(s2)); // true

以上代码中,Integer 为引用类型,于是i1i2,比较的是对象的地址值,new了两个Integer对象,每new一个对象,就会在堆中给该对象分配一个地址,这两个对象的地址值当然是不同的,所以是false。String 为引用类型,于是s1s2,比较的也是对象的地址值,当然还是false。
注意:new Integer()创建的整型不是常量,不能在编译期就确定,所以new Integer()创建的整型不放入常量池中,它们有自己的地址空间

下面咱们再来看看equals:
java中的所有类都继承自Object这个类,那么,equals方法也是从object类中继承过来的,Object中的equals函数的源码,使用的也是==

public boolean equals(Object var1) {
        return this == var1;
}

那么问题就来了,既然都是继承的Object,那么equals也是从Object继承来的,使用的是==,==在比较引用类型的时候比价的是地址值,那么下面的带码中比较的也是地址值,因该是false才对,为什么是true呢?

 System.out.println(i1.equals(i2));  //  true 
 System.out.println(s1.equals(s2)); // true

答案就是,String和Integer类中的equals被重写了,他们不再是用== 来比较了
string类中的equalse源码:又判断是否是同一个对象,又是各种转换,总之一句话,equals已经被重写了,被重写后比较的是对象中的内容是否相同,于是对象中的内容都是a,当然返回的是true了。小伙伴们有兴趣了,也可以自己定义个类,然后在类中重写equals方法。

public boolean equals(Object var1) {
        if (this == var1) {  // 如果传进来的var1与this(本对象)是同一个对象那么肯定相同:调用代码的时候是a.equals(b)这里的this值的就是a
            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;
        }
    }

Integer类中的equals源代码:
这代码倒是干脆的很,直接从对象中取值来比较了,所以Integer中的equals重写后也是比较的对象的内容,于是i1.equals(i2)当然是true了,因为他们对应的对象中的值都是1

 public boolean equals(Object var1) {
        if (var1 instanceof Integer) {
            return this.value == (Integer)var1;
        } else {
            return false;
        }
    }

下面再来看一个例子

		String s3="abc";
        String s4="abc";
        System.out.println(s3==s4);   // true
        System.out.println(s3.equals(s4)); // true

== 比较引用类型是,比较的是对象的地址值,为啥第1个是true呢?
这就涉及到了内存中的常量池,常量池属于方法区的一部分,当运行到s3创建对象时,如果常量池中没有,就在常量池中创建一个对象”abc”,第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。

而

String str1 = new String("abc");

这里其实创建了两次对象,依次是在常量池中创建了对象”abc”,一次是在堆内存中创建了对象str1,所以str1和str2的地址值不相等。
然后比较的时候比较的是堆内存中的地址值,所以不相等。

/////////////////////////////////////////////////////////////////////////////

integer

附:下面来说说Integer

关于Integer,有些特殊,Integer 的取值范围,对于-128到127之间的数,他会进行缓存,于是当i5进行127的时候,它会到缓存中找到已经存在这个对象了,然后i5就引向这个对象的地址值 了,== 在进行引用比较的时候比较的是地址值,于是,i5与i4相等(他们指向了同一个地址值)。
而i6和i7则不同,128不会进行缓存,于是当i7=128的时候,它不会去缓存中找这个值是否存在,它会重新new一个,于是又是另一个对象,他们的地址值当然不同,== 在比较引用对象的时候是比的地址值。于是当然不相等。

 Integer i4 = 127;
        Integer i5 = 127;
        System.out.println(i4 == i5);  // true
        Integer i6 = 128;
        Integer i7 = 128;
        System.out.println(i6 == i7);// false

        Integer i8=126;
        Integer i9=126;
        System.out.println(i8==i9);//true
java,-=,*=,/=表达式的执行 int i = 7; // i-= 3+2; //7-(3+2)=2 // i -= 3 - 2; //7-(3-2)=6 // i -= 3 - (2L == 2L ? 1 : 3); //7-(3-1)=5 // i*= 3+2; //7*(3+2)=35 // i /= 3 - 2; //7/... 阅读详情

相关推荐

加密视频如何破解 如何解除机器码绑定的视频

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 如何破解加密...

Q-980767270的博客 5万+

Java之++--运算符

1,++运算符表示自加1,只要运算结束变量自加1; 2,无=号时,++可以在变量前,也可以在变量后,是单目运算符; 3,有=号时,++在变量后,先做赋值运算再对变量中的值加1;++在变量前,先做自加1运算,然后操作赋值运算; public class Test01 { public static void main(String[] args) { int i=10; i++; System.out.println("i值是:"+i); int j=20; j++; System.

m0_67266787的博客 6942

均匀分布产生高斯分布

均匀分布产生高斯分布 文章目录均匀分布产生高斯分布简介方法和证明代码效果引用 简介 方法和证明 代码 效果 引用

gy_Rick的博客 5317

java ==是什么意思_java-=是什么意思

展开全部1、自减运算符,如:a-=b,等价于a=a-b。2、int i = 1; int sum = 0; sum = sum + i。3、Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还e5a48de588b662616964757a686964616f31333365646235摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特...

weixin_29375669的博客 1579

5分钟搞定Conflux钱包注册:Fluent钱包从安装到转账全流程指南

本文提供Conflux公链上Fluent钱包的完整注册和使用指南,涵盖从安装、助记词备份到CFX转账的全流程。特别强调安全操作要点,包括助记词保管和网络选择,帮助用户5分钟内快速掌握这款国产公链钱包的核心功能,确保数字资产安全。

weixin_29181861的博客 243

第五章 PCIe介绍 5.1-5.7

为什么SSD要用PCIe接口?因为它快,比SATA快。通道,PCIe最多可以有32个通道。两个设备之间的PCIe连接,叫做一个Link。如下图,设备A和设备B是个双向连接,两个PCIe设备之间,有专门的发送和接收通道,数据可以同时往两个方向传输,PCIe Spec称这种工作模式为,可以理解为。和PCIe一样,SATA有独立的发送和接收通道。但与PCIe工作模式不一样,同一时间,SATA只有一条通道可以进行数据传输。这种工作模式称为。与SATA单通道不同,PCIe连接可以通过增加通道数扩展带宽。

fengbaobaola的博客 2967

Java运算符

逻辑运算符,操作的都是boolean类型的变量或常量,而且运算得结果也是boolean类型的值。​ || :如果符号左边是true,则不再继续执行符号右边的操作。运算规则:在一定范围内,数据每向左移动一位,相当于原数据*2。不同点:& : 如果符号左边是false,则继续执行符号右边的操作。不同点:| : 如果符号左边是true,则继续执行符号右边的操作。相同点:如果符号左边是false,则二者都执行符号右边的操作。相同点:如果符号左边是true,则二者都执行符号右边的操作。

淼淼不暴躁! 1791

mapbox进阶,百度地图、高德地图纠偏,使用在线网络地图加载插件

本文详细介绍如何基于mapbox-gl v3.8.0版本百度地图、高德地图纠偏,使用在线网络地图加载插件,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 748

equals和hashCode详解

在学习的过程中,特别是学习集合的时候,equals和hashCode一直是经常出现的方法,而且在面试题中,也经常出现equals和==的区别等问题,现在我们就从底层详细的了解一下equals和hashCode这两个方法。 1、概述 首先我们要 equals 和 hashCode 两个方法属于 Object 基类的方法: public boolean equals(Object obj) { return (this == obj); } ​ public native int has...

博客 1万+

Unreal5从入门到精通之初学者碰到解决不了的问题怎么办?

在学习Unreal的过程中,你曾陷入困境了吗?对于我来说,这种情况发生得比我愿意承认的要多得多。幸运的是,除了一般地在网上搜索之外,还有很多地方可以获得虚幻引擎的帮助。

TxNet 977

斗鱼直播间弹幕爬虫实战:WebSocket连接与实时数据采集

在数据驱动的时代,直播平台的弹幕数据蕴含着巨大的价值——用户行为分析、舆情监控、弹幕情感分析、直播热度评估等应用场景层出不穷。斗鱼作为国内领先的直播平台,其弹幕系统基于WebSocket协议实现实时双向通信。本文将带您从零开始,使用Python构建一个完整的斗鱼直播间弹幕爬虫系统。

2201_76125261的博客 133

Java中equals()方法重写,零基础入门到精通,收藏这篇就够了

1.对象内容的比较,需要使用equals()方法,若是对于已经重写该方法的类,例如String类,就无需再重写;若是没有重写,例如自定义的User类,就需要重写。2.Java语言中的“==”对于基本数据类型就是比较其值,而对于对象就是比较对象的引用。

leah126的博客 1091

面试问题总结——关于OpenCV(一)

整理了一下网上和我面试中遇到的关于OpenCV相关的问题。 其中因为我的简历中有个项目用到了特征点检测相关的知识,所以整理了SIFT/SURF和FLANN。 有些知识点也不深入,对于写的不对的地方,欢迎指正。 关于OpenCV的内容 1.OpenCV中cv::Mat的深拷贝和浅拷贝问题   深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。   浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。 OpenCV的Mat时,有几种赋值方式分别为:   深.

boss-dog 1万+

java的equals方法_在Java中编写完美的equals方法

相对于C++,Java并没有重载操作符,所以对于非基本类型都需要使用equals方法比较相等性.Object提供了equals方法比较两个对象,但对于用户自定义类而言Object提供的版本仅仅比较两个对象的引用是否相同,这在很多情况下并不符合程序的意思,例如JDK中就重写了很多equals方法覆盖Object的版本,以达到库文件编写者真正要表达的相等性比较方式.对于用户自定义类而言,如果需要编写e...

weixin_28717683的博客 705

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

在Java中编写完美的equals方法

相对于C++,Java并没有重载操作符,所以对于非基本类型都需要使用equals方法比较相等性.Object提供了equals方法比较两个对象,但对于用户自定义类而言Object提供的版本仅仅比较两个对象的引用是否相同,这在很多情况下并不符合程序的意思,例如JDK中就重写了很多equals方法覆盖Object的版本,以达到库文件编写者真正要表达的相等性比较方式. 对于用户自定义类而言,如果需

aiyinsitan的专栏 503

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java中的equals函数与==的关系

记得这是一次淘宝面试时的题目,当时的我对java一窍不通。 我估计那个面试官对C++与java区分得不太好。因为我清楚的记得他问我会Java还是C++时,我肯定的回答说C++,结果他还问了我这个问题,无语啊。 回来后谷歌百度之,有所了解。 Java中,比较的当然是对象。 “ a == b” : 当且仅当a和b是同一个对象的引用时,结果是ture,否则为false; “a.equa

chinabing的专栏 731

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java中equals和==的使用

问题由来:今天做了一个Excel表数据导入数据库的java项目,Excel表中是人员信息,其中一条是性别(sex)。性别(sex)从Excel表存入数据库是这样一个过程:先从Excel表中存入一个String类型的变量sex中,比如男就存“男”,女就存“女”。然后这个属性要存入实体类(user)中。因为实体类(user)中性别(sex)存的是Boolean型的,所以就要解决把性别从String转换成

博客写得好,技术好,才是真的好 754

java的equals方法_Java Vector equals()方法与示例

java的equals方法 向量类的equals()方法 (Vector Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether this Vector is the sam...

cumudi0723的博客 282

Java Hashtable equals()方法与示例

哈希表类equals()方法 (Hashtable Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether equality of this Hashtable with ...

cumudi0723的博客 300

==和equals的区别

接下来:用一句话总结==和equals的区别 ==号比较的是内存地址  ||  equals()比较的是字符串的内容 解析: A  操作符专门用来比较两个变量的值是否相同,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等 只能用操作符。 B  equals方法用来比较两个独立对象的内容是否相同,两条new语句创建了两个对象,然后用s3,s4两个...

qq_39411501的博客 251

Java IdentityHashMap equals()方法与示例

IdentityHashMap类equals()方法 (IdentityHashMap Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether this Identit...

cumtb2002的博客 189

equals和hashCode

equals 和 hashCode 两个方法属于 Object 基类的方法 从源码中我们可以看出 equals 方法默认比较的是两个对象的引用是否指向同一个内存地址。而 hashCode 是一个 native 本地方法(所谓的本地方法就是指不是用Java语言编写的,而是使用其他语言编写的程序,比如C/C++,一般是为了更快的与机器进行交互),其实默认的 hashCode 方法返回的就是对象对应的内存地址(注意是默认)。

akego的博客 387

operator在java中是什么意思,Java的equals()和C ++的operator ==有什么区别?

In a question regarding the use of typeid is C++, I suggested it could be used to compare types in objects comparison. I haven't seen it done much, but I had Java's equals in mind.Looking into Java a ...

weixin_39846361的博客 320

equals与==的区别我可以跟面试官说半小时

1、Java的数据类型 要了解==与equals的区别首先要先了解Java的数据类型 ; Java的数据类型 分为两种: 基本数据类型 ( 值类型 )和 复合数据类型 ( 引用类型 ) java数据类型 类型 具体类型 值类型(基本类型) 整数类型 int byte short long 浮点型 float double 字符类型 char 布尔类型 boolean 引用类型 类 String属于引用类型中的类 接口 数组

jack19950729的博客 243

Object类中equals、hashCode等常用方法深入解析

Object 就是 JDK 提供的一个类,并且它很特殊,它是所有类的根节点,Java 中的所有类 包括 JDK 提供,以及开发者自定义的,第三方框架的所有内容都属于 Object 的派生类。 目录 一、java中的内存 1、JVM栈 2、堆内存 3、堆和栈的区别 4、方法区 5、本地方法栈 6、程序计数器 二、java中的"=="到底比较的是什么 三、hashCode方法 四、equals方法 五、Set集合 1、Set集合特点 2、Set中hashCode与eq..

qq_44969643的博客 2万+

Java中的Object类

java.lang.Object类是Java语言中的根类,即所有类的父类。如果一个类没有特别指定父类,那么默认则继承自Object类。根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。其中2个方法特别常用:public String toString():返回该对象的字符串表示。public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。

qq_46130027的博客 1395
上一篇: java读取一篇英语文章并且统计出单词出现的频率并从高到低输出
下一篇: ElementUI的el-upload 文件上传
java_xxxx
博客等级 码龄9年 127粉丝 99原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值