hashmap面试题,Java好难找工作

技术焦虑

现在的技术圈子很火热,任何技术点,任何知识,只要你肯搜索,都能找到资料。但是现在技术圈确实有一个不好的地方,就是贩卖焦虑。这种贩卖焦虑的点并不在于形式,而是一种普遍的心态。特别是对于那种知识点比拼的心态:“xx知道的东西好多,好厉害!我要向xx学习”。我一直宣扬,这种心态千万不要有。xx比你知识点多很多,但是不代表他比你强,比你厉害。程序员如何比拼强弱?要比拼的绝不是知识点的多寡,而是使用知识点的能力强弱。即如何使用你掌握的知识改变行业。

关于晨读,各种账号确实现在很经常发晨读,晨读这件事情,我自己也坚持了三年,现在开的群也在和几个人坚持发。其实我自己也知道,晨读这些内容恐怕没有几个人会看,大多数人恐怕就是浏览了下标题。晨读这个事情,本质是好的,它对收集和发送的人来说是最有利的,基本上收集和发布的人至少需要大致看过这些文章,这对发布的人是一种坚持学习的东西。而但是对于看的人,我自己也知道见仁见智。如果这些晨读标题引起了自身的恐慌和焦虑,我觉得绝对是得不偿失的。

前沿技术

聊聊前沿技术。不管你现在是学习什么前沿的技术,大致一句话应该是没有错的,你所掌握的技术,在你有生之年,是会过时的。这种过时的生命周期是从后端向前端逐渐缩短的。我这里的后端和前端的方向是以靠近真实用户的距离计算的。比如数据库,操作系统这种技术,距离用户最远,用户基本不会感知,他们可能几十年都不会过时,从mysql,linux大致就能看出来。再往前,中间件技术,缓存等技术,大致十几年把。再往前,后端服务技术,我认为生命周期应该是10年之内。再往前,前端技术,我觉得迭代周期应该是5年之内了。如果有工作超过10年的朋友,应该对我这个时间估计也会有所赞同的。迭代更新是伴随着技术红利的,这里的技术红利指的是新技术的培训,人员更新,市场需求等。越是更新换代快的,越容易抢占这个技术红利。在这个技术红利中,会有一波人才缺口流出,会有一波技术很强的人出现。但是,残酷的是,这波人才缺口,很多情况下是通过淘汰只掌握过时的技术的人员空出来的。所以越靠近用户侧的技术人员越需要跟紧技术迭代的脚步,否则一不小心就会被淘汰。当然也不是说越往后端越舒服,技术迭代慢同时也代表坑位固定,因为在同技术领域沉淀很久的老人会把及格线带的很高,所以基本需要沉淀比较久才能成为比较合格的人才。而且靠近后端的人才一旦遇到技术迭代,那么可能是毁灭性的,究其原因,恐怕一个是深入后端技术比较慢,一个是新的后端技术坑更少。

是不是所有的技术迭代都是好的呢?我的观点是肯定的。新技术的出现一定是为了解决某种痛点,或者填补某种空缺才会出现的。但是,大家往往忘记了,技术是为了解决问题的,有很多公司由于体量,技术人员储备等条件,根本不存在所谓的痛点,但是也莫名其妙引入了各种时髦新技术。技术都不是银弹,使用新技术,一定要承担新技术带来的成本和新痛点。衡量一个新技术引入公司的决策是否正确的标准,恐怕应该是业务是否得到提升。这里说的业务提升,两个方面,一个成本侧减少,一个收益侧增加。在我看来的很多公司,对于新的技术往往是为了革新而革新,所带来对公司业务上的伤害,恐怕更多于旧的技术。所以架构师的价值,特别是业务架构师的价值我认为体现在这里,对整个公司或者部门的业务,人员水平有一定判断,选择合适的技术,有时候,甚至于拒绝新技术的引入也是一个成功的决定。

技术人员的发展路线

可以再聊聊技术人员的发展路线。我认为技术人员的发展路线有两条,一条是改变技术行业,一条是改变业务行业。

改变技术行业的人,这类人我认为现在在中国应该是比较少数的。改变技术行业的人基本上恐怕究其一生,最多只能改变一个、至多两个技术行业。这种人,我认为可能必须有热衷于某个技术行业的觉悟。基本上我觉得各个语言的创造者,追随者算是这类人,各种数据库,大型开源项目的创造者、追随者算是这类人。这类人比如mysql的精深专家,基本需要在mysql这个领域没有什么解决不了的问题,而且对这个领域有持续的贡献能力。但是我这十年所见,确实遇到的非常少(可能是我的有限的个人经历所致)。

成为改变业务行业的人,我觉得应该是现在大多数的接触程序员所应该追求的。我们之所以有工作,是公司在某个行业希望有所建树,有所作为,所以雇佣你来做这份工作。如果你不能让公司在这个行业有所发展,那么恐怕,你很快会被公司淘汰。所以,这点是我对所遇到的工作几年之后有职业迷茫的年轻人说的,千万不要为了追求新技术而轻易换行业。任何业务,都有技术可以改变的地方,只是你没找到而已,没找到的原因,恐怕就在于你的浮躁。并不是人人都有机会追求各种高并发的CURD,但是人人都有机会踏踏实实写一些CURD,只要这些CURD在某个行业,某个领域确实是起到了作用,对公司起到了正面收益,那么你的工作就是值得的。代码无分贵贱,能让代码起价值的,就是你怎么使用这个代码改变你所在的业务行业。

所以,对于大多数业务行业的程序员来说,在几年期间,选择一个你喜欢的(或者你很看好的)行业,用各种技术来尝试,改变它,对自己也并不需要设限。就和实验室里面做实验的科学家一样。或许最后可能失败,但是所积累下来失败的经验,才是你真正的财富。而且据我观察,如果在某个行业真的长期沉浸思考的人,最后它自己就会变成这个行业的稀缺资源。各个公司所谓的技术总监,大都需要有这种特质。技术总监做的管理工作,在这个视角看来,是组织一批技术人员用技术改变行业。

最后

面试题文档来啦,内容很多,485页!

由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。有想获取完整版笔记的朋友,点赞后点击这里免费领取哦

1111道Java工程师必问面试题

MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:

Elasticsearch 24 题 +Memcached + Redis 40题:

Spring 26 题+ 微服务 27题+ Linux 45题:

Java面试题合集:

mg-2qhdIXH0-1627613053770)]

Java面试题合集:

<think>嗯,用户之前让我出了一套Java中级开发的面试题,现在他们又想要一个关于滑动窗口的Java代码题目和答案。我需要先回顾一下之前的对话,确保这次的问题和之前的连贯。用户可能是在准备面试,需要具体的编程题例子,特别是滑动窗口相关的,可能他们觉得这部分比较难或者常见。 滑动窗口算法通常用于解决数组或字符串中的子串、子数组问题,比如最长无重复子串、最小覆盖子串等。我得选一个典型的题目,比如“字符串中最长无重复字符的子串”,这是LeetCode上的经典题目,编号3。这个题目适合考察候选人对滑动窗口的理解和应用。 接下来,我需要考虑如何呈现题目和答案。用户可能需要详细的代码示例,包括注释和解释。还要确保代码正确,符合Java的语法规范。另外,用户可能希望了解解题思路,比如如何移动左右指针,如何维护一个窗口,以及如何处理重复字符的情况。 可能还需要解释时间复杂度和空间复杂度,这样候选人可以展示他们的分析能力。例如,这个解法的时间复杂度是O(n),空间复杂度是O(字符集大小)。使用HashSet或者HashMap来记录字符的出现位置,这样可以在O(1)时间内判断是否重复。 另外,用户可能想知道不同的实现方式,比如使用数组代替HashMap来优化,特别是当字符集是ASCII时。这样代码可能更高效,但需要解释清楚为什么这样做。 还要注意代码的可读性,变量命名清晰,结构合理。比如,使用left和right指针来表示窗口的左右边界,用maxLen来记录最大长度,用charSet来存储当前窗口的字符。 最后,可能需要提供一个示例输入和输出,帮助用户理解代码的执行过程。例如,输入"abcabcbb",输出3,对应"abc"这个子串。这能让候选人更好地验证他们的代码是否正确。</think>以下是一道经典的滑动窗口算法题目(LeetCode 第3题)及其Java实现: --- ### **题目:无重复字符的最长子串** **描述** 给定一个字符串 `s`,找出其中不含有重复字符的 **最长子串** 的长度。 **示例** 输入:`s = "abcabcbb"` 输出:`3`(最长子串是 `"abc"`,长度为3) --- ### **Java解法** ```java public int lengthOfLongestSubstring(String s) { // 使用HashSet维护当前窗口内的字符 Set<Character> charSet = new HashSet<>(); int maxLen = 0; int left = 0; // 窗口左边界 for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); // 如果字符重复,移动左边界直到无重复 while (charSet.contains(c)) { charSet.remove(s.charAt(left)); left++; } // 将当前字符加入窗口 charSet.add(c); // 更新最大长度 maxLen = Math.max(maxLen, right - left + 1); } return maxLen; } ``` --- ### **解题思路** 1. **滑动窗口定义** - 用 `left` 和 `right` 指针表示窗口的左右边界。 - `HashSet` 存储当前窗口内的字符,用于快速判断重复。 2. **窗口移动规则** - **右指针扩张**:每次迭代将 `right` 右移,将新字符加入窗口。 - **左指针收缩**:若新字符已在窗口中出现,不断左移 `left` 并移除左侧字符,直到无重复。 3. **时间复杂度** - **O(n)**:虽然看似嵌套循环,但每个字符最多被 `left` 和 `right` 各访问一次。 --- ### **优化版本(使用HashMap记录索引)** ```java public int lengthOfLongestSubstring(String s) { Map<Character, Integer> charIndex = new HashMap<>(); int maxLen = 0; int left = 0; for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); if (charIndex.containsKey(c)) { // 直接跳转到重复字符的下一个位置(避免逐步移动left) left = Math.max(left, charIndex.get(c) + 1); } charIndex.put(c, right); maxLen = Math.max(maxLen, right - left + 1); } return maxLen; } ``` --- ### **扩展考点** 1. **如果字符串是ASCII字符,如何优化空间?** - 用长度128的数组代替HashMap:`int[] index = new int[128]` 2. **类似题目** - **最小覆盖子串**(LeetCode 76题):滑动窗口+哈希计数 - **长度最小的子数组**(LeetCode 209题):求满足条件的连续子数组 --- 通过这道题可以考察候选人对滑动窗口思想的理解、边界条件处理能力(如空字符串、全重复字符场景)和优化意识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值