[color=red]关于集合:
ArraryList有序的集合,像数组一样,只不过存放的是每个对象的引用,可能存放的很多的引用是指向同样一个对象的。
HashSet存放之前先比较是否集合中有相等的对象,有就不存放,没有则存放进去[/color]
[b]一、equal[/b]
声明格式
public boolean equals(Object obj)
其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.
为什么要设计equals方法在Object中?
因为任何时候我们定义自己类的时候,我们可以选择是否重写equals方法,增加了灵活性,如果我们不重写,就是继承与Object的equals方法,判断我们对象是否相等。
[b]二、==[/b]
其比较规则为:当操作对象是基本类型时比较的是值是否相等1==1(true),当比较的是两个对象时则比较的是对象引用地址是否相同,即是否是同一对象
[color=red]但是[/color]JDK类中有一些类覆盖了Oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
[color=red]java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)[/color]
比如
Integer int1=new Integer(1);
Integer int2=new Integer(1);
String str1=new String("hello");
String str2=new String("hello");
int1==int2 (false,因为不同对象)
int1.equals(int2) (TRUE)
str1==str2 (false)
str1.equals(str2) (true)
[b]三、ArrayList与HashSet:[/b]
ArrayList是有序 允许重复;HashSet不允许重复
ArrayList存放的是对象的引用,有可能重复存放同一个对象的引用
而HashSet不允许重复,所以在添加对象到HashSet中时会做查找比较,如果对象很多的话一一做比较会降低效率,[color=red]进而产生hashcode.(hashcode是哈希算法的一中简单实现[/color],他是一个对象的哈希吗值,每个对象都可以换算成一个hashcode值,而我们把一个集合分成N个区域,每个区域都有上线限,我们按照某种规则把对象放个某个区域内,当我们去查询遍历的时候按照这个规则去找就可以很快的找到该对象所在的区域进而在小范围内很快的找到该对象。)
举例
Junit
先使用hashcode,再使用equal,将大大优化执行效率!
[color=red]注:使用hashcode的前提是对象必须是存储在hash集合当中[/color]
ArraryList有序的集合,像数组一样,只不过存放的是每个对象的引用,可能存放的很多的引用是指向同样一个对象的。
HashSet存放之前先比较是否集合中有相等的对象,有就不存放,没有则存放进去[/color]
[b]一、equal[/b]
声明格式
public boolean equals(Object obj)
其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.
为什么要设计equals方法在Object中?
因为任何时候我们定义自己类的时候,我们可以选择是否重写equals方法,增加了灵活性,如果我们不重写,就是继承与Object的equals方法,判断我们对象是否相等。
[b]二、==[/b]
其比较规则为:当操作对象是基本类型时比较的是值是否相等1==1(true),当比较的是两个对象时则比较的是对象引用地址是否相同,即是否是同一对象
[color=red]但是[/color]JDK类中有一些类覆盖了Oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
[color=red]java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)[/color]
比如
Integer int1=new Integer(1);
Integer int2=new Integer(1);
String str1=new String("hello");
String str2=new String("hello");
int1==int2 (false,因为不同对象)
int1.equals(int2) (TRUE)
str1==str2 (false)
str1.equals(str2) (true)
[b]三、ArrayList与HashSet:[/b]
ArrayList是有序 允许重复;HashSet不允许重复
ArrayList存放的是对象的引用,有可能重复存放同一个对象的引用
而HashSet不允许重复,所以在添加对象到HashSet中时会做查找比较,如果对象很多的话一一做比较会降低效率,[color=red]进而产生hashcode.(hashcode是哈希算法的一中简单实现[/color],他是一个对象的哈希吗值,每个对象都可以换算成一个hashcode值,而我们把一个集合分成N个区域,每个区域都有上线限,我们按照某种规则把对象放个某个区域内,当我们去查询遍历的时候按照这个规则去找就可以很快的找到该对象所在的区域进而在小范围内很快的找到该对象。)
举例
public class GuestBook
{
private int id;
private String name;
private String address;
public GuestBook(){
}
public GuestBook(int id){
this.id = id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
GuestBook other = (GuestBook) obj;
if (id != other.id)
return false;
return true;
}
}
Junit
@Test
public void testCollection() {
Collection col = new HashSet();
GuestBook g1 = new GuestBook(1);
GuestBook g2 = new GuestBook(2);
GuestBook g3 = new GuestBook(2);
col.add(g1);
col.add(g2);
col.add(g3);
col.add(g1);
// 不重写hashcode和equals是3个
System.out.println(col.size());
// 重写hashcode和equals是2个
System.out.println(col.size());
/*只重写equals是3个,由于没有重写hashcode方法,默认
g2与g3的hashcode由他们不同的内存地址来计算存放在不的区域,所以还是可以add进去;
因为此问题所以有个默认的规则是如果两个对象equals相等则同时保证hashcode也相等*/
System.out.println(col.size());
// 重写hashcode和equals是1个
col.remove(g1);
System.out.println(col.size());
// 重写hashcode和equals是2个
g1.setId(3);
col.remove(g1);// hashcode已变找不到对应的对象,所以尽量不要修改参与hashcode运算的字段,会造成内存泄露
System.out.println(col.size());
}
先使用hashcode,再使用equal,将大大优化执行效率!
[color=red]注:使用hashcode的前提是对象必须是存储在hash集合当中[/color]