Set接口,HashSet实现

一、Set接口介绍

Set与离散数学中的一个“集合”概念类似,集合的特点是无序的和不允许有重复的数据,在java编程中的所谓重复数据是指使用Object的equals()方法进行比较返回true时的两个对象,Set中的顺序也是按照java自己的排序方式与用户放置数据的先后顺序无关,所以我们也可以理解为是“无序”的。在Set中可以放入空值,但同理也只能放一个null 元素。

常用的Set实现类有HashSet、HashTable和TreeSet。

二、HashSet介绍

1、HashSet介绍

HashSet实现了Set接口,同时继承于AbstractSet类。HashSet对每个对象采用哈希散列码hashcode进行存储索引,哈希散列码hashcode由程序在添加时才生成,每个对象之间没有关系,这样在HashSet中进行添加、删除对象或者比较对象,以及随机读取一个对象等操作时运行的时间是一致,不会因为对象数据量的多少的变化影响性能,在很多需要性能而无关顺序的环境下HashSet是一个非常好的选择。

构造方法有4个重载:

HashSet( ); //创建一个默认的散列集合。

HashSet(Collection c); //用c中的元素初始化散列集合。

HashSet(int capacity); //创建一个容量为capacity的散列集合。

HashSet(int capacity, float fillRatio);//创建一个容量为capacity的散列集合,并指定容量填充比

填充比是一个范围在0.0与1.0之间浮点数,它决定容器中的元素的个数与容器容量比值大于指定的填充比时,散列集合容量会自动扩容。对于没有获得填充比的构造函数,默认使用0.75。

常用普通方法

add(Object o)

size()

2、HashSet示例

代码:

//set  无序   没有重复值
HashSet set=new HashSet();
set.add("王五");
set.add("刘宝");
set.add("张三");
set.add("李四");//注意放了多个李四的数据
set.add("李四");
set.add("李四");
set.add("李四");

System.out.println("大小:"+set.size());
        
//打印出所有的数据,发现和添加的顺序不一致。
Iterator iterator2=set.iterator();
while (iterator2.hasNext()) {
    Object object = (Object) iterator2.next();
    System.out.println(object);
}    

程序输出如下:

大小:4

张三

李四

刘宝

王五

由上面的输出可知,我们虽然添加了很多个“李四”的数据,然而集合里面只有四个数据,所以说Set中的数据是不可以有重复数据的。另外,通过迭代打印HashSet可以发现,对象存储在集合中看上去是“无序”的。当然也可以覆盖父类的hashcode方法,让getHashCode方法返回一个伪hash值,这样就可以控制排序。

★集合的可迭代(iterator)特性★

集合是对象的容器,在编程中使用集合,既要能够把数据放进去,也得有方法把数据取回来。在容器中依次获取全部对象的过程叫作迭代集合,java设计了迭代器Iterator接口定义了调用迭代的方法,其Iterator的实现类需要根据自身集合的特性完成相应的迭代算法,算法提供了一种枚举容器中每个对象(enumerating the contents of a collection)的方法。这里枚举或迭代/遍历都是同样的意思。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值