集合(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:可序列化的