Set是一个接口
- 无序
- 不重复
- 实现类有HashSet TreeSet
HashSet
Set hs = new HashSet();
hs.add("1");
hs.add("2");
hs.add("abc");
hs.add("ab");
hs.add(123);
hs.add('a');
for(Object val : hs) {
System.out.print(val + ",");
}
==> 打印结果:1,ab,a,2,abc,123,
- remove() 删除方法
hs.remove("abc");
System.out.println("\n==========删除后=============");
for(Object val : hs) {
System.out.print(val + ",");
}
==> 打印结果:1,ab,a,2,123,
- remove() + add() 模拟修改
hs.remove('a');
hs.add('b');
System.out.println("\n==========模拟修改后=============");
for(Object val : hs) {
System.out.print(val + ",");
}
==> 打印结果:1,ab,2,b,123,
- contains() 查询方法
System.out.println("\n==========查询=============");
boolean flag = hs.contains('b');
System.out.println("是否包含b: " + flag);
==> 打印结果:是否包含b: true
泛型
- 所谓的泛型就是在集合中指定存放的具体数据类型
Set<String> hs1 = new HashSet<String>();
这样就只能存储字符串String类型
Set<Integer> hs2 = new HashSet<Integer>();
这样就只能存数字Integer类型
存储高级数据无法去重
- Person类,Student类
Set hs3 = new HashSet();
Student s1 = new Student("s1", "101", 10);
Student s2 = new Student("s1", "101", 10);
Student s3 = new Student("s2", "102", 30);
hs3.add(s1);
hs3.add(s2);
hs3.add(s3);
for (Object a : hs3) {
System.out.println(a);
}
==> 打印结果
* Student [name=s1, className=101, score=10.0]
* Student [name=s2, className=102, score=30.0]
* Student [name=s1, className=101, score=10.0]
-
解决方法
我们需要在自定义类中左键生成hashcode() and equals() 方法。
image.png
-
Student.java
public class Student {
String name;
String className;
float score;
public Student(String name, String className, float score) {
super();
this.name = name;
this.className = className;
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", className=" + className + ", score=" + score + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((className == null) ? 0 : className.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + Float.floatToIntBits(score);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (className == null) {
if (other.className != null)
return false;
} else if (!className.equals(other.className))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (Float.floatToIntBits(score) != Float.floatToIntBits(other.score))
return false;
return true;
}
}
TreeSet
- 无序 (如果全是字母按照abcd排序,如果全是数字按照数字大小排序)
- 只能存贮可以相互比较大小的数据。
字母
Set ts1 = new TreeSet();
ts1.add("5");
ts1.add("99");
ts1.add("-1");
ts1.add("0.77");
ts1.add("0");
for(Object a : ts1) {
System.out.print(a + ",");
}
- 打印结果 : a,aa,bb,bbb,c,
数字
Set ts2 = new TreeSet();
ts2.add(5);
ts2.add(99);
ts2.add(-1);
ts2.add(77);
ts2.add(0);
for(Object b : ts2) {
System.out.print(b + ",");
}
- 打印结果 : -1,0,5,77,99,
自定义类 Person
class Person {
String name;
int age;
/**
* @param name
* @param age
*/
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
TreeSet 添加自定义类
Person p1 = new Person("疯子", 18);
Person p2 = new Person("傻子", 98);
Set ts3 = new TreeSet();
ts3.add(p1);
ts3.add(p2);
for(Object person : ts3) {
System.out.println(person);
}
- 执行结果:报错 => Exception in thread "main" java.lang.ClassCastException: javaDemo3.Person cannot be cast to java.lang.Comparable
why? 因为他们是无法比较大小的数据。
TreeSet添加对象使用Comparable接口
class PersonSet implements Comparable {
String name;
int age;
/**
* @param name
* @param age
*/
public PersonSet(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "PersonSet [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
- compareTo 是重点
PersonSet p1 = new PersonSet("疯子", 18);
PersonSet p2 = new PersonSet("傻子", 98);
Set ts3 = new TreeSet();
ts3.add(p1);
ts3.add(p2);
for(Object person : ts3) {
System.out.println(person);
}
- 执行上面的代码打印: PersonSet [name=疯子, age=18]
- 只打印了一条,如何能存储多个对象呢?
修改 PersonSet 的 compareTo 方法,手动进行比较。
class PersonSet implements Comparable {
String name;
int age;
/**
* @param name
* @param age
*/
public PersonSet(String name, int age) {
super();
this.name = name;
this.age = age;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
@Override
public String toString() {
return "PersonSet [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
// Object o 等于第二个对象
PersonSet person2 = (PersonSet) o;
int age1 = this.getAge(); // 第一个对象的age
int age2 = person2.getAge(); // 第二个对象的age
// 对比大小
if (age1 > age2) {
return 1;
} else if (age1 == age2) {
return 0;
} else {
return -1;
}
}
}
- 继续执行上面的代码打印结果:
PersonSet [name=疯子, age=18]
PersonSet [name=傻子, age=98]
网友评论