——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
Set接口
Set接口概述
一个不包含重复元素的 collection。
Set中最常被使用的是测试归属性,你可以很容易的询问某个对象是否在某个Set中。Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同。
实现了Set接口的主要有HashSet、TreeSet、LinkedHashSet这几个共同点就是每个相同的项只保存一份。他们也有不同点,区别如下:
HashSet
java.util.Set(接口):Collection的子接口;
1.它里面没有自有的方法,都是Collection的
2.不能存储重复的值;
HashSet如何保证元素唯一性
底层数据结构是哈希表(元素是链表的数组)
哈希表依赖于哈希值存储
添加功能底层依赖两个方法:
int hashCode()
boolean equals(Object obj)
3.无序的(取出时,跟存入的顺序不一致)
使用子类:java.util.HashSet类
使用无参构造方法:
eg:
结果:
aaa
ccc
bbb
Set保证元素唯一的源码:
main(){
strSet.add(“aaa”);
strSet.add(“aaa”);
}
class HashSet{
public boolean add(E e) {
return map.put(e, PRESENT)==null;
map.put(“aaa”, new Object());
}
}
class HashMap{
public V put(K key, V value) {//key = “aaa”,value = new Object();
if (table == EMPTY_TABLE) {//判断哈希表是否为空;
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = this.hash(key);//调用哈希函数,获取一个哈希值;
int i = indexFor(hash, table.length);
for (Entry< K,V > e = table[i]; e != null; e = e.next) {//第一次存的时候,这个for循环是进不来的.从哈希表中获取已存储的元素
//然后遍历
Object k;
//将当前要存储的”aaa”与表中的相同哈希值的每个对象都一一比较hash值,如果hash值相同,继续比较equals,如果还相同,则不存储;
//确定两件事:
//1.先比较哈希值,再比较equals
//2.是逻辑与,具有短路行为。如果hash相同,才比较equals,如果hash不同,不进行后续判断,直接为false,
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;//没有存储,直接return了
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
}
如果我们需要存储自定义对象,需要HashSet能够判断出两个不同的对象,具有完全相同的
属性值的情况:
1.在自定义类中,重写hashCode()方法;
2.在自定义类中,重写equals()方法;
LinkedHashSet类
LinkedHashSet类概述
元素有序唯一
由链表保证元素有序
由哈希表保证元素唯一
eg:
TreeSet类
对元素进行排序的。
根据源码显示:
1.先判断集合中是否设置了Comparator接口对象;
如果没有设置,就调用compareTo()方法,要求对象必须实现Comparable接口(自然排序)
2.如果设置了Comparator接口:就调用compare()方法进行比较;(比较器排序)
当使用TreeSet存储自定义对象;
因为它的排序依赖于:
1.自然排序:Comparable接口的compareTo()方法;
需要我们的自定义类去实现,并重写方法;
2.比较器:Comparator接口的compare()方法;
实例化TreeSet时,通过TreeSet的构造方法传递过去;
.自定义类不需要实现接口,实例化TreeSet时,传递一个比较器对象就可以了;
练习:
Map接口
Map接口的概述
java.util.Map(接口):以键值对的形式存储对象。要求”键”唯一。
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值
Map接口和Collection接口的不同:
1.Map是双列的,Collection是单列的
2.Map的键唯一,Collection的子体系Set是唯一的
3.Map集合的数据结构值针对键有效,跟值无关
4.Collection集合的数据结构是针对元素有效
Map接口的基本功能:
添加相关:
V put(K key,V value):相当于Collection的add()方法。但是它接收两个参数,一个是作为主键存储,一个是作为值存储;
删除相关:
V remove(Object key):移除元素
void clear():清空集合
判断功能:
boolean containsKey(Object key):某个键在集合中是否存在;
boolean containsValue(Object value):某个值在集合中是否存在;
boolean isEmpty():判断集合是否为空
获取相关:
int size():获取集合中元素的数量:
–使用子类:HashMap:
HashMap类概述
键是哈希表结构,可以保证键的唯一性
Map的获取功能:
V get(Object key):通过键获取值
Set keySet():获取所有的键。
Collection values():获取所有的值;
Set< Map.Entry< K,V > > entrySet():
Map接口的遍历keySet
遍历Map:
1.先取出所有的”键”的集合:Set keySet();
2.遍历Set,获取每个键;
3.通过”键”,获取对应值:V get(Object key);
Map遍历图解:
Map的获取:
Set< Map.Entry > entrySet():
entrySet():返回Set类型的对象,此对象内部存储的是Map中的一个内部类Entry的对象。
一个Entry对象包含了:一个键和一个值;
Map练习:HashMap< String,String >
LinkedHashMap类
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
eg:
TreeMap类
TreeMap类概述
键是红黑树结构,可以保证键的排序和唯一性
注意:
1.Tree结构,都需要排序;
要排序,就要比较;
要比较:
1.自然排序:存储的对象必须自己具有排序功能:(要存储的类一定要实现Comparable接口,重写compareTo()方法)
2.比较器:自定义一个比较器(写个类实现Comparator接口,重写compare()方法);
当实例化一个TreeMap对象时,将此比较器的对象通过构造方法传给TreeMap就可以了。
1.使用自定义类做键;
2.而TreeMap要对键进行排序;
要比较:
1.自然排序:存储的对象必须自己具有排序功能:(要存储的类一定要实现Comparable接口,重写compareTo()方法)
2.比较器:自定义一个比较器(写个类实现Comparator接口,重写compare()方法);
当实例化一个TreeMap对象时,将此比较器的对象通过构造方法传给TreeMap就可以了。
Treemap实例:
HashMap和Hashtable
HashMap和Hashtable的区别:
1.HashMap:Map的子类;哈希表实现的Map;允许null键和null值;
线程不安全,效率高;
从1.2版本开始
2.Hashtable:Map的子类,哈希表实现;不允许null键和null值;
线程安全的,效率低;
从1.0版本开始;
本文深入解析Java中的Set接口和Map接口,包括Set接口的概述、主要实现类(HashSet、LinkedHashSet、TreeSet)、Map接口的概述、实现类(HashMap、TreeMap)以及它们的基本操作和应用场景。通过实例讲解,帮助开发者理解如何在实际项目中灵活运用这些集合框架。
&spm=1001.2101.3001.5002&articleId=46392847&d=1&t=3&u=500fca7cca524e33ade5c07ab1aef183)
645

被折叠的 条评论
为什么被折叠?



