Set接口
Set接口继承自Collection,Set接口没有新增方法,方法和Collection完全一致。
Set容器特点:无序、不可重复。无序指Set中的元素没有索引,只能遍历查找;不可重复指不允许加入重复元素。
Set常用的实现类有:HashSet、TreeSet等。
/**
* HashSet的基本用法
*/
import java.util.HashSet;
import java.util.Set;
public class TestHashSet {
public static void main(String[] args){
Set<String> set1 = new HashSet<>();
set1.add("aa");
set1.add("bb");
set1.add("aa");
System.out.println(set1);
set1.remove("bb");
System.out.println(set1);
Set<String> set2 = new HashSet<>();
set2.add("Jsp");
set2.addAll(set1);
System.out.println(set2);
}
}
运行结果:
[aa, bb]
[aa]
[aa, Jsp]
自定义实现HashSet
import java.util.HashMap;
public class JspHashSet {
HashMap map;
private static final Object PRESENT = new Object();
public JspHashSet(){
map = new HashMap();
}
public int size(){
return map.size();
}
public void add(Object o){
map.put(o,PRESENT);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(Object key:map.keySet()){
sb.append(key+",");
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
public static void main(String[] args){
JspHashSet set = new JspHashSet();
set.add("A");
set.add("B");
set.add("C");
System.out.println(set);
}
}
TreeSet的使用和底层实现
TreeSet底层是用TreeMap实现的,内部维持了一个简化版的TreeMap。通过key来存储Set的元素。TreeSet内部需要对存储的元素进行排序,因此,对应的类需要实现Comparable接口。
示例:TreeSet和Comparable接口的使用
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args){
User u1 = new User(1001,"Jsp",18);
User u2 = new User(2001,"Pjs",6);
Set<User> set = new TreeSet<User>();
set.add(u1);
set.add(u2);
}
}
class User implements Comparable<User> {
int id;
String uname;
int age;
public User(int id,String uname,int age) {
this.id = id;
this.uname = uname;
this.age = age;
}
@Override
public int compareTo(User o){
if(this.id>o.id){
return 1;
}else if(this.id<o.id){
return -1;
}else{
return 0;
}
}
}
Test:
import java.util.Set;
import java.util.TreeSet;
public class TestTreeSet {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<>();
set.add(300);
set.add(200);
set.add(600);
for(Integer m:set){
System.out.println(m);
}
Set<Emp2> set2 = new TreeSet<>();
set2.add(new Emp2(100,"A",3000));
set2.add(new Emp2(50,"B",2000));
set2.add(new Emp2(150,"C",8000));
set2.add(new Emp2(30,"D",20000));
for(Emp2 m:set2){
System.out.println(m);
}
}
}
class Emp2 implements Comparable<Emp2> {
int id;
String name;
double salary;
public Emp2(int id, String name, double salary) {
super();
this.id = id;
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "id:"+id+",name:"+name+",salary:"+salary;
}
@Override
public int compareTo(Emp2 o) {
if(this.salary>o.salary){
return 1;
}else if(this.salary<o.salary){
return -1;
}else{
if(this.id>o.id){
return 1;
}else if(this.id<o.id){
return -1;
}else{
return 0;
}
}
}
}