java集合中的比较方式

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;
			}
		});
	}
}

 细节:当元素的可比较性与比较器冲突时,以比较器为准!!!!!!!!!!!! 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值