哈希
主要用于快速查找、存储和比较数据。哈希的核心在于哈希函数(Hash Function),它将输入(通常称为键,key)映射到一个固定范围的输出值,这个输出值称为哈希值(Hash Value)或哈希码。
HashMap
HashMap<Integer, String> hashmap= new HashMap<Integer, String>();
增:
hashmap.put(1, "string1"); // 执行完后hash表内为{1=string1} hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2} hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2, 3=string3}
删:
hashmap.remove(1); // 执行完后hash表内为{2=string2, 3=string3} hashmap.remove(2); // 执行完后hash表内为{3=string3} hashmap.remove(3); // 执行完后hash表内为{} // 删除所有键值对 hashmap.clear();
查:
hashmap.put(1, "string1"); // 执行完后hash表内为{1=string1} hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2} hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2, 3=string3}
替换:
hashmap.replace(key,value); // 返回0
HashSet
Set<Integer> hashset= new HashSet<Integer>();
增:
hashset.add(1);
int[] nums = new int[]{1,2,3,4,5,6} for(int x : nums) hash.add(x);
判断元素是否存在:
hashmap.contains(1);
删:
hashmap.remove(1); // 删除所有元素 hashmap.clear();
对比
HashSet学习总结
HashSet是Java集合框架中实现Set接口的一个重要类,它提供了一种无序且不重复元素的集合。HashSet的核心特点是:
不重复性:HashSet不允许存储重复的元素,这是通过调用元素的hashCode()和equals()方法来确保的。这两个方法共同决定元素的唯一性。
无序性:HashSet不保证元素的插入顺序,遍历HashSet时得到的顺序可能与插入顺序不同。
基于HashMap实现:HashSet实际上是对HashMap的一种包装,它将元素作为HashMap的键,而值统一设为一个固定对象(如PRESENT常量),从而达到只关心键的目的。
性能优势:得益于HashMap的哈希表实现,HashSet提供了高效的添加、删除和查找操作,平均时间复杂度接近O(1)。
注意事项:使用自定义对象作为HashSet的元素时,必须重写hashCode()和equals()方法,确保逻辑上相同(根据业务定义)的对象具有相同的哈希值和相等性判断。
HashMap学习总结
HashMap是Java中最常用的键值对集合,它实现了Map接口,提供了一种快速存取键值对的方式。HashMap的主要特征有:
键值对存储:每个元素由一个键和一个值组成,键是唯一的,值可以重复。
哈希表结构:内部使用哈希表实现,通过哈希函数将键映射到数组的特定索引,解决冲突的方法是链地址法(JDK 7及以前是链表,JDK 8引入了链表/红黑树的结构转换)。
线性探测法和扩容:当哈希碰撞导致冲突时,通过开放寻址法(如线性探测)或链表/红黑树解决。当HashMap的填充程度达到一定阈值(由负载因子控制,默认0.75),会触发扩容,以保持高效性能。
线程不安全:HashMap在多线程环境下不是线程安全的,若在并发环境中使用,推荐使用ConcurrentHashMap。
null值处理:HashMap允许一个null键和多个null值,这是与某些其他集合类不同的地方。