一、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)的方法。这里枚举或迭代/遍历都是同样的意思。