Java中的集合二

本文的核心内容:Java中的集合Set。

 

Set接口:元素无顺序 元素内容不可以重复

实现类HashSet、 LinkedHashSet、TreeSet

一:Set接口遍历的方式

1:迭代器遍历

public static void main(String[] args) {
   Set<String> list=new HashSet<>();
   list.add("Tom");
   list.add("Jack");
   list.add("Peter");
   list.add("Jane");
   list.add("Tom");
    print(list);

}

//用泛型封装了类型
public static <T> void print (Collection<T> c)
{
    Iterator<T> it=c.iterator();
    while(it.hasNext())
    {
        T t=it.next();
        System.out.println(t);
    }
}

 

2:for遍历

 

public static <T> void print2 (Collection<T> c)
{
    for(T t:c)
    {
        System.out.println(t);
    }
}

 

3:forEach遍历

 

public static <T> void print3 (Collection<T> c)
{
   c.forEach(new Consumer<T>() {
       @Override
       public void accept(T t) {
           System.out.println(t);
       }
   });
}

 

二:Set接口元素去重

①HashSet

如果将自定义的类对象存入HashSet需要重写Object类的hasCode()和equals()方法,否则相同元素无法去重。

public static void main(String[] args) {
   Set<Student> list=new HashSet<>();
    list.add(new Student("Tom",15));
    list.add(new Student("Jack",11));
    list.add(new Student("Jane",18));
    list.add(new Student("Peter",25));
    list.add(new Student("Tom",15));
    print3(list);
}

class Student
{
    String name;
    int age;
    public Student(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    @Override
    public String toString(){
        return "[Student:name="+this.name+" age="+this.age+"]";
    }
    @Override
    public int hashCode() {
        final int prime=31;
        int result=1;
        result=prime*result+age;
        result=prime*result+((name==null) ?0 : name.hashCode());
        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 (  age!=other.age  )
            return false;
        if (   name==null)
        {
            if (other.name!=null)
                return false;
        }else if (!name.equals(other.name))
        return  false;
        return true;
    }
}

 

②实现类LinkedHashSet为HashSet的子类, 维护元素添加到Set中的顺序。(如果要使用 LinkedHashSet 的话,也必须正确的覆盖对象的 hashCode 和equals 方法)

 

 

③TreeSet集合是Set集合的另一个实现类,它内部采用自平衡的排序二叉树来存储元素。

如果将自定义的类对象存入TreeSet,在构造TreeSet集合时需要传入比较器,去除重复元素。

public static void main(String[] args) {
    Comparator<Student> c=new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            if(o1.age!=o2.age)
                return o1.age-o2.age;
            else 
                return o1.name.compareTo(o2.name);
        }
    };
    Set<Student> list=new TreeSet<>(c);
    list.add(new Student("Tom",15));
    list.add(new Student("Jack",11));
    list.add(new Student("Jane",18));
    list.add(new Student("Peter",25));
    list.add(new Student("Tom",15));
    Iterator it=list.iterator();
    while(it.hasNext())
    {
        System.out.println(it.next());
    }
}

 

队列Queue  先进先出

 

常用方法:

                            add();   offer();

//添加队列满时,区别是,对于有界队列add()方法会抛出异常,offer()方法会返回一个false值。

                            romove();   poll();

//移除,当队列为空时,remove()会抛出异常,pill()不会抛异常,返回一个空指针。

                            elment();     peek();

//获取队头元素,elment();会抛异常 ,peek()不会抛异常,返回一个空指针

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值