1.set是什么?
set集合是一个无序不重复元素的集
2.set特点
特点:输出与添加顺序不同,只有增删查,无下标,无法修改, 足以证明无序 并且不可重复。
以下代码验证:
public static void main(String[] args) { // 实例化 HashSet hs=new HashSet<>(); hs.add("jun"); hs.add("lin"); hs.add("yi"); hs.add("马牛逼"); boolean remove = hs.remove("马牛逼"); System.out.println(remove);//true System.out.println(hs); // 不可重复 hs.add("马牛逼"); System.out.println(hs); } //输出结果:只有一个马牛逼 true [lin,yi,jun] [lin,yi,jun,马牛逼]
3.set集合的遍历
只有两种:1.foreach 2.iterator(迭代器)
public static void main(String[] args) { HashSet hs=new HashSet<>(); hs.add("jun"); hs.add("lin"); hs.add("yi"); //foreach for (Object object : hs) { System.out.println(object); } //迭代器 Iterator it=hs.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } //输出结果: lin lin yi yi jun jun
4.set集合的去重原理
去重:它是先经过对象hashCode的值,进行筛选。如果hashCode的值相同,它就会进行下一个方法equals 在做对比,equals也相同,它就会判定为同一个对象
如果包含返回true,如果不包含返回false。
public class demo3 { public static void main(String[] args) { HashSet hs=new HashSet<>(); hs.add("jun"); hs.add("lin"); hs.add("yi"); System.out.println(hs.contains("lin"));//true } }
4.1默认生成的,调用一次equals
public class demo3 { public static void main(String[] args) { HashSet hs=new HashSet<>(); hs.add("jun"); hs.add("lin"); hs.add("yi"); //System.out.println(hs.contains("lin"));//true //对象增加 hs.add(new DX(1,"老六")); hs.add(new DX(2,"靓仔")); hs.add(new DX(3,"土狗")); System.out.println(hs.contains(new DX(3,"土狗"))); } } //对象 class DX{ private int id; private String name; public DX() { // TODO Auto-generated constructor stub } public DX(int id, String name) { super(); this.id = id; this.name = name; } 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 int hashCode() { System.out.println("hashCode被调用了。。。"); final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { System.out.println("equals被调用了。。。"); if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; DX other = (DX) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "DX [id=" + id + ", name=" + name + "]"; } }
结果:
4.2写死了多次调用equals
public class demo3 { public static void main(String[] args) { HashSet hs=new HashSet<>(); hs.add("jun"); hs.add("lin"); hs.add("yi"); //System.out.println(hs.contains("lin"));//true //对象增加 hs.add(new DX(1,"老六")); hs.add(new DX(2,"靓仔")); hs.add(new DX(3,"土狗")); System.out.println(hs.contains(new DX(3,"土狗"))); } } //对象 class DX{ private int id; private String name; public DX() { // TODO Auto-generated constructor stub } public DX(int id, String name) { super(); this.id = id; this.name = name; } 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 int hashCode() { System.out.println("hashCode被调用了。。。"); return 1; } @Override public boolean equals(Object obj) { System.out.println("equals被调用了。。。"); if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; DX other = (DX) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "DX [id=" + id + ", name=" + name + "]"; } }
结果为:
4.3几乎不相同所以几乎不会调用equals
public class demo3 { public static void main(String[] args) { HashSet hs=new HashSet<>(); hs.add("jun"); hs.add("lin"); hs.add("yi"); //System.out.println(hs.contains("lin"));//true //对象增加 hs.add(new DX(1,"老六")); hs.add(new DX(2,"靓仔")); hs.add(new DX(3,"土狗")); System.out.println(hs.contains(new DX(3,"土狗"))); } } //对象 class DX{ private int id; private String name; public DX() { // TODO Auto-generated constructor stub } public DX(int id, String name) { super(); this.id = id; this.name = name; } 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 int hashCode() { System.out.println("hashCode被调用了。。。"); return (int) (Math.random()*1000000); } @Override public boolean equals(Object obj) { System.out.println("equals被调用了。。。"); if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; DX other = (DX) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "DX [id=" + id + ", name=" + name + "]"; } }
结果为:
5.set集合之排序
5.1TreeSet
两种排序为(自然排序: java.lang.comparable,比较器排序 :java.util.comparator)
特点:
自然排序:有默认排序规则
比较器排序 :同一组数据展示不同的形式 多样的处理
5.2 自然排序 Comparable的使用
public class demo4 { public static void main(String[] args) { HashSet hs=new HashSet<>(); hs.add(new Person(1,24,"老六",100000)); hs.add(new Person(2,18,"靓仔",120000)); hs.add(new Person(3,28,"土狗",10000)); hs.add(new Person(4,48,"马牛逼",100000)); //默认排序 for (Object object : hs) { System.out.println(object); } //对数据进行加工 TreeSet ts=new TreeSet<>(); for (Object object : hs) { ts.add(object); } System.out.println("----------------------------------------------"); //java.lang.Comparable for (Object object : ts) { System.out.println(object); } } } class Person implements Comparable<Person>{ private int id; private int age; private String name; private double money; public Person() { // TODO Auto-generated constructor stub } public Person(int id, int age, String name, double money) { super(); this.id = id; this.age = age; this.name = name; this.money = money; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "Person [id=" + id + ", age=" + age + ", name=" + name + ", money=" + money + "]"; } @Override public int compareTo(Person o) { // this 被比较对象 return this.id - o.id;//(升序) // return o.id - this.id;(降序) } }
结果为:横线下是升序
5.3 比较器排序Comparator 的使用
public static void main(String[] args) { HashSet hs=new HashSet<>(); hs.add(new Person(1,24,"老六",100000)); hs.add(new Person(2,18,"靓仔",120000)); hs.add(new Person(3,28,"土狗",10000)); hs.add(new Person(4,48,"马牛逼",140000)); TreeSet ts2=new TreeSet<>(new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return (int) (o2.getMoney() - o1.getMoney()); } }); for (Object object : hs) { ts2.add(object); } for (Object object : ts2) { System.out.println(object); } } class Person implements Comparable<Person>{ private int id; private int age; private String name; private double money; public Person() { // TODO Auto-generated constructor stub } public Person(int id, int age, String name, double money) { super(); this.id = id; this.age = age; this.name = name; this.money = money; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "Person [id=" + id + ", age=" + age + ", name=" + name + ", money=" + money + "]"; } @Override public int compareTo(Person o) { return o; } }
结构为:
结论:如需求比较 ,--点get属性。