Java-String

1. 导读

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

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

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

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

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

String::compareTo.jpg

String::compareTo做了三件事:

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

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

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

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

可以看到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 "+

java comparator_Java基础之String漫谈(二)相关推荐

  1. Java 线程 - 基础及工具类 (二)

    Java 并发系列文章 Java 线程 - 并发理论基础(一) Java 线程 - 基础及工具类 (二) Java 线程 - 并发设计模式 (三) Java 线程(二) 通用的线程生命周期 Java ...

  2. java面试基础题整理(二)

    java面试基础题整理 文章目录 java面试基础题整理 前端技术(HTML.CSS.JS.JQuery等) 在js中怎么样验证数字? js中如何给string这个类型加方法? 谈谈js的定时器? 请 ...

  3. Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  4. “面试不败计划”: java语言基础面试题(二)

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 java实 ...

  5. Java编程基础测题(二十道)

    1.假设有如下程序: public class Demo { public static void main(String args[]) { int num = 2147483647 ; num + ...

  6. “面试不败计划”: java语言基础面试题(三)

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 java实 ...

  7. Java入门基础(十四)Maven仓库的安装

    文章目录 一.下载配置Maven环境 1.下载maven.jar解压缩,放在一个文件夹下 2.点击此电脑=>属性=>高级设置=>环境变量=>系统变量=>新建 3.变量名为 ...

  8. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

  9. java的知识点15——String基础、String类和常量池、String类常用的方法、字符串相等的判断、组合模式

    String基础 1. String类又称作不可变字符序列. 2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类. 3. Java字符串就是Unicode ...

最新文章

  1. pyqt tableview mysql_当数据库中添加了一个新条目时,如何在PyQt中更新TableView?
  2. c语言求n(n从1到10),关于C语言的一道题
  3. android 定位信息存哪,安卓手机便签系统存储位置在哪
  4. 如何防御syn flood的一些思路!
  5. 学习Android MediaPlayer
  6. Log4j的应用实例
  7. 面向对象初调用:foolish 电梯
  8. phpunit autoload.php,关于php:Composer不会创建所有需要的phpunit包含路径
  9. 通达OA工作流-表单设计
  10. 磁力链接地址生成教程
  11. 关于苹果开发者证书的续费问题改动2021
  12. 美团“二选一”被立案调查,反垄断将成为常态化
  13. 图像梯度算法中算子的由来
  14. asp连接 Oracle
  15. Mac xmind安装与破解版
  16. CPU 使用率低 负载高的原因
  17. 欧盟委员会将批准微软收购Skype的交易
  18. LYNC客户端不显示通讯组里的用户的解决办法。
  19. pytorch实现lstm分类模型
  20. 2023安卓逆向 -- 某合伙apk登录加密分析

热门文章

  1. 多线程多进程解析:Python、os、sys、Queue、multiprocessing、threading
  2. 1.关于python
  3. sas infile和filename
  4. 浅谈 MySQL 的存储引擎(表类型)
  5. C语言返回文件大小的功能(fseek和ftell的使用)
  6. python、中循环功能可通过什么命令实现_python定时执行指定函数的方法 Python如何定时循环执行命令?...
  7. python数据分析神器_太香了!墙裂推荐6个Python数据分析神器!!
  8. 前端如何发ModelAndView的请求
  9. 计算机图形图像电影论文,计算机图形图像绘制技术地现状分析及应用发展.doc...
  10. 微信小程序实战–集阅读与电影于一体的小程序项目(八)