第十章--Java数据结构 第四节--集合Set

集合(1):

集合Set的三个性质:

(1)确定性:对任意对象都能判定它是否属于某一个集合

(2)互异性:集合内每个元素都是不相同的,注意是内容互异的(比如说我们之前提到两个对象,它们的内容相同,但是它们的内存地址不相同,但是在集合里面,我们要考虑,像这两个对象,也应该判定是相同的)

(3)无序性:集合内的顺序无关

集合(2):

Java中的集合接口Set:

----HashSet:基于散列函数的集合,无序,不支持同步

----TreeSet:基于树结构的集合,可排序的,不支持同步(不支持同步就是说在多线程的环境下可能会发生问题)

----LinkedHashSet:基于散列函数和双向链表的集合,可排序的,不支持同步

注意:不支持同步的Set类可以在串行程序中安全使用的。在多线程并发执行情况下,可以用

Set  s  =  Collections.synchronizedSet ( new  HashSet ( ... ) ) ;  来获得一个支持同步的Set类

集合(3):HashSet

----基于HashMap实现的,可以容纳 null 元素,不支持同步

  Set  s  =  Collections.synchronizedSet ( new  HashSet ( ... ) ) ;

---- add:添加一个元素

---- clear:清除整个HashSet

---- contains:判定是否包含一个元素

---- remove:删除一个元素    size:大小

---- retainAll:计算两个集合交集

举个例子:

HashSet <Integer> 是一种泛型表示,意思是这个HashSet容器只能容纳Integer的对象

 

HashSet的遍历方式:(1)迭代器方式遍历    (2)for - each方式遍历

集合(4):LinkedHashSet

----继承HashSet,也是基于HashMap实现的,可以容纳null元素

----不支持同步

可以使用这条语句让它支持同步  Set  s  =  Collections.synchronizedSet ( new  LinkedHashSet ( ... ) ) ;

----方法和HashSet基本一致

add  clear  contains  remove  size

----通过一个双向链表维护插入顺序(也就是说,它的插入顺序是保留的)

注意:LinkedHashSet是保留顺序的,其遍历顺序和插入顺序一致;而HashSet没有保留顺序,其遍历顺序无序

----LinkedHashSet也有两种遍历方式,迭代器方式和for - each方式遍历

集合(5):TreeSet

----基于TreeMap实现的,不可以容纳null元素,不支持同步,当然也可以通过下列语句变成同步

SortedSet  s  =  Collections.synchronizedSortedSet ( new  TreeSet ( ... ) ) ;

---- 常用方法: add(添加一个元素)clear(清除整个TreeSet)contains(判定是否包含某元素)remove(删除)  size

----根据compareTo方法或者指定Comparator排序

注意:HashSet是无序输出的。LinkedHashSet是按照插入的顺序进行遍历输出的。TreeSet是按照所存储对象大小升序输出的

集合(6):

----HashSet,LinkedHashSet,TreeSet的元素都只能是对象(比如Integer,还有自定义的对象Person这些)

----HashSet和LinkedHashSet判定元素重复的原则(在HashSet和LinkedHashSet里面添加元素时会调用元素(对象)的hashCode方法(需要在定义对象的时候重写这个函数,默认继承Object类,有hashCode方法)判断)

(1)判定两个元素的hashCode函数返回值是否相同,若不同,返回false

(2)若两个元素hashCode相同,判定equals方法函数返回值,若不同,返回false;否则返回true

----TreeSet判定元素重复的原则

(1)需要元素继承自Comparable接口

(2)比较两个元素的compareTo方法

注意:

(1)HashSet和LinkedHashSet:自定义的对象本身没有hashCode方法,而是默认继承Object类的,而Object的hashCode方法会返回对象信息和内存地址经过运算后的一个int值。所以不同的自定义对象它们的hashCode返回值是不同的。这两个方法分别是public  int  hashCode () 和public  boolean  equals ( Object  obj)

(2)HashSet和LinkedHashSet:如果重写了hashCode方法和equals方法,那么需要把 public  String  toString()方法重写一下,通常这三个方法是三位一体的。就是说如果两个对象的hashCode方法返回值是相同的,equals方法的返回值是相同的,那么它们的toString方法的返回值也是要是相同的

(4)TreeSet:需要实现Comparable接口,所以必须实现compareTo方法来比较大小。compareTo方法具体规如下:

int  a  =  obj1.compareTo ( obj2 ) ;

如果a > 0,则obj1 > obj2

如果a == 0 , 则obj1 == obj2

如果a < 0 , 则obj1 < obj2

(5)HashSet和LinkedHashSet的元素重复判定只跟hashCode和equals方法有关,而与compareTo方法无关。而TreeSet的元素重复判定只与compareTo方法有关,而与hashCode和equals和toString无关,不会调用这几个方法

(6)Java的四个重要接口

Comparable:可比较的

Clonable:可克隆的

Runnable:可线程化的

Serializable:可序列化的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值