Java学习笔记20
来源:互联网 发布:手机淘宝怎么批量收货 编辑:程序博客网 时间:2024/05/29 15:40
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); }
以上使用<T> 定义了一个泛型方法,关于<T>和类型形参 T的说明在后续讲解泛型时会提到。
在这里传入两个对象a和b,并创建一个Comparator接口实现类的对象,其中Comparator接口定义了以下方法:
int compare(T o1, T o2);boolean equals(Object obj);
因此compare方法中先是判断对象a和对象b是否相等,如果相等的话,返回0,不相等时,通过Comparator接口实现
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> () {@Overridepublic 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; } }
以上定义了一个静态内部类CaseInsensitiveComparator并实现了Comparable<String>接口中的compare(String s1,
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 情绪控_
- java学习笔记20
- Java学习笔记20
- Java学习笔记06.2.20
- Effective Java 学习笔记(20)
- Java学习笔记--CSS笔记
- Java学习笔记 —— 20
- 【Java学习笔记】20:Balking Pattern
- Java学习笔记(20)-- main方法
- Java学习笔记001
- Java 学习笔记
- java 学习笔记
- Java学习笔记
- java 学习笔记
- java学习笔记
- java学习笔记
- java学习笔记-1
- java虚拟机学习笔记
- java虚拟机学习笔记
- LeetCode Search for a Range
- 负数的补码
- Oracle 聚合字符串
- Maven仓库—Nexus环境搭建及简单介绍
- c_指针_通过指针交换两个变量的值且不使用新变量
- Java学习笔记20
- LaTeX报错解决办法 Error: File 'amsmath.sty' not found
- c语言基础3—变量、结构体、枚举
- html+css英雄联盟网页
- hibernate通用DAO
- transfer-encoding:chunked的含义
- Codeforces Round #293 (Div. 2) (A B C D E)
- testMarkDown
- sql 函数实现三种父子递归