V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  4kingRAS  ›  全部回复第 7 页 / 共 9 页
回复总数  175
1  2  3  4  5  6  7  8  9  
2021-06-11 17:38:14 +08:00
回复了 taozhi8833998 创建的主题 酷工作 心好累的招聘贴。。。。阿里云
有 p5 吗?
2021-06-11 16:04:49 +08:00
回复了 dfkjgklfdjg 创建的主题 职场话题 有一个关于“内卷”的疑惑请教各位
想象一个湖,不断有水进来,但是没有水流走,就会卷成漩涡。
这种时候就两条路,湖变大湖,或者变成河,让水流走
2021-06-11 15:07:26 +08:00
回复了 tonydong 创建的主题 酷工作 深圳 鹅厂 急招前端,海量 hc,缺人,标准会有所降低
大量 1 个,巨量 2 个 ,海量 3 个
2021-06-10 16:37:49 +08:00
回复了 auto 创建的主题 程序员 找工作迷惑,怎么谈薪资?
@auto 不给不一定过不了,还是看你底气足不足,如果你只有拿 offer 都很困难就必须给。
2021-06-10 11:19:24 +08:00
回复了 4kingRAS 创建的主题 Java 推上看到的一道题
@4kingRAS 回复怎么删除啊,好蠢
2021-06-10 11:17:13 +08:00
回复了 4kingRAS 创建的主题 Java 推上看到的一道题
回来填坑了,确实是好题,不过自己想不出来。看了别人的豁然开朗。
**下面是我的理解:**

首先我们知道,HashSet 里面是一个 HashMap ,`set.contains(sb)` 最终执行的是 HashMap 的 contains 方法。通常情况下 contains 方法会先比较 hashCode,再调用 `equals()`。

StringBuilder 在 **内容改变后(如 append ),它的 hashCode 是不会变的**,而 StringBuilder 也没有 override `equals()` 也就是说如果不做什么改动,两次 print 都会打印 true 。

而 StringBuilder 是个 final 类,没法继承重写,怎么办?

V2 的 Java 人我想八股文都背得滚瓜烂熟了吧,都知道 Java 8 以后,hash 冲突会形成链表,超过 8 个会变成红黑树,而红黑树在比较的时候会用 `compareTo` 而不是 equals 。如果用 `compareTo` 可以看到 StringBuilder 的 `compareTo` 实现是有比较内容的。

所以, `sb.append("oops");` 执行后,HashMap 在红黑树中比较就会返回 false 。

整个思路现在就很明朗了,就是制造大量的 hashCode 相同的 StringBuilder,从而在 HashMap 中他们会都放在一个 bucket 里,并形成红黑树,调用`set.contains(sb)` 时,就会调用 `compareTo`

具体的解法很多,以 Tagir 的代码为例,比较好懂:

```java
List<StringBuilder> list = Stream.generate(() -> {
while (true) {
StringBuilder sb = new StringBuilder("a");
int hc = sb.hashCode();
if (((hc ^ (hc >>> 16)) & 0x3F) == 0) {
return sb;
}
}
}).limit(40)
.sorted(Comparator.comparingInt(Object::hashCode))
.toList();
```

首先要想办法制造 hash 冲突的 StringBuilder,比较朴素的办法就是 while 循环里不断的 new

`((hc ^ (hc >>> 16)) & 0x3F)` 这段其实就是 hashMap 源码里的 `hash()`,0x3F 即 63, 是 hashMap 里树化后的最小长度:

`static final int MIN_TREEIFY_CAPACITY = 64;`

```java
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```

让 hash 等于 0 是为了让他们落在第一个 bucket 里。

构造这 40 个之后排序一下,之所以是 40 个,跟树化有关,要保证这 40 个 StringBuilder 恰好落在同一个 bucket 里并形成红黑树。

```java
StringBuilder sb = Stream.generate(StringBuilder::new)
.dropWhile(b -> Collections.binarySearch(list, b,
Comparator.comparingInt(Object::hashCode)) < 0)
.findFirst().get();
```

构造 sb 很简单,不断 new 一个 StringBuilder,找到 hash 碰撞的那一个 即可。

完事,当第二次执行 `set.contains(sb)` 时,因为会调用 compareTo,而内容已经变化,所以会返回错误的值。

另一个高手的解法:

大同小异,都是大量生成,然后找碰撞,其他解法思路一样,只是找碰撞的方式不同。不过都很值得学习。

```java
List<StringBuilder> list = IntStream.range(0, 10_000_000)
.mapToObj(i -> new StringBuilder(0))
.filter(s -> ((s.hashCode() ^ s.hashCode() >>> 16) & 0xfff) == 0)
.sorted(Comparator.comparingInt(Object::hashCode))
.collect(Collectors.toList());

StringBuilder sb = list.remove(IntStream.range(1, list.size())
.filter(i -> list.get(i).hashCode() == list.get(i - 1).hashCode())
.findFirst()
.orElseThrow());
```

如五楼所说,永远不要在 hashmap 里装可变对象,更深入的思考是当你的程序是建立在假设一些极小概率事情不可能发生的时候,要小心。因为某些时候极小概率事件会集中发生。
2021-06-08 16:18:02 +08:00
回复了 4kingRAS 创建的主题 Java 推上看到的一道题
低估这道题了,本来想着能重写 compareTo 或者 equals 这种简单思路。后来看到有个大佬做出来,是制造碰撞,我贴出原链接,研究透了说说,或者有大佬看懂的说说。

twitter.com/quydxnguyen/status/1402151079635308544
2021-05-24 17:05:03 +08:00
回复了 liudaolunhuibl 创建的主题 成都 成都真的被吹得太过了,一线的同学谨慎回来吧
成都要是什么都有,什么都好的话早就不是那个房价了
2021-05-21 09:19:18 +08:00
回复了 noogler67 创建的主题 职场话题 基层工作选择, b 站和特斯拉
@Samuelcc 核心还是 C/C++,因为积累都是这些,没哪个公司敢冒险用 rust 的。你可以看到同样需要高性能的区块链用 rust 的很多,因为区块链就是全新的领域,没有这些包袱
2021-05-20 16:07:33 +08:00
回复了 noogler67 创建的主题 职场话题 基层工作选择, b 站和特斯拉
@kop1989 不好意思我觉得你大概是完全不了解智能汽车时代,现在所有造车公司都在讲究软件定义汽车,大话也不多说了,打开拉勾,蔚来,小鹏,吉利的职位看一眼就知道了。本人就是做这行的,最清楚,软件绝对是未来汽车的核心。
2021-05-20 16:04:12 +08:00
回复了 noogler67 创建的主题 职场话题 基层工作选择, b 站和特斯拉
Tesla 软件不算核心? 自动驾驶,车辆控制这些不说了啊,OTA 得自己做吧?中控的 Linux 应用得自己做吧?马斯克疯狂吹的视觉识别取代所有雷达,难道买个摄像头就实现了?
2021-05-12 14:45:17 +08:00
回复了 yohole 创建的主题 NVIDIA 锁算力的显卡到底锁了什么?
@yohole 山寨币就没多少人挖了啊,不影响市场
这不就是搜索引擎吗,你用百度也没打正则表达式吧。不过我觉得倒也用不到 nlp,同 3 楼,编辑距离问题,https://zhuanlan.zhihu.com/p/80682302 总之就是得到一个相似性得分,按得分排序。
2021-05-11 16:11:30 +08:00
回复了 Xavier08 创建的主题 程序员 大佬们怎么学习官方全英文的技术文档
把 hacker news 当 cnBeta 看,把 Twitter 当微博看,把 youtube 当 B 站看,你至少听力和阅读突飞猛进。
你断开不要在 userEventTriggered 里写,直接 pipeline.addLast(new ReadTimeoutHandler(35)); 用自带的超时 handler

注意 pipeline 添加 handler 的顺序
2021-05-07 14:06:06 +08:00
回复了 fiypig 创建的主题 职场话题 试用期内怎么离职好
1.要有书面的离职申请
2.留意合同的违约,竞业条款
3.社保关系不能断
2021-05-07 13:47:26 +08:00
回复了 mitchellef876 创建的主题 职场话题 32 岁,国企还是互联网?
信息太少,行业,城市,业务。互联网 35 跟程序员脱发一样只是烂梗,还是具体情况具体分析
2021-05-07 13:35:54 +08:00
回复了 polyang 创建的主题 程序员 现在的程序员,这么简单的问题都能答错吗?
@no1xsyzy java 对象比较推荐用 equals,直接在 equals 里实现, == 本来就是用于判断引用(指针)相不相同的。
Integer 缓存取决于 JVM 实现,openjdk 和 oracle 的是-128~128
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5449 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 38ms · UTC 09:09 · PVG 17:09 · LAX 02:09 · JFK 05:09
Developed with CodeLauncher
♥ Do have faith in what you're doing.