JAVA集合--HashSet和TreeSet集合

//JAVA集合,是用于存放对象的容器,只能存放对象(基本数据类型也会被转换为对象),不限数量

//集合可分为Set,List,Map三大类
//Set:无序,不可重复的
//List:有序,可重复的
//Map:具有映射关系的集合

//JDK5之后增加了泛型,可以记住容器中对象的数据类型

Set集合

1.HashSet集合

//HashSet是Set接口的典型实现,按Hash算法来存储元素
//不能保证排列顺序,不可重复(hashCode不相等),不是线程安全的,集合元素可以是null

导包:

在使用之前当然是要导入包啦,Set和HashSet均存在于java.util下

import java.util.HashSet;
import java.util.Set;

创建对象:

Set set = new HashSet();
Set<Object> set1 = new HashSet<Object>();

这里使用了一个泛型<Object>来限制了集合的数据类型,然并卵,Object是所有类的父类,意思是所有类都能被存入这个集合,这里也就没有起到实质的限制作用了,和上面的一行没什么区别,

但若指明是其他数据类型,则这个集合只能存放那个类型的对象,例如:

Set<String> strSet = new HashSet<String>();

加入元素:

创建好一个HashSet集合对象后就可以向其中加入元素了

set.add(58);    //Integer型
set.add("nbsw");    //String型
set.add(null);    //null
set.add(true);    //Boolean型

存入元素时,调用对象的hashCode()方法来获得对象的hashCode值,据此决定对象在HashSet中的存储位置,因此排列无序

加入的对象不能够重复,即两元素的HashCode不能一样,否则将报错

移除元素:

set.remove(58);

判断是否存在某个元素:

if( set.contains("58") ) {    //判断是否存在
    System.out.println("存在58");
} else {
    System.out.println("不存在58");
}

contains()方法返回的是一个bollean值,据此判断是否存在

获取集合的元素个数:

System.out.println(set.size());

遍历集合:

遍历集合有两种方法,迭代器遍历和for each遍历

1.迭代器遍历:

Iterator it = set.iterator();
while(it.hasNext()) {
    System.out.println(it.next());
}

这种方法需要用到类Iterator,需要导入java.util下的包

import java.util.Iterator;

2.for each迭代遍历:

for(Object obj : set) {
    System.out.println(obj);
}

这种做法是把set的每一个值取出来,赋值给obj,直到循环set的所有值

比较简便,不用额外再导入包,也是使用比较多的方法

清空集合:

set.clear();

移出集合中的全部元素,此集合变为一个空集合

2.TreeSet集合

Set接口的另一种实现,相对于HashSet,TreeSet会使用自然排序或是定制排序,默认为自然排序

导包:

import java.util.Set;
import java.util.TreeSet;

创建对象:

Set<Integer> set = new TreeSet<Integer>();

因为多了一个排序操作,需放入同样类型的对象(使用泛型来限制),否可能会出现异常

加入元素:

set.add(4);
set.add(2);
set.add(7);
set.add(3);

自然排序与定制排序:

System.out.println(set);

这里我们直接打印一下

 

发现原本加入时并没有顺序,进入集合会自动给元素自然排序

还有一种是可以按照某种类中的比较方法来进行排序,也就是定制排序

比如现在有一个Person类如下:

class Person implements Comparator<Person> {    //继承Comparator接口
    int age;
    String name;

    public Person() {   //无参构造
    }

    public Person(String name,int age) {    //有参构造
        this.name = name;
        this.age = age;
    }

    @Override
    public int compare(Person o1,Person o2) {   //实现Comparator的比较方法,定制排序
        if(o1.age > o2.age)
            return 1;
        else if(o1.age < o2.age)
            return -1;
        return 0;
    }
}

由于这里我们重写了Comparator的比较方法,我们需要导入包Comparator:

import java.util.Comparator;

再创建一个Person类的TreeSet集合,向其中加入Person的对象,再遍历:

Set<Person> perSet = new TreeSet<Person>(new Person());

Person p1 = new Person("张三",18);
Person p2 = new Person("李四",25);
Person p3 = new Person("王二买",17);
Person p4 = new Person("刘武",23);

perSet.add(p1);
perSet.add(p2);
perSet.add(p3);
perSet.add(p4);

for(Person p : perSet) {    //迭代器遍历集合元素
    System.out.println("name:" + p.name + " age:" + p.age);
}

便能按照我们在Person类中写的比较方法来对加入的Person对象进行排序了

这就是TreeSet的定制排序

后续还有List和Map集合,下篇再写...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值