JDK1.8中regionMatches()解读

个人认为:其实本质上regionMatches就是submit和equals和equalsIgnoreCase的结合体,什么意思呢?我们先从equals说起:

1、比较2个字符串是否内容相同

很明显结果是false,因为equals比较的时候区分大小写:

2、如果想不区分大小写比较内容呢?使用equalsIgnoreCase方法

当然结果为true:

3、假设现在有这么一个需求,我要比较字符串s1="abcdef"和字符串s2="abcdefxjk",比较什么呢?比较s1中的索引为2也就是c开始到e的位置的字符串即cde,和s2中索引为3也就是d开始到f即def,这2个字符串是否相同,那传统的做法我们会怎么做呢?肯定是先使用substring方法将s1和s2中的字符串截取出来,然后用equals来比较。比如下面:

结果:

假如说现在需求又变为了不区分大小写,那你还得把equals改为equalsIgnoreCase,很麻烦不是吗?

4、regionMatches

JDK1.8中提供的这个方法可以一个方法帮你搞定上述2个需求,来看下方法的源码:

参数代表什么意思呢?第一个参数代表你要比较的s1字符串的起始位置,第二个表示要和字符串s2比较,第三个参数表示要从s2的哪个位置开始比较,第四个参数代表要比较几位。怎么用呢?还是上面的需求,我们来用regionMatches实现一下

结果:

有没有感觉很神奇,有的人可能会为,那第一个参数2的话代表s1从c开始比较,但是你也没指定s1要比较几个啊,只是指定了s2的长度,不需要指定!它会根据s2的比较长度来去s1截取指定的长度比较,不相信的话我们来测试一下s2中从2的位置开始比较,比较的长度是2,也就是比较s1中的cd和s2中的cd是否一致。

如果你想实现比较的时候不区分大小写呢?只需要在前面再加上一个参数为true,就是表示不区分大小写来看个例子:说明默认比较的是equals

结果:

结果:

源码分析:

刚才我说了不需要你去指定s1要比较的长度,这是怎么做到的,其实很简单可以看下源码的这一段:

根据s2的长度每次递减也就是一个个比较,箭头那一段是关键的一段,len-->0就解决了为什么s1也会取和s2一样的长度
————————————————
版权声明:本文为CSDN博主「润青」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32967665/article/details/86515726

原文地址:https://www.cnblogs.com/tiancai/p/15224102.html