今天总结Collection的另一个子接口Set.
set接口主要要掌握三个实现类:HashSet、LinkedHashSet、TreeSet。
HashSet特点:
1.无序性
2.不能添加重复元素
3.最多只能有一个空值
4.不是线程安全
LinkedHashSet特点:
1.LinkedHashSet继承于HashSet
2.可以按照添加顺序排序,其余特性与HashSet相同
TreeSet特点
1.不能添加重复元素
2.最多只能有一个空值
3.不是线程安全
3.除了上面三个特点以外,典型的特性在于TreeSet可以自动排序(自然排序),排序调用元素的compareTo()方法
Set的实现类不可添加重复元素。关于元素是否重复,基本数据类型很好判断。对于自定义类,就比较困难了。利用构造器创建对象,即使所有参数相同,创建的对象也不是重复对象,因为对象的地址不同。
eg;
public class MidscStudent { private int age; private int id; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "MidscStudent [age=" + age + ", id=" + id + ", name=" + name + "]"; } public MidscStudent(int age, int id, String name) { super(); this.age = age; this.id = id; this.name = name;
}
Set<MidscStudent> mids=new HashSet<MidscStudent>();
MidscStudent mids1=new MidscStudent(12, 13, "刘备");
MidscStudent mids1=new MidscStudent(12, 13, "刘备");
毫无意外,mids1和mids2是两个不同对象。
但是,我们一般都要把mids1和mids2当做相同对象处理,这样该怎么办?
处理办法是在自定义类种重写equals方法和hashCode方法。
public class MidscStudent { private int age; private int id; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "MidscStudent [age=" + age + ", id=" + id + ", name=" + name + "]"; } public MidscStudent(int age, int id, String name) { super(); this.age = age; this.id = id; this.name = name; } @Override public int hashCode() { return 1; } @Override public boolean equals(Object obj) { if(!(obj instanceof MidscStudent)) { return false; } MidscStudent a=(MidscStudent) obj; if(this.age==a.age && this.id==a.id && this.name!=null && this.name.equals(a.name)) { return true; }else { return false; } } }
这样一来,mids1和mids2就是相同元素了。
小知识;
可变参数:对一下操作,参数的数量不是固定的,是可变动的,程序员不可能针对每种数量的参数分别写一个方法。这时候就可以用可变参数。
例如求和。我们有两个参数的求和,三个参数求和。
public int add(int a,int b) {
int sum=a+b;
return sum;
}
//三个参数相加
public int add1(int a,int b,int c) {
int sum=a+b+c;
return sum;
如果一个项目要用到多个求和,我们不可能写多个求和方法。这时候我们可以使用可变参数。
//n个参数相加
public int add(int... p) {//int.. p就是一个整数数组,int...相当于int[]
int sum=0;
for(int i=0;i<p.length;i++) {
sum=sum+p[i];
}
return sum;
}
这样主函数里就可以引入一个int[] 数组对象,作为参数,使用该方法。
当然,可变参数不仅对int数据类型有用,对所有的数据类型和类都有效。