1.set集合的特点
- 容器中不会出现重复的元素;
- set相较于List集合,是没有下标的;
2.set集合的遍历方式
package com.tft.set;
import java.util.HashSet;
import java.util.Iterator;
public class Demo01 {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("zs");
set.add("pp");
set.add("hh");
System.out.println(set);
for (String string : set) {
System.out.println(string);
}
Iterator< String > it = set.iterator();
if (it.hasNext()) {
System.out.println(it.next());
}
}
}
3.set集合去重原理
- 1.hashset底层去重,与hashcode、equals方法相关
- 2.是优先对比hashcode值在对比equals值,当hashcode值相同,并且equals返回值为true,则认定为重复元素
- ①hashcode值不同,就不会调用equals方法进行比较了
- ②hashcode值相同,才会调用equals方法,并且equals返回值为false,则认定不是重复元素
package com.tft.set;
import java.util.HashSet;
public class Demo02 {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
Person p1 = new Person("tft", 14, 9999);
Person p2 = new Person("ff", 19, 3333);
Person p3 = new Person("hh", 17, 8888);
Person p4 = new Person("tft", 14, 9999);
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
System.out.println(set.size());
for (Person person : set) {
System.out.println(person);
}
}
}
class Person {
private String name;
private int age;
private float salary;
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;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", salary=" + salary + "]";
}
public Person(String name, int age, float salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
public int hashCode() {
System.out.println("===hashcode===");
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + Float.floatToIntBits(salary);
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;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (Float.floatToIntBits(salary) != Float.floatToIntBits(other.salary))
return false;
return true;
}
}
4.TreeSet自然排序接口&比较器排序
- 自然排序:treeset相较于hashset是可以进行排序的 例子:按照首字母进行排序
- 比较排序:treeSet中的元素想要排序,那么必须实现java.lang.Comparable接口
- 案例:
package com.tft.set;
import java.util.HashSet;
public class Demo02 {
class Person implements Comparable<Person>{
private String name;
private int age;
private float salary;
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;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", salary=" + salary + "]";
}
public Person(String name, int age, float salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
public int compareTo(Person p) {
return (int) (this.salary-p.salary);
}
}
}
package com.tft.set;
import java.util.TreeSet;
public class Demo03 {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<>((x,y)->x.getAge() - y.getAge());
Person p1 = new Person("zs", 28, 9000);
Person p2 = new Person("ls", 18, 7000);
Person p3 = new Person("ww", 22, 6000);
set.add(p1);
set.add(p2);
set.add(p3);
for (Person person : set) {
System.out.println(person);
}
}
}