标题:java集合判断对象相等和比较大小的方法
- 判断Java集合对象相同:
(1)判断equals是否返回true;
(2)判断hascode是否相等;
package edu.xalead;
import java.util.HashSet;
public class Test {
/**
* 相同的哈希码,对象相同
*/
public static void main(String[] args) {
HashSet q = new HashSet();
q.add("hello");
q.add("hello");
q.add("hello");
System.out.println(q.size());
q = new HashSet();
q.add(13);
q.add(13);
q.add(13);
System.out.println(q.size());
q = new HashSet();
q.add(new Student("KAAK",143536,'女'));
q.add(new Student("KAAK",143536,'女'));
q.add(new Student("KAAK",143536,'女'));
System.out.println(q.size());
HashSet w = new HashSet();
w.add(new Student1("jiaja",143536,'男'));
w.add(new Student1("jiaja",143536,'男'));
w.add(new Student1("jiaja",143536,'男'));
System.out.println(w);
System.out.println(w.size());
}
// c = new HashSet();
// c.add(new Student(222,"旺达"));
// c.add(new Student(222,"旺达"));
// c.add(new Student(222,"旺达"));
// System.out.println(c.size())
}
在Student1未继承Object或未实现接口Comparable时,w.size=3,因为每new一次Student1对象,地址不同.
测试结果:
package edu.xalead;
import java.util.Objects;
public class Student1 extends Object {
private String name;
private int id;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student1 student1 = (Student1) o;
return id == student1.id &&
sex == student1.sex &&
Objects.equals(name, student1.name);
}
@Override
public int hashCode() {
return Objects.hash(name, id, sex);
}
private char sex;
// @Override
// public boolean equals(Object obj) {
// if (obj instanceof Student1){ //obj是Student1的示例
// Student1 s = (Student1) obj;
// if(s.id == this.id &&
// s.name.equals(this.name)&&
// s.sex==this.sex)
// return true;
// }
// return false;
//}
//
// public int hashCode(){
// return new Integer(id).hashCode() + name.hashCode() + new Character(sex).hashCode();
// }
@Override
public String toString() {
return "Student1{" +
"name='" + name + '\'' +
", id=" + id +
", sex=" + sex +
'}';
}
public Student1(String name, int id, char sex) {
this.name = name;
this.id = id;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
2.java集合比较大小:
(1) 继承接口Comparable的compareTo方法.
package edu.xalead;
import java.util.Objects;
public class Student implements Comparable{
private String name;
private int id;
private char sex;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", id=" + id +
", sex=" + sex +
'}';
}
public Student(String name, int id, char sex) {
this.name = name;
this.id = id;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
// public boolean equals(Object obj){
// if(obj instanceof Student){ //前面的引用是否是后面对象的示例
// Student s = (Student) obj;
// if(s.id==this.id
// && s.name.equals(this.name) // 字符串也是对象,对象比较用equals
// && s.sex==this.sex)
// return true;
// }
// return false;
// }
// public int hascode(){
// return new Integer(id).hashCode()
// + name.hashCode() +
// new Character(sex).hashCode();
@Override
//equals值返回true
public boolean equals(Object o) { //比较对象内容是否相同
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return id == student.id &&
sex == student.sex &&
Objects.equals(name, student.name);
}
@Override
//hashCode 相同
public int hashCode() {
return Objects.hash(name, id, sex);
}
@Override //排序的接口 compareTo
public int compareTo(Object o) { //对象类型引用 o是Object类型的 可引用调用自己的方法
if(o instanceof Student){ // o是student的实例化
Student s = (Student) o; //强行类型转换
// if(this.id >s.id) { //this是指向对象的
// return 1;
// } else if (this.id <s.id){
// return -1;
// }
// return 0;
if(this.id >s.id) {
return -1;
} else if (this.id <s.id){
return 1;
}
return 0;
}
throw new RuntimeException("类型不匹配无法比较大小");//沿调用栈向上传 抛出异常
//return 0;//自己==传进来的对象
}
}
测试:
package edu.xalead;
import java.util.Iterator;
import java.util.TreeSet;
public class Test2 {
public static void main(String[] args) {
TreeSet s = new TreeSet(); //放进去的元素已排好序
s.add(19);
s.add(16);
s.add(14);
s.add(15);
//迭代
Iterator iter = s.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
s = new TreeSet();
s.add(new Student("hany",143554,'男'));
s.add(new Student("gdhbf",546465,'女'));
s.add(new Student("fegdvff",353475,'男'));
iter = s.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
测试结果:
Set和Collection遍历常用迭代器iterator