Set集合
1.set集合的特点
1.无序
2.不可重复
2.set的便利方式
1.foreach
Set<Object> set = new HashSet<Object>();
set.add("a");
set.add("f");
set.add("a");
set.add("d");
for (Object s : set) {
System.out.println(s);
}
}
2.iterator(迭代器)
Set<Object> set = new HashSet<Object>();
set.add("a");
set.add("f");
set.add("a");
set.add("d");
Iterator<Object> it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
3.HashSet去重复元素的方法
首先我们要明白生成对象时那些东西确定了对象的唯一性
1.对象属性所对应的值
2.生成对象时的地址(如果我们没有重写对象hashCode方法那么每次生成一个新的对象的时候就会生成一个新的地址详情请参考我的另一篇博客博客hashCode和内存地址关系以及hashCode去重复原理)
HashSet去重复元素的方法就是先判断对象的地址是否相同,然后再判断对象各个属性所对应的值是否相同
先调用hashCode方法判断地址是否相同
如果相同在调用equals判断对象对应的各个属性是否相同如果相同就判断为重复就不添加进去
添加第一个小明的时候只调用了hashCode方法因为没有相同重复的地址
添加第二个小明的时候先调用了hashCode方法因为有重复的地址所以调用了equals方法
4.ThreeSet(自然排序和比较器排序)
特点:
1,不重复
2,可以用比较器排序设置排序的方式
1,自然排序 (代码展示!)(treeSet对集合中元素进行排序时,需在添加元素时调用Comparable接口的compareTo方法,则String 和Integer 类就实现了Comparable接口)
public class Dome03 {
public static void main(String[] args) {
Set<Object> set=new TreeSet<>();
set.add(new Students("aa", 11));
set.add(new Students("bb", 22));
set.add(new Students("cc", 33));
set.add(new Students("dd", 44));
set.add(new Students("bb", 22));
for (Object object : set) {
System.out.println(object);
}
}
}
class Students implements Comparable{
private String name;
private int age;
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 "Students [name=" + name + ", age=" + age + "]";
}
public Students(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
Students s = (Students) o;
// 按照年龄升序
return this.age - s.getAge();
}
}
2,比较器排序 (使用内部类创建Comparator实现类,相比自然排序更加灵活)
public class Dome04 {
public static void main(String[] args) {
//使用内部类创建Comparator实现类
Set<student1> set=new TreeSet<>(new Comparator<student1>() {
@Override
public int compare(student1 o1, student1 o2) {
//根据年龄升序
// return o1.getAge()-o2.getAge();
//根据首字母
String name1=((student1) o1).getName();
String name2=((student1) o2).getName();
return name1.compareTo(name2);
}
});
set.add(new student1("王二", 11));
set.add(new student1("李四", 22));
set.add(new student1("麻子", 33));
set.add(new student1("老五", 44));
set.add(new student1("李四", 22));
for (student1 s : set) {
System.out.println(s);
}
}
}
class student1{
private String name;
private int age;
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 "student1 [name=" + name + ", age=" + age + "]";
}
public student1(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
运行结果:(可以根据自己设定的排序方式排序更为灵活)
感谢观看