标签:objects.compare objects 源码 java caseinsensitivecompa
Objects是Java 7新增的一个工具类,它提供了一些工具方法来操作对象,这些工具方法大多是“空指针”安全的。
Objects实现的方法如下:
关于compare(T,T,Comparator<? super T>)方法在源码中是如何定义的:
public static <T> int compare(T a, T b, Comparator<? super T> c) {
return (a == b) ? 0 : c.compare(a, b);
}
在这里传入两个对象a和b,并创建一个Comparator接口实现类的对象,其中Comparator接口定义了以下方法:
int compare(T o1, T o2); boolean equals(Object obj);
compare(a,b)方法。
我们来看看在实际生活中是如何定义的:
class User {
public String name;
public int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
protected String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "name="+name+"\nage="+age;
}
}
public class Main {
public User user1,user2;
public static void main(String[] args) {
new Main().init();
}
public void init(){
User user1=new User("Aill", 25);
User user2=new User("Cill", 24);
int compare=Objects.compare(user1, user2,new Comparator<User> () {
@Override
public int compare(User o1, User o2) {
return o1.name.compareToIgnoreCase(o2.name);
}
});
System.out.println(compare);
}
}-2
在上面的程序中,实现了compare(a,b)方法,因此,我们可以在此方法中,自定义一些判断两个对象大小的方法,以
上是通过o1和o2的name来比较,compareToIgnoreCase(String str)方法是java.lang.String类下的方法,作用是按字
典顺序比较两个字符串,不考虑大小写。
String类也实现了Comparable<String>接口:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence 在String类中compareToIgnoreCase(String str)方法:
public int compareToIgnoreCase(String str) {
return CASE_INSENSITIVE_ORDER.compare(this, str);
}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;
}
/** Replaces the de-serialized object. */
private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
}
String s2)方法,Math.min(n1, n2)是将两个int值较小的那个返回。通过for循环,根据charAt(int index)方法获取指定
索引处的char值。最后通过Character.toUpperCase和Character.toLowerCase将char转换成大写和小写后再判断是否
相等,如果还不相等,就返回它们两个ASCII码相减后的值,否则两个char值相等,返回0。
转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/43940265 情绪控_
标签:objects.compare objects 源码 java caseinsensitivecompa
原文地址:http://blog.csdn.net/hai_qing_xu_kong/article/details/43940265