Kotlin中的字符串比较

2023-11-11

在java中,执行比较运算的操作一般有: ==  和  equals()两个操作符

而且在java中== 比较的是两个字符串的引用是否相同, 而 equals()则是比较两个字符串的内容是否相同

我们可以通过一个例子来进行一下验证:

String a1 = "ab";
String a2 = "ab";
String b1 = new String("ab");
String b2 = "ab";
System.out.println("a1 == a2 : " + (a1 == a2));
System.out.println("a1.equals(a2) : " + (a1.equals(a2)));
System.out.println("b1 == b2 : " + (b1 == b2));
System.out.println("b1.equals(b2) : " + (b1.equals(b2)));

最终运行的结果为:

a1 == a2 : true
a1.equals(a2) : true
b1 == b2 : false
b1.equals(b2) : true

由此我们可以看出 在java中==比较的是两个对象的引用是否相同 而eqausls()方法才是比较两个对象的内容是否相同

那为什么字符串b1和字符串b2的引用不相同 但是内容相同的呢,这就需要从字符串String在java内存中的分配来说了:

如以上的示意图所示,当我们画出以上创建的四个String对象的内存分配示意图的时候我们其实就可以很清楚的得出结果了:

1. a1 == a2  -> true 

由于String这种类型的数据会在java程序中频繁的使用因此java从性能的角度出发设计了一个字符串常量池的概念,字符串常量池存在于

java内存中的方法区中,当我们创建一个String对象时如果该对象表示的字符串存在于字符串常量池中的话那么就直接取字符串常量池中

的字符串进行使用,否则会创建该字符串并将该字符串存入字符串常量池当中,那么当下次使用时会直接从字符串常量池中进行获取

由此我们可以得出创建a1对象时 由于字符串常量池中没有"ab"这个字符串那么会创建"ab"字符串对象并将其放入到字符串常量池中

而创建a2对象时会直接取字符串常量池中进行获取 直接将a2指向字符串常量池中的"ab"对象 由此在执行a1 == a2的时候这两个对象

的引用肯定是相同的 即返回true

2.a1.equals(a2) 内容都是为"ab"因此肯定相同返回true

3. b1 == b2 

在创建b1的时候 我们是通过new String("ab")这种方式显式的创建了字符串b1对象 那么在这种创建方式下 会首先在堆内存中

为b1对象分配空间,然后在初始化内容时,由于字符串常量池中已经有了"ab"这个字符串对象那么堆内存中的b1对象会直接

指向方法去中的字符串常量池中的"ab"对象,那么此时栈中的b1对象指向的是堆内存中的一块区域,再由栈内存中的区域指向

字符串常量池中的"ab"对象,而b2 对象由于不是显式的创建的会直接有栈中指向方法区中的字符串常量池中的"ab"对象

由此 b1 == b2 判断对象引用是肯定返回false因为一个是执行堆内存 一个指向的是方法区中的字符串常量池

4. b1.equals(b2) 由于b1和b1内容相同 因此返回的肯定是true

 

说完了java中的字符串比较 我们就来说说 kotlin中的字符串比较:

在kotlin中用于比较运算的有三个 分别是: ==    ===    equals()方法

我们先来看看一下的代码:

var a: String = "hello"
var b: String = "hello"

println("a == b ${a == b}")
println("a === b ${a === b}")
println("a equals b ${a.equals(b)}")

var c = String(listOf<Char>('a', 'b').toCharArray()) 
var d = "ab"  

println("c == d ${c == d}")
println(" c === d ${c === d}")
println("c equals d ${c.equals(d)}")

运行结果如下:

a == b true
a === b true
a equals b true

c == d true
c === d false
c equals d true

通过以上的结果我们可以得出:

在kotlin中== 和 equals()方法的作用是一样的都是比较两个对象的内容是否相同

而===  则是和java中的==一样比较的是两个对象的引用是否相同

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin中的字符串比较 的相关文章

随机推荐

  • SQL基础常用语句:DDL、 DML、DQL

    下面跟我一起来学习SQL基础知识 一 SQL基础与DDL 1 1 SQL的概述 SQL全称 Structured Query Language 结构化查询语言 用于访问和处理数据库的标准的计算机语言 SQL语言1974年由Boyce和Cha
  • bitset优化例题

    1 bitset 优化背包 https loj ac p 515 题意 给 n 个 lt n 的数 每个数有取值范围 a i b i 令 x 为 n 个数的平方和 求能构成的 x 的个数 样例 5 1 2 2 3 3 4 4 5 5 6 2
  • js小程序ios日期解析失败NAN兼容

    小程序中ios使用 new Date 的时候 如果有 分隔符 将会解析失败 如果日期过短也会解析失败 比如只有 2022 08 年月这样也解析不出来 下面工具能解决上述问题 但是在手动创建字符串时间 建议使用 2022 08 01 斜杠等方
  • 第一次在linux服务器上部署项目,遇到的问题总结(包括mysql安装,jar打开遇到的问题)

    第一步 写代码 这一步没啥好说的 将代码写完 再考虑部署的事情 第二步 linux中安装mysql linux中安装mysql比在windows中安装mysql要难的多 其中遇到的问题是 一直安装不成功 老是会缺少 systemctl st
  • 解决Tensorflow读取MNIST数据集时网络超时问题

    最近在学习TensorFlow 比较烦人的是使用tensorflow examples tutorials mnist input data读取数据 from tensorflow examples tutorials mnist impo
  • cmake:file

    文件操作命令 这个命令专用于需要访问文件系统的文件和路径操作 对于其他仅处理语法方面的路径操作 请查看cmake path 命令 概要 Reading file READ
  • 南昊网上阅卷系统服务器地址,南昊网上阅卷系统全攻略

    扫描网上阅卷系统的分类 南昊扫描客观题阅卷系统 南昊扫描单机阅卷系统 南昊扫描网上阅卷系统 校园版 南昊扫描网上阅卷系统 中考版 南昊扫描网上阅卷系统 行业考试版 南昊扫描海军民主评议系统 南昊扫描教学质量评测系统 南昊扫描行风评议系统 网
  • hexo部署码云

    在本地搭建好博客后我们需要把博客部署在服务器上 这里没有购买服务器的情况下 就暂时部署在码云或者github上也是可以滴 如果之前部署过github的童鞋应该很快就上手了 都差不多的 这里就没有配置本地公钥了 直接使用是http链接方式 g
  • 利用k8s部署nginx

    这只是一个简单的demo测试 记录下第一次部署应用哈哈哈哈 运行指令创建有四个副本的nginx 这点和docker挺像的 root master kubectl run nginx image nginx latest replicas 4
  • Java实现从FTP获取文件下载到本地,并读取文件中的内容的成功案例

    package com aof web servlet import java io BufferedReader import java io File import java io FileInputStream import java
  • 考虑virtual函数以外的其他选择——条款35

    假设你正在写一个视频游戏软件 你打算为游戏内的人物设计一个继承体系 你的游戏术语暴力砍杀类型 剧中人物被伤害或因其他因素而降低健康状态的情况并不罕见 你因此决定提供一个成员函数healthValue 它会返回一个整数 表示人物的健康程度 由
  • 15个变态的Google面试题以及答案

    在当前经济形势不景气的情况下 谷歌招聘新员工是一件令人振奋的事 特别是对那些在当前金融风暴中渴望找到安全港的年轻经理们和软件开发商们来说是个好消息 不过 也不要高兴太早 谷歌在招聘新员工时 更加青睐名牌大学的学生 即便你是人到中年 招聘时谷
  • 利用顺序栈判断一个字符串是否是对称串

    利用一个顺序栈 判断一个字符串是否是对称串 所谓对称串是指从左向右读和从右向左读的序列相同 有些类似上一篇博客所说的回文 解题思路 对于字符串str 先将其所有元素进栈 从头开始扫描str 同时出栈元素 将出栈元素与从头开始扫描的str元素
  • 第五章 Linux磁盘与文件系统管理

    目录 认识EXT2文件系统 EXT2 EXT3文件的访问与日志文件系统的功能 VFS 文件系统的简单操作 磁盘与目录的容量 df du 连接文件 ln 硬连接和复制的区别 磁盘的分区 格式化 检验与挂载 磁盘分区 fdisk 磁盘检查 fs
  • Python网络编程:socket包的用法

    持续补充 1 网络编程 网络编程 主要用于两台或多台计算机之间的通信 也可以是同一台计算机内不同进程之间的通信 Socket套接字可以用来实现网络通信 关于Socket套接字 需要注意以下几点 Socket是网络通信中应用层和传输层之间的一
  • dbnet ICPAR2015数据格式json制作

    dbnet json格式制作 说明 json格式 代码 说明 dbnet代码选自https github com WenmuZhou DBNet pytorch 训练时数据集信息以json导入 但是官方ICPAR2015数据集下载数据是tx
  • 20个经典模拟电路(详细图文)

    为电子工程师的你 已经掌握了多少模拟电路呢 还应该掌握多少图纸和原理呢 本文列举了20个最常见的电路 并粗略的推断出不同层次的发烧对线路的不同理解程度 快来对照看看你是哪个程度的电子工程师 一 桥式整流电路 注意要点 1 二极管的单向导电性
  • Django 快速搭建博客 第七节(文章详情页,markdown语法)

    版权声明 更多最新原创文章请访问 最新原创主页 更多最全原创文章请访问 更多原创主页 上一节我们把真正的index html显示出来了 只是一个摘要 接下来我们要做的是当我们点击标题或者继续阅读的时候 会打开详情页 1 base html的
  • 页面之间传递值方法

    方式1 在接收页 的html代码里加上一行 WebForm1 fp WebForm1 Context Handler this TextBox1 Text fp name name 是第一页的public变量 Context 提供对整个当前
  • Kotlin中的字符串比较

    在java中 执行比较运算的操作一般有 和 equals 两个操作符 而且在java中 比较的是两个字符串的引用是否相同 而 equals 则是比较两个字符串的内容是否相同 我们可以通过一个例子来进行一下验证 String a1 ab St