set子接口
- 特点:无序、无下标、元素不可重复
- 方法:全部继承自Collection中的方法
set实现类
HashSet【重点】:
- 基于HashCode实现元素不重复。
- 当存入元素的哈希码相同时,会调用equals进行确认,如果为true,则拒绝后者存入。
import java.util.*;
public class SetDemo1 {
public static void main(String[] args) {
//创建集合
Set<String> set = new HashSet<>();
//1.添加元素 - 从运行结果可以看出:无序、不能重复
set.add("test1");
set.add("test3");
set.add("test2");
set.add("test2");
System.out.println("元素个数:" + set.size());
System.out.println(set.toString());
//2.删除元素
set.remove("test2");
set.remove(new String("test1"));
System.out.println("元素个数:" + set.size());
System.out.println(set.toString());
//3.遍历元素
set.add("test1");
set.add("test2");
System.out.println("--------增强for-------------");
for (String str:set) {
System.out.println(str);
}
System.out.println("--------使用迭代器-------------");
Iterator<String> it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//4.判断
System.out.println(set.contains("test1"));
System.out.println(set.isEmpty());
}
}
使用new关键字在集合中操作各种属性都相同的引用类型时,由于new出来的对象地址并不相同,导致某些操作的实现并不合理,这里可以使用重写HashCode方法以及equals方法,来判断两个对象是否一致。
具体的存储规则:
- 根据hashCode计算保存的位置,如果此位置为空,则直接保存,如果不为空则执行第二步。
- 再执行equals方法,如果equals方法为true,则认为是重复,否则形成链表。
TreeSet:
- 基于排列顺序实现元素不重复。
- 实现了SortedSet接口,对集合元素自动排序。
- 元素对象的类型必须实现Comparable接口,指定排序规则。
- 通过CompareTo方法确定是否为重复元素
import java.util.*;
public class setDemo2 {
public static void main(String[] args) {
//创建集合
TreeSet<String> treeSet = new TreeSet<>();
//1.添加元素 - 会自动排序;元素不重复
treeSet.add("bcd");
treeSet.add("abc");
treeSet.add("cde");
//treeSet.add("abc");//元素重复则不会添加成功
System.out.println("元素个数:" + treeSet.size());
System.out.println(treeSet.toString());
//2.删除元素
treeSet.remove("bcd");
System.out.println("元素个数:" + treeSet.size());
System.out.println(treeSet.toString());
//3.遍历
System.out.println("-------------增强for-----------------");
for(String str : treeSet){
System.out.println(str);
}
System.out.println("-------------使用迭代器-----------------");
Iterator<String> it = treeSet.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//4.判断
System.out.println(treeSet.isEmpty());
System.out.println(treeSet.contains("abc"));
}
}
如果集合元素拥有多种属性时,treeSet集合会怎么进行排序的呢?
元素必须实现Comparable接口,重写CompareTo,如果返回值为0,则认为是重复元素,设计自己需要的排序规则。
如果没有操作这一步骤,将会在添加元素时就出错。
例如:
//在类中实现Comparable接口
class Person implements Comparable<Person>{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
//重写compareTo函数
@Override
public int compareTo(Person o) {
//在这里指定比较规则 - 本案例:先按姓名比较,再按年龄比较
int n1 = this.getName().compareTo(o.getName());
int n2 = this.getAge() - o.getAge();
return n1 == 0 ? n2 : n1;
}
}