value1.compareTo(value2) == 0
value1.equals(value2)
equals的效率高些,compareTo其实就是按照编码的数值求差值,根据差值进行比较,它能确定两个String在字典顺序上的前后性,当你只是想知道是否一致时,用equals也行,效果一样。 另外,equals是Object的方法,要求涉及到比较操作的继承类要自己重写该方法,所以String重写了equals,而compareTo为String的方法。所以: value1.compareTo(value2),当value1不为String类型时,会报错。 而 value1.equals(value2),都会进行比较。
实现了Comparable接口的类才有compareTo方法,有了就可以用, 所有已知实现类: Authenticator.RequestorType, BigDecimal, BigInteger, Boolean, Byte, ByteBuffer, Calendar, Character, CharBuffer, Charset, ClientInfoStatus, CollationKey, Component.BaselineResizeBehavior, CompositeName, CompoundName, Date, Date, Desktop.Action,String .....很多~ 但是Object类 只有.equals(),没compareTo Object是根类,它有的方法,其他类都可以继承,使用.所以.equals 基本随时能用.
- /**
- * 实现Comparable接口,重写compareTo方法,返回值1,0,-1
- * 覆写compareTo方法就是重建排序规则
- */
- public int compareTo(Object obj) {
- Person p = (Person) obj;
- if (p.score > this.score) {
- return 1;
- } else if (p.score < this.score) {
- return -1;
- } else {
- // 如果成绩相等则判断年龄
- if (p.age > this.age) {
- return 1;
- } else if (p.age < this.age) {
- return -1;
- } else {
- return 0;
- }
- }
- }
1. == : 基本数据类型都用这个比较, Java里面包含8个基本数据类型,分别是: boolean、byte、char、short、int、float、double、long 注意String 可不属于基本数据类型,它是个类...
2..equals() 用于引用数据类型(除了上面的8个,都是引用数据类型,包括封装类,Object子类等), 比较是否指向相同的对象, 例如 String str = "abc"; 等效于: char data[] = {'a', 'b', 'c'}; String str = new String(data); 就是str 指向了 new String(data) 这个对象. 如果再有其他变量也指向这个对象,他们比较的结果就返回true; 由于此方法在Object里, 所以它有很多重写, 具体要看说明; 另外``` equalsIgnoreCase()可以忽略大小写;
Object和String的equals()实现存在区别,所以上面的例子不太友好。有demo在最后
3. compareTO可以比较两个字符串并且得到顺序. 按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。
String类 equals和compareTo源码分析:
- public boolean equals(Object anObject) {
- if (this == anObject) {
- return true;
- }
- if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = count;
- if (n == anotherString.count) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = offset;
- int j = anotherString.offset;
- while (n-- != 0) {
- if (v1[i++] != v2[j++])
- return false;
- }
- return true;
- }
- }
- return false;
- }
- public int compareTo(String anotherString) {
- int len1 = count;
- int len2 = anotherString.count;
- int n = Math.min(len1, len2);
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = offset;
- int j = anotherString.offset;
- if (i == j) {
- int k = i;
- int lim = n + i;
- while (k < lim) {
- char c1 = v1[k];
- char c2 = v2[k];
- if (c1 != c2) {
- return c1 - c2;
- }
- k++;
- }
- } else {
- while (n-- != 0) {
- char c1 = v1[i++];
- char c2 = v2[j++];
- if (c1 != c2) {
- return c1 - c2;
- }
- }
- }
- return len1 - len2;
- }
object 的默认equals实现:
- public boolean equals( Object o2 )
- {
- this == o2;
- }