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,一经查实,立即删除!

相关文章

vue给input file绑定函数获取当前上传的对象

HTML<input type"file" change"tirggerFile($event)"> JS(vue-methods)tirggerFile : function (event) {var file event.target.files; // (利用console.log输出看结构就知道如何处理档案资料)// do something... } 如果直接在绑定的函数中传入thi…

掌握Java字节码

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

elasticsearch——海量文档高性能索引系统

elasticsearch elasticsearch是一个高性能高扩展性的索引系统&#xff0c;底层基于apache lucene。 可结合kibana工具进行可视化。 概念&#xff1a; index 索引: 类似SQL中的一张表&#xff0c;索引名必须是全小写单词。type&#xff08;索引类型&#xff09;&#xff1a;设计…

全国计算机c二级编程题,全国计算机二级C上机 编程题.doc

全国计算机二级C上机 编程题.doc全国计算机二级C上机 编程题全国计算机等级考试C语言――编程题1&#xff0e;m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。例如,当score数组中的数据为…

.Net架构篇:思考如何设计一款实用的分布式监控系统?

前言无论从最早期的unix操作系统&#xff0c;还是曾经大行其道的单体式应用&#xff0c;还是现在日益流行的微服务架构&#xff0c;始终都离不开监控的身影。如windows的任务管理器&#xff0c;linux的top命令&#xff0c;都可以看作是监控的面板。再联系起现实生活&#xff0c…

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

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

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

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

vue父组件向子组件动态传值的两种方法

在一些项目需求中需要父组件向子组件动态传值&#xff0c;比如我这里的需求是&#xff0c;父组件动态通过axios获取返回的图片url数组然后传给子组件&#xff0c;上传图片的子组件拿到该数组后进行遍历并展示图片&#xff0c;因为有时候获取到的会是空&#xff0c;所以这里要考…

什么是Spring Data?

&#xff08;这与“学生计划”有关&#xff0c;稍后我将重新讨论该主题。&#xff09; Spring Data在最近的几次采访中获得通过。 什么是Spring Data &#xff1f; 为了回答这个问题&#xff0c;让我们考虑持久性的标准方法–所有访问都是通过数据访问对象 &#xff08;DAO&a…

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

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

计算机一级应用于段落还是文字,计算机一级复习资料

出国留学网小编们精心为广大考生准备了“2017年计算机一级PS基础知识点”&#xff0c;各位同学赶快学起来吧&#xff0c;做好万全准备&#xff0c;祝各位同学考试顺利通过。更多相关资讯请持续关注出国留学网。AdobePhotoshop 是目前最流行的平面设计软件之一。可以说&#xff…

C#中的CultureInfo类

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

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

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

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

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

vue获取DOM元素并设置属性

这里我想到了2个方法&#xff1a; 方法一&#xff1a; 直接给相应的元素加id,然后再document.getElementById("id");获取&#xff0c;然后设置相应属性或样式 方法二&#xff1a; 使用ref,给相应的元素加ref“name” 然后再this.$refs.name获取到该元素 注意&…

甲骨文发布Java 8

甲骨文决定在3月18日发布升级到JDK&#xff08;Java开发工具包&#xff09;8的消息&#xff0c;尽管新版本可能会带来一些错误&#xff08;如Full speed所介绍的那样&#xff09; &#xff1a;甲骨文将在3月份发布Java 8&#xff0c;即使有错误 。 Oracle JDK 8发行经理Mathia…

python所有基础

下面就不一一列举了&#xff0c;所有的资料都和GitHub对接&#xff0c;到时候我有更新就直接拖到GitHub上面了。入门的小伙伴们可以进来看看&#xff0c;估计后面还会有很多项目&#xff0c;待更新。 转载于:https://www.cnblogs.com/wuzaipei/p/9633673.html

计算机硬件系统一直延用,会计从业资格证考试:会计电算化计算机硬件系统

要求掌握冯•诺依曼计算机体系结构的基本思想&#xff0c;熟悉计算机硬件的组成及其工作原理&#xff0c;掌握计算机中的常用术语和主要性能指标。1946年&#xff0c;著名美籍匈牙利数学家冯•诺依曼(JohnVon Neumann)提出并论证了计算机体系结构的基本思想。目前的电子计算机都…

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

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

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

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