java comparator_Java基础之String漫谈(二)

b3e80e2e960ef1bc2576a43205d6c6fa.png

Java-String

1. 导读

上期分享了本人关于String四个问题, 本期我们继续探讨String中的两个问题:

.1 String既然已经实现了Comparable接口, 为什么还要提供内部类----CaseInsensitiveComparator;

.2 使用 "+" 拼接String究竟干了什么? 为什么在循环中不让使用"+"拼接String;

2. String为什么要提供内部类CaseInsensitiveComparator

先来看下String实现了Comparable接口后做了什么:

6ffabe44fcd919ee64aa9d1dd4f3282b.png

String::compareTo.jpg

String::compareTo做了三件事:

.1 比较两个字符串的长度, 找出最小值;

.2 比较最小长度中的字符是否相同, 因底层使用ASCII码存储, 10进制的ASCII是纯数字, 可直接减得出比较结果(compareTo规定: 返回-1是小于; 0是等于; 1是大于);

.3 如果最小长度的字符都相同, 再比较两个字符串的长度是否相同;

字符串是可能含有大小写的, 在String::compareTo中认为A和a是不同的, 那么在忽略大小写的场景中就不适用了;既然String提供了基于Comparator的内部类, 是不是对这种场景做了特殊处理呢?我们接下来看CaseInsensitiveComparator的核心实现:

8c3d8e92008f3502a287d6fab9078238.png

可以看到compare的逻辑和String:compareTo大同小异, 只是在第二步的时候做了特殊处理:

.1 先将char字符转换成大写作比较(如果是数字则不变);

.2 如果大写比较不符, 再转换成小写做比较;

.3 如果小写比较还是不符, 证明该char字符为数字, 直接比较即可;

上面只是说明了这两者实现的不同, 还是没有说明为什么这么实现; 要解答这个首先需要说明下Comparable 和Comparator的异同:

.1 两者都是接口, 都是实现对象的比较的, 返回值都是{-1, 0, 1};

.2 Comparable需要重写Comparable::compareTo方法, 会对比较对象的代码形成侵入; Comparator由一个比较目标对象的策略类来实现, 同时比较策略则由编写者指定, 无需侵入比较对象的代码;故而String实现Comparable接口提供了一种内排序的方式, 而Comparator提供了一种不改变比较对象代码, 实现比较的策略, 如果对CaseInsensitiveComparator的实现并不满意, 也可以自己实现MySelfComparator;

划重点:

.1 CaseInsensitiveComparator的实现只是String作者提供了一种不同于String::compareTo的比较策略, 如果说Compareable是比较的内部实现, 那么Comparator就是比较的外部实现;

.2 Comparator这种方式实现了策略模式, 将变与不变完美分类; 关于设计模式后面再开专题分享;

.3 Comparator接口中还有个equals方法没有实现, 不实现这个方法为什么不报错呢? 因为所有类的父类都是Object,Object::equals已经对这个方法做了实现, 也就不报错了;

.4 如果Compareable::compareTo 或者 Comparator::compare的实现的比较结果与equals不符时, 你需要考虑这种情况会不会有影响;比如HashMap中先调用equals再调用的compareTo, 这时候如果equals与compareTo的结果是不一致, 不就引起问题了; 虽然实现了Compareable接口不强制重写equals方法, 但是不一致的情况还是需要考虑下的;

3. String字符串拼接的三种方式比较

对于字符串拼接, 我们可以使用一下三种方式:

.1 "+

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

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

相关文章

掌握Java字节码

嘿! Happy Advent:D我是ZeroTurnaround的技术布道者Simon Maple( sjmaple) 。 您知道, JRebel伙计们! 由于编写了类似于JRebel的产品,该产品与字节码进行交互的结果比您想像的更多,因此&#xf…

敲代码括号技巧_理解代码块概念,养成良好编程习惯 | 亲子课堂 第 3 课

亲子课堂关卡解析 / 英语教学 / 编程讲解 做亲子编程教育的好帮手! 每周二、四定期更新 地牢面向真正0编程基础的孩子们,关卡被设计成迷宫的形式,引导孩子们使用编程思维解决问题。以循序渐进的方式,让大家理解掌握几个Pyth…

在struts2中push方法的使用_电脑使用中怎么截屏的几种方法

电脑在日常工作中经常需要用到截屏的操作,为了截取画面提供证明或者说明,像我就经常需要用到,当然我在写文章的时候更是需要用到,来配合文字的描述,使大家能更直观更容易的去操作,以达到快速解决电脑问题的…

卸载WPS后,原office出现各种问题,报错,图标混乱

1.运行环境win7专业版64位操作系统,之前电脑上装了WPS和office2013,后来卸载了WPS,导致office图标显示不正常(因为WPS与office有很多冲突的地方,卸载的时候会影响到注册表,导致office的注册表损坏&#xff…

C#中的CultureInfo类

CultureInfo类位于System.Globalization命名空间内,这个类和命名空间许多人都不是很熟悉,实际我们在写程序写都经常间接性的接触这个类,当进行数字,日期时间,字符串匹配时,都会进行CultureInfo的操作&#…

clistctrl控件最后插入在后面_老板让我把图片放到Excel表格中,批量插入效率高...

私信回复关键词【福利】,获取丰富办公资源!助你高效办公早下班!大家好,我是懂点 Excel 的小E~初入「江湖」,还请大家多多关照!今天我们来学学 Excel 图片的 6 个小技巧,满满都是干货&#xff0c…

python天气预报的功能介绍_python实现智能语音天气预报

本系统主要包括四个函数: 1、获取天气数据 1、输入要查询天气的城市 2、利用urllib模块向中华万年历天气api接口请求天气数据 3、利用gzip解压获取到的数据,并编码utf-8 4、利用json转化成python识别的数据,返回为天气预报数据复杂形式的字典…

部署环境_Hyperledger Fabric Composer环境部署(一)

声明:本体系Hyperledger Fabric Composer相关分享都是基于MacPro进行多次亲测和体验。今天我这里主要介绍的是这些先决条件安装完成后,如何搭建和使用一个基础环境的问题,适合有一定基础的同学一起交流,也欢迎随时留言交流&#x…

输入参数的数目不足_sklearn.decomposition.PCA 参数速查手册

sklearn常用的API参数解析:sklearn.linear_model.LinearRegression调用sklearn.decomposition.PCA(n_componentsNone, copyTrue, whitenFalse, svd_solverauto, tol0.0, iterated_powerauto, random_stateNone)参数n_components释义PCA 算法中所要保留的主成分个数 …

了解位图

几周前,我和Alistair一起研究了用于对Neo4j数据库中节点已附加到其上的标签进行建模的代码。 这种工作方式是将32个节点ID的块表示为每个标签的32位位图 ,其中位1表示节点具有标签,而0表示没有标签。 例如,假设我们有节点ID 0-3…

各种说明方法的答题格式_语文万能答题公式,给孩子收藏吧!

1、某句话在文中的作用1、文首:开篇点题;渲染气氛(散文),埋下伏笔(记叙类文章),设置悬念(小说),为下文作辅垫;总领下文;2、文中:承上启下;总领下文;总结上文&…

pr文字转语音有插件吗_文字转语音软件深度解析

网络时代的迅猛发展,丰富了我们的眼见,便利了我们的生活,升华了我们的素养。那你知道近年来配音行业的迅速崛起吗?视频配音,广告配音,小视频配音等等,其实配音处处都陪伴在我们身边,…

装饰图案

装饰图案 我不经常使用的一种设计模式是Decorator 。 我不确定为什么这种模式不受欢迎,因为它很方便。 装饰器模式允许以受控方式向对象添加功能。 即使在使用静态类型的语言时,也可以在运行时运行! 装饰器模式是子类的替代方法。 子类化在编…

Neural Networks

神经网络能够使用torch.nn包构建神经网络。 现在你已经对autogard有了初步的了解,nn基于autograd来定义模型并进行微分。一个nn.Module包含层,和一个forward(input)方法并返回output。 以如下分类数字图片的网络所示: 这是一个简单的前馈网络…

文件服务器磁盘配额管理,Windows2008 (FSRM)文件服务器资源管理器网站文件夹磁盘配额管理...

在windows server里提供了一个功能强大的管理工具,就是文件服务器资源管理器。简称FSRM(File Server Resource Manager)通过此工具,可能对网站进去配额以及相关服务。我们通过使用FSRM,可以为文件夹和卷设置配额,主动屏蔽文件&…

SpringBoot项目中,获取配置文件信息

1.在配置文件中设置信息,格式如下 wechat:mpAppId: wxdf2b09f280e6e6e2mpAppSecret: f924b2e9f140ac98f9cb5317a8951c71 如果是多级目录,则 project:url:sell: http://localhost:8080 2.获取配置文件信息(三种方法) 2.1Configurat…

oppo 手机侧滑快捷菜单_OPPO刚秀出卷轴屏手机,就被打了一记响亮的“耳光”

在刚刚过去的未来科技大会上,我国国产手机厂商 oppo可谓是出尽了风头,因为他们推出一款名叫“OPPO X 2021”的卷轴屏概念手机,并且展出了可操作的概念机实物,着实让所有人都惊艳了一把。因此我国的一些自媒体又嗨了,用…

UVA1602 Lattice Animals 搜索+剪枝

题目大意 给出一个$w\times h$的网格,定义一个连通块为一个元素个数为$n$的方格的集合$A,\forall x\in A, \exists y\in A$,使得$x,y$有一条公共边。现要求一个元素个数极多的连通块的集合$K_N$,使得$\forall A,B\in K_n$,不存在一…

python怎么打开程序管理器_Python 进程管理工具 Supervisor 使用教程

因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新。请访问我的个人网站获取这篇文章的最新内容,Python 进程管理工具 Supervisor 使用教程 Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上&#xff…

ft服务器设置传输协议,ft服务器设置成主动模式

ft服务器设置成主动模式 内容精选换一换如果您选择使用SFS Turbo实现文件共享存储,此章节操作可跳过,您可以参见《SAP HANA用户指南》中的“格式化磁盘”章节,挂载Backup卷。NFS Server磁盘需要格式化,并挂载到相应的目录后&#…