Java基础学习笔记二十七 容器(Set接口)

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;
			}
		}
		
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值