IF,String编程趣事==和equals的区别

2024-05-08 19:48

本文主要是介绍IF,String编程趣事==和equals的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开始

         怎么搞定!怎么搞的!这两个String怎么可能不等!?当我看了Debug的Variables的两个String变量的值、明明都是一样的,为什么用比较运算符==判定、他们俩竟然不等于呢!?

         郁闷死宝宝了,这不可能,不应该= =,当纠结了好一会之后突然想起以前看到过、判定是否相等分两种、一个是值、一个是对象、经过在网上查了下,轻松解决了问题。。。。代码如下


<span style="font-size:24px;">	String password = request.getParameter("password");String oldPassword = UserManager.getInstance().findUserById(userId).getPassword();if(!password.equals(oldPassword)){out.println("密码错误");}</span></span>


没错加了个equals、判定就按照我想的逻辑走了。。。这是问什么呢?


讲解


1 数据类型


      基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 

而String是复合数据类型(类)、他们在堆栈中的区别如下




2 比较运算符号==和equals的区别


           ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。      equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。



代码赋值如下


<span style="font-size:24px;">        int  intDate = 521;char charDate = 521;char charif = 123;String strif = "123";String strDate ="2228664347";String strName ="2228664347";</span></span>




注:这里66621、77521、88456都是堆中对象的地址


            用 == 比较intDate和charDate的值

            判定521等于521? 是的!


            用 == 比较charif和strif的值

            判定123等于66621?不是!


            用==比较strDate和strName的值

            判定77521等于88456?不是!


            用equals比较strDate和strName的值用

            判定2228664347等于2228664347?是的!


            用 equals比较charif和strif的值

            判定123等于123?是的!


            equals用法最上面代码有

其实:

            JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。


3 字符串缓冲池(为什么我声明赋值了两个String类型的都为a用==判定他俩却相等?)


<span style="font-size:24px;">	String Date1 ="a";String Date2 ="a";String Date3 =new String("a");if(Date1==Date2){//比较地址一定是相等的}if(Date1==Date3){//比较地址一定是不相等的}</span>

             当Date1有了一个a对象在堆里时候、如果这时候再创建a的String变量,如Date2,程序不会创建新的对象,而是把Date2栈里面的地址指向Date1创建的对象。(节约资源)

而Date3 new了一个、这里就是说我必须要创建一个新的对象,如图





总结:

          还以为遇到了神奇的事情,其实就是基础知识没打好、唉= =相当惭愧,相信看了这文章大家对==和equals的区别一定有了深入的理解。



—————————————chenchen———————————————



这篇关于IF,String编程趣事==和equals的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971273

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。