10. Set

news/2024/9/28 11:12:02 标签: Set

Set_0">1.HashSet底层储蓄原理

HashSet底层采用的是HashMap来实现存储,其值作为HashMap的key

	HashSet<Character> hashSet = new HashSet<Character>();
	hashSet.add('x');

	//add底层源码
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

	//put底层源码
    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

hashset中不会存放相同的元素,那么它就要采用hash算法,通过计算存储对象的hashcode得到一个int型的值,然后再与数组的长度做位运算,得到在数组中储蓄的位置,,如果此时计算的位置没有其他元素,直接储存,不用比较。随着元素的增加,就可能发生“哈希冲突”,不同对象计算出来的值是相同的,这时我们就要用equals方法比较,如果相同则不插入,否则插入形成链表(算法中的拉链法) ,但是随着元素的继续增加,链可能会更长,在JD1.8版本之后优化为红黑树


http://www.niftyadmin.cn/n/1572129.html

相关文章

11. HashTable HashMap ConcurrentHashMap

HashTable HashMap ConcurrentHashMap map.put(key,value) : key 通过hash计算得到所在段&#xff0c;然后再进行hash计算得到段中的位置 &#xff0c;如果是有多个put操作&#xff0c;只有在同一段中才会上锁&#xff0c;不在同一段中就不用上锁 总结 如果不是多个线程访问同一…

acwing 1275 最大数

题面 题解 因为题中最多m次操作&#xff0c;所以最多有m个节点&#xff0c;那么我们就可以提前建立一颗M*4节点的线段树&#xff0c;那么对于A操作&#xff0c;就变成了在某一个位置修改数&#xff0c;那么Q操作就变成了查询区间的最大值&#xff0c;其他就是线段树模板了 代码…

acwing 1086 恨7不成妻

题面 题解 代码 #include <cstring> #include <iostream> #include <algorithm> #include <vector>using namespace std; typedef long long ll; const int N 20, P 1e9 7;struct F {int s0; //个数(0次方)int s1; //和(1次方)int s2; //平方和…

算法竞赛进阶指南 (线段树+懒标记) 一个简单的整数问题2

题面 题解 对于有区间修改和区间查询的&#xff0c;我们第一个想到的就是用线段树懒标记去做 区间修改时&#xff0c;当修改区间完全包含树区间时&#xff0c;在这个树区间打一个标记&#xff08;表示给以当前节点为根的子树中的每一个节点加上add,不包含根节点&#xff09;&am…

算法竞赛进阶指南---(线段树+懒标记)旅馆

题面 题解 我们可以将其看作是一个01串&#xff0c;初始全部为0 。操作1 &#xff1a;找到最靠左的长度为len的全部为0的串&#xff0c;输出左端点&#xff0c;并将这个区间全部变成1&#xff0c;如果不存在就输出0 &#xff1b; 操作2&#xff0c;把左端点为l&#xff0c;长度…

acwing 1055. 股票买卖 II

题面 题解(状态机模型) f[i][0] : 第 i 天手中没有股票 f[i][1] : 第 i 天手中有股票 f[0][0] 0 &#xff08;第0天手中没有股票&#xff09;f[0][1] -INF(非法状态&#xff0c;题中让求最大值&#xff0c;所以初始化为最小值) 代码 #include<iostream> #include<cst…

力扣 打家劫舍 II

题面 题解(状态机模型) 对于线性 f[i][0] max(f[i-1][0],f[i-1][1]) ; f[i][1]f[i-1][0]w[i] ,对于环形&#xff0c;我们可以用枚举的方法&#xff0c;我们假设第一个点不选&#xff0c;那么f[0][0] 0,f[0][1]-INF(不合法) &#xff0c;最后的最大值就是max(f[n-1][0],f[n-1]…

力扣 173.二叉搜索树迭代器

题面 题解(二叉树的非递归中序遍历) 将整棵树的最左边的一条链压入栈中&#xff0c;每次取出栈顶元素&#xff0c;并记录&#xff0c;如果它有右子树&#xff0c;那么将右子树最左边压入压栈中 代码 /*** Definition for a binary tree node.* struct TreeNode {* int val…