Java String类中CaseInsensitiveComparator.compare()方法的实现

String对象的大小写不敏感比较方法的实现如下:

 1         public int compare(String s1, String s2) {
 2             int n1 = s1.length();
 3             int n2 = s2.length();
 4             int min = Math.min(n1, n2);
 5             for (int i = 0; i < min; i++) {
 6                 char c1 = s1.charAt(i);
 7                 char c2 = s2.charAt(i);
 8                 if (c1 != c2) {
 9                     c1 = Character.toUpperCase(c1);
10                     c2 = Character.toUpperCase(c2);
11                     if (c1 != c2) {
12                         c1 = Character.toLowerCase(c1);
13                         c2 = Character.toLowerCase(c2);
14                         if (c1 != c2) {
15                             // No overflow because of numeric promotion
16                             return c1 - c2;
17                         }
18                     }
19                 }
20             }
21             return n1 - n2;
22         }

这里,同时比较了UpperCase和LowerCase,是为了兼容Georgian字符。

见String类的regionMatches()方法。如下(29~32行):

 1     public boolean regionMatches(boolean ignoreCase, int toffset,
 2             String other, int ooffset, int len) {
 3         char ta[] = value;
 4         int to = toffset;
 5         char pa[] = other.value;
 6         int po = ooffset;
 7         // Note: toffset, ooffset, or len might be near -1>>>1.
 8         if ((ooffset < 0) || (toffset < 0)
 9                 || (toffset > (long)value.length - len)
10                 || (ooffset > (long)other.value.length - len)) {
11             return false;
12         }
13         while (len-- > 0) {
14             char c1 = ta[to++];
15             char c2 = pa[po++];
16             if (c1 == c2) {
17                 continue;
18             }
19             if (ignoreCase) {
20                 // If characters don‘t match but case may be ignored,
21                 // try converting both characters to uppercase.
22                 // If the results match, then the comparison scan should
23                 // continue.
24                 char u1 = Character.toUpperCase(c1);
25                 char u2 = Character.toUpperCase(c2);
26                 if (u1 == u2) {
27                     continue;
28                 }
29                 // Unfortunately, conversion to uppercase does not work properly
30                 // for the Georgian alphabet, which has strange rules about case
31                 // conversion.  So we need to make one last check before
32                 // exiting.
33                 if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
34                     continue;
35                 }
36             }
37             return false;
38         }
39         return true;
40     }
时间: 2024-12-17 03:18:31

Java String类中CaseInsensitiveComparator.compare()方法的实现的相关文章

JAVA String 类

java String类中的常用方法:public char charAt(int index)返回字符串中第index个字符:public int length()返回字符串的长度:public int indexOf(String str)返回字符串中第一次出现str的位置:public int indexOf(String str,int fromIndex)返回字符串从fromIndex开始第一次出现str的位置:public boolean equalsIgnoreCase(Strin

java中String类中的replace方法

package stringTest; public class StringDemo2 { public static void main(String[] args) { String s = "acvbb"; String s1 = new String("acvbb"); String s2 = s.replace("a", "X"); String s3 = s1.replace("a", &qu

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

Java String类

JAVA String类[转] 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s = “Java语言”; 其实按照面向对象的标准语法,其格式应该为: String s = new String(“abc”); s = new String(“Java语言”); 只是按照面向对象的标准语法,在内存使用上存在比较大的浪费.例如String s = new String

matchesSelector及低版本IE中对该方法的实现

matchesSelector用来匹配dom元素是否匹配某css selector.它为一些高级方法的实现提供了基础支持,比如事件代理,parent, closest等. W3C在2006年就提出了该方法草案,Firefox和Safari相继实现,比如 ? 1 2 3 4 5 6 <div id="wraper" class="item"></div> <script>     wraper.mozMatchesSelector(

Java String类详解

Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final class String extends Object implements Serializable, Comparable<String>, CharSequence 类概述: Java程序中的所有字面值(string literals),即双引号括起的字符串,如"abc",都是作为String类的实例

Java String类为什么不可变?

原文地址:# Why String is immutable in Java? 众所周知,String类在Java中是不可变的.不可变类简单地说是实例不可修改的类.对于一个实例创建后,其初始化的时候所有的信息都不能被修改.不可变类有很多的好处,本文简述为什么String类要设计成不可变类.本文将从内存,同步性,数据结构的角度说明不变性的概念. 1.字符串常量池的需要 String常量池是方法区的一个特殊的储存区.当新建一个字符串的时候,如果此字符串在常量池中早已存在,会返回一个已经存在字符串的引

Java 11 - Java String类

Java String类 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串 创建字符串最简单的方式如下: String greeting = "Hello world!"; 在代码中遇到字符串常量时,这里的值是"Hello world!",编译器会使用该值创建一个String对象. 和其它对象一样,可以使用关键字和构造方法来创建String对象. String类有11种构造方法,这些方法提供不同

String类中的常用方法_判断

字符串判断:1,字符串石佛包含某个字符串.boolean contains(str); 特殊之处:indexOf(String str),如果返回的值是-1,那么就表示不包含这个字符串 也可以实现判断. 2,字符串是否有内容.boolean isEmpty() 字符串为空时返回true 3,字符串是否以指定内容开头  boolean startsWith(String str) boolean startsWith(String str,int fromindex); 4,字符串是否以指定内容结