java中很多地方用到了比较的方法:
最常见:
==和equals()的区别?
==:可以比较基本类型,也可以比较引用类型。
比较基本类型,比较的是值是否相同。
比较引用类型,比较的是地址值是否相同。
equals:
只能比较引用类型。
默认情况下,比较的是地址值是否相同。
如果想比较内容,需要重写Object类的equals()方法。
package blog;
public class Test {
public static void main(String[] args) {
// 等号用于比较基本数据类型
int a = 1;
int b = 1;
System.out.println(a==b); //结果是true
// equals 方法只能比较引用数据类型
String s1 = "a";
String s2 = "A";
String s3 = "a";
// 等号还可以比较引用数据类型
System.out.println(s1==s2); // 结果为false
System.out.println(s1.equals(s3)); // 结果为true
}
}
集合中的比较方法:
对于双列集合:
如果是哈希表结构,则首先调用hashCode()方法,然后调用equals方法进行比较
如果是红黑树结构,则
1.让元素实现Comparable接口重写其compareTo()方法
package blog;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
// 重写父类方法
@Override
public int compareTo(Person o) {
// 依据自定义的属性顺序比较元素对象是否相等
if (this.name.compareTo(o.name)==0) {
return this.age-o.age;
}
else {
return this.name.compareTo(o.name);
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
2.让集合集合本身继承Comparator接口或者自定义比较器并重写Compare()方法
import java.util.Comparator;
public class MyComparator implements Comparator<Person> {
// 比较年龄,通过年龄和姓名比较两元素大小
@Override
public int compare(Person o1, Person o2) {
// o1:新加入的元素 o2:集合中已经有的元素
System.out.println("o1:"+o1.getName());
System.out.println("o2:"+o2.getName());
// 自定义元素属性的比较顺序
int result = o1.getAge() - o2.getAge();
if(result==0) {
result = o1.getName().compareTo(o2.getName());
}
return result;
}
}
注意:自定义比较器让集合具有比较性可以使用匿名内部类的方式实现
<pre name="code" class="java">public class Test {
public static void main(String[] args) {
// 使用匿名内部内让集合具有比较性
TreeSet<Person> treeSet = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int result = o1.getAge() - o2.getAge();
if(result==0) {
result = o1.getName().compareTo(o2.getName());
}
return result;
}
});
}
}
细节:当元素的可比较性与比较器冲突时,以比较器为准!!!!!!!!!!!!

6053

被折叠的 条评论
为什么被折叠?



