【hashMap:】(键值对,不同步,无序)
存放的是key-value的值,采用put方法;可以存相同的对象。是map的子类;
并允许使用 null 值和 null 键(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)
此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 是无序的。
注意,此实现不是同步的。
【hashTable:】(对象,同步,无序)
为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。是无序的。
Hashtable 是同步的。
【TreeMap:】(键值对,不同步,有序)
构造一个新的、空的树映射,该映射根据给定比较器进行排序。是有顺序的。
注意,此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。
【hashSet:】(不能存相同的对象,唯一,无序)
存放的是对象,采用add方法入参;不能存相同的对象;其底层也是存在hashMap中的key中,key是唯一的,所以hashSet也是唯一的。
value中存放的是一个常量。
注意,此实现不是同步的;此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它
不保证该顺序恒久不变。此类允许使用 null 元素。
public HashSet()构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
【LinkedHashSet:】(唯一、有序、不同步)
具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行
于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。
注意,此实现不是同步的。
【理解HashSet及使用】
(1) 为啥要用HahSet?
假如我们现在想要在一大堆数据中查找X数据。LinkedList的数据结构就不说了,查找效率低的可怕。ArrayList哪,如果我们不知道X的位置序号,
还是一样要全部遍历一次直到查到结果,效率一样可怕。HashSet天生就是为了提高查找效率的(用contains方法)。
(2) hashCode 散列码
散列码是由对象导出的一个整数值。在Object中有一个hashCode方法来得到散列码。基本上,每一个对象都有一个默认的散列码,其值就是
对象的内存地址。但也有一些对象的散列码不同,比如String对象,它的散列码是对内容的计算结果:
hashSet总结:
1、HashSet不能重复存储equals相同的数据 。原因就是equals相同,数据的散列码也就相同(hashCode必须和equals兼容)。大量相
同的数据将存放在同一个散列单元所指向的链表中,造成严重的散列冲突,对查找效率是灾难性的。
2、HashSet的存储是无序的 ,没有前后关系,他并不是线性结构的集合。
3、hashCode必须和equals必须兼容, 这也是为了第1点。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import
java.util.HashSet;
import
java.util.Iterator;
public
class
IteratorTest {
public
static
void
main(String[] args) {
HashSet set =
new
HashSet();
set.add(
"a"
);
set.add(
"b"
);
set.add(
"c"
);
set.add(
"d"
);
set.add(
"e"
);
Iterator iter = set.iterator();
while
(iter.hasNext()){
String value = (String)iter.next();
System.out.println(value);
}
}
}
|