Java源码阅读之String(3)
来源:互联网 发布:淘宝客怎么收到佣金 编辑:程序博客网 时间:2024/05/17 21:43
Java源码阅读之String(3)
这一篇博客主要读一下String类的比较方法
/***将anotherString对象和当前对象进行对比,对比方式为*从两者首位依次向后对比,知道对比到其中一个结束*返回值为负数则当前对象小,返回0则相等,返回正数则当前对象大*/public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2;}//CaseInsensitiveComparator内部类是实例化Comparator接口的一个类//用于实现忽略字母大小写的字符串对比public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();private static class CaseInsensitiveComparator implements Comparator<String>, java.io.Serializable { // use serialVersionUID from JDK 1.2.2 for interoperability private static final long serialVersionUID = 8575799808933029326L; public int compare(String s1, String s2) { int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); if (c1 != c2) { c1 = Character.toLowerCase(c1); c2 = Character.toLowerCase(c2); if (c1 != c2) { // No overflow because of numeric promotion return c1 - c2; } } } } return n1 - n2; } //替换反序列化的对象 private Object readResolve() { return CASE_INSENSITIVE_ORDER; }}//忽略字母大小写比较当前对象和str对象的大小public int compareToIgnoreCase(String str) { 调用内部类CASE_INSENSITIVE_ORDER的compare方法 return CASE_INSENSITIVE_ORDER.compare(this, str);}/***对比当前对象和other对象的子串是否相等可以指定两者开始位置和长度*toffset指定当前对象对比的开始位置,ooffset指定other对象开始对比的位置*len指定两者对比的长度*/public boolean regionMatches(int toffset, String other, int ooffset, int len) { char ta[] = value; int to = toffset; char pa[] = other.value; int po = ooffset; //检查ooffset和toffset是否合法(是否小于0,是否能够支持len长度的子串) if ((ooffset < 0) || (toffset < 0) || (toffset > (long)value.length - len) || (ooffset > (long)other.value.length - len)) { return false; } //长度自减和两者偏移量自增 while (len-- > 0) { if (ta[to++] != pa[po++]) { return false; } } return true;}/***忽略字母大小写的方式对比当前对象和other对象的子串是否相等可以指定两者开始位置和长度*toffset指定当前对象对比的开始位置,ooffset指定other对象开始对比的位置*len指定两者对比的长度,ignoreCase是否忽略字母大小写*/public boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) { char ta[] = value; int to = toffset; char pa[] = other.value; int po = ooffset; //检查ooffset和toffset是否合法(是否小于0,是否能够支持len长度的子串) if ((ooffset < 0) || (toffset < 0)|| (toffset > (long)value.length - len) || (ooffset > (long)other.value.length - len)) { return false; } //长度自减和两者偏移量自增 while (len-- > 0) { char c1 = ta[to++]; char c2 = pa[po++]; if (c1 == c2) { continue; } //如果ignoreCase为true,将两者都转为大写字母和小写字母进行对比 if (ignoreCase) { char u1 = Character.toUpperCase(c1); char u2 = Character.toUpperCase(c2); if (u1 == u2) { continue; } if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) { continue; } } return false; } return true;}//判断当前对象是否从toffset位置以prefix开始(当toffset=0即是否以prefix开头)public boolean startsWith(String prefix, int toffset) { char ta[] = value; int to = toffset; char pa[] = prefix.value; int po = 0; int pc = prefix.value.length; //判断偏移量toffset是否合法 if ((toffset < 0) || (toffset > value.length - pc)) { return false; } while (--pc >= 0) { if (ta[to++] != pa[po++]) { return false; } } return true;}//判断当前对象是否以prefix开头public boolean startsWith(String prefix) { return startsWith(prefix, 0);}//判断当前对象是否以prefix结束public boolean endsWith(String suffix) { return startsWith(suffix, value.length - suffix.value.length);}
这些就是String类的对比方法,注释的不完全,如果感兴趣可以参阅源码。
阅读全文
0 0
- Java源码阅读之String(3)
- Java源码阅读之String(1)
- Java源码阅读之String(2)
- Java源码阅读之String(4)
- Java源码阅读之String
- JAVA源码阅读--String
- java.lang之java.lang.String 源码阅读及分析
- JDK源码阅读之String
- java+String源码阅读1
- java String源码阅读2
- Java源码阅读-String类
- java源码阅读系列-String
- 源码面前,原形毕露之String源码阅读
- java源码阅读-java.lang.String(01)
- JDK源码阅读之二-----String
- String源码阅读之contains实现原理
- java StringBuilder、stringbuffer、string 源码阅读笔记
- [Java]String类分析源码阅读
- Zxing和QR CODE 生成与解析二维码实例(带logo篇)
- java代码设置Burron、Radiobutton的背景色和字体颜色
- 【Scikit-Learn 中文文档】Pipeline(管道)和 FeatureUnion(特征联合): 合并的评估器
- Scala_入门笔记_List
- 数人云|听说大神都在用这25种软件部署工具,你用过几种?
- Java源码阅读之String(3)
- 674. Longest Continuous Increasing Subsequence
- Qrcode生成二维码(普通篇)之jquery.qrcode.min.js
- Qrcode生成二维码(logo篇)之jquery.qrcode.min.js
- 单机模拟高并发进行压力测试
- lua构造完美二叉树
- 【Scikit-Learn 中文文档】预处理数据
- 二维码之zxing仿新浪微博二维码
- apache ab压力测试学习