半年时间,从机械转行 Java,二哥的读者真牛逼!

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: 半年时间,从机械转行 Java,二哥的读者真牛逼!

一个读者,也是洛阳的,刚好是我老乡,半年前给我说,准备自学 Java,还是机械专业的,明年秋招找工作。这不,半年过去了,他就找到了,现在去携程实习去了,薪资水平还不错。


携程和 BAT 这些大厂在薪资上肯定是有差距的,但携程也算是国内能排上号的互联网公司了。考虑到这个读者还是非科班,只花了半年的时间,所以我觉得还是挺牛逼的。


一面的时候他曾给我发消息,说面试官问他 Java 虚拟机栈方面的知识点,没回答上来,我就立马写了那篇 Java 虚拟机栈的文章甩给他,没想到,万万没想到,还真的帮上了忙,二面的时候就回答的很顺利。


其实我也没帮他太多,更多的还是靠他自己的努力!


看到这,肯定有读者按捺不住了,想问二哥,“都问了哪些问题啊,能不能分享一下啊。”那必须滴,二哥已经帮大家问过了。


先说一面的知识点:


Java 的基本数据类型以及占用的内存大小;

Java 内存模型;

线程间通信;

线程池参数以及意义;

MySQL 的锁;

遇到并发问题该怎么办;

字符串常量池以及相关问题;

网络通信协议。

再说二面的知识点:


Spring 的 IoC;

让你写一个类似于 MyBatis 的 ORM 框架,你会怎么写;

数据库并发操作会带来哪些问题,以及如何解决;

MySQL 默认的隔离级别是什么;

数据库索引相关的知识点;

JVM 的相关知识点;

了解过那些设计模式;单例模式口述一下;

快排;

可以看得出,都是非常基础的知识点。我这里有一份 GitHub 上星标 115k+ 的 Java 教程,里面涵盖了 Java 所有的核心知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点。


GitHub 星标 115k+的 Java 教程,超级硬核!


1)集合类,面试经常被问到的知识点有: ArrayList 和 LinkedList 的区别,它们在增删改查时的时间复杂度;HashMap 的数据结构,底层是通过数组+链表实现的,当链表的大厂大于 8 时,转为红黑树,推荐大家看一下这篇文章,美团技术团队出品的。


https://zhuanlan.zhihu.com/p/21673805

看完了这篇,面试官再问 HashMap 基本上就可以对答如流了。


2)多线程并发,面试一般都会问进程与线程的区别、synchronized、volatile、锁、ConcurrentHashMap、CopyOnWrite、线程池、CAS、AQS 等等这些知识点。推荐大家看看我之前给大家推荐过的一份小册子,阿里的几位大佬写的,名字叫《深入浅出 Java 多线程》,多线程并发这块要学习到什么程度呢?我来问一个,在使用线程池时,因为使用了无界队列,远程服务异常的情况下导致内层飙升,怎么解决呢?


3)Java 虚拟机,并发编程和 Java 虚拟机应该说是 Java 的知识体系中最重要,也是最难的两块了,也是面试必问的题目。其实学习 Java 虚拟机不只是为了面试,还能帮我们更深入地理解 Java 这门语言,也能为线上排查问题打下基础。关于 Java 虚拟机的知识点,我用思维导图列一下,大家可以按图索骥,去阅读相对应的文章。


image.png


要想学好 Java 虚拟机,必须得啃周志明老师的《深入理解 Java 虚拟机:JVM 高级特性与最佳实践》,目前已出到第三版。如果觉得比较难懂的话,其实可以到 GitHub 上看看我给你推荐的这份读书笔记。


https://github.com/TangBean/understanding-the-jvm

其中 Java 内存管理机制和 Java 虚拟机程序执行需要重点掌握,至于虚拟机性能监控以及故障处理,其实可以放到工作以后再去实践会好很多。


4)框架原理,我建议大家不要对学习框架有任何的抵触,不要总觉得学习 Spring 全家桶很 low,其实不是的,学会了 Spring 全家桶,你就可以上手做练手项目,做了练手项目,你就会感觉学过的那些知识都可以落地了。


学习框架当然不能只停留在会用的层面上,还得懂一些原理,比如说 Spring 的 AOP、IoC、DI 等等,@Guide 哥的《面试突击》解释得很清楚,一起来看一下。


AOP(Aspect-Oriented Programming),也就是面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。


IoC(Inverse of Control),也就是控制反转,是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。DI(Dependency Injection),也就是依赖注入,原来叫 IoC,能让人更加直观和清晰地理解其背后所代表的含义。


如果还不理解的话,可以看看《码农翻身》,里面讲的更生动一些。


5)数据库,面试中最经常问的就是 MySQL 和 Redis。关于 MySQL 的学习,我之前也推荐过学习资料,书的话就是《SQL 必知必会》和《高性能 MySQL》,在线学习网站的话,就上 MySQL Tutorial,内容还是非常全面的,下图是 MySQL 在面试中常见的知识点。


image.png


MySQL 的数据是存在硬盘上的,而 Redis 的数据是存在内存中的,所以读写速度非常快,于是 Redis 就广泛应用于缓存了。除了做缓存之外,Redis 也经常用来做分布式锁,甚至消息队列。


像 Redis 的内存淘汰机制、持久化机制、缓存穿透、缓存雪崩等等是面试中经常被问到的点,学习资料的话,推荐看一下老钱的《Redis 深度历险:核心原理与应用实践》。


6)计算机基础的相关知识,这就包括操作系统、计算机网络、数据结构与算法等等。


操作系统,也就是 Operating System,是管理计算机硬件和软件资源的程序,是计算机的基石,像 Unix 是用 C 语言写的。记得大学阶段,最经常用到的一个快捷键就是 Ctrl+Alt+Delete,为了调出 Windows 的进程管理程序,看哪个比较占内存就把它给强制结束掉,免得打游戏的时候电脑卡死,嘿嘿。


操作系统负责的工作有:管理设备、文件读写、控制进程、管理内存等等,算是所有软件中的老大,掌握着生杀大权。推荐的学习资料有《现代操作系统》、《深入理解计算机系统》,两本用来压泡面或者垫显示器的神书。


套用 @Guide 哥在他的知识星球里说的一段话就是:


操作系统中的很多思想和经典算法,都可以在日常开发使用的各种工具或者框架中找到影子。

比如说 Redis 和操作系统的高速缓存就很像,Redis 是用来解决程序处理速度和访问 MySQL 速度不对等的问题,而内存就是用来解决 CPU 处理速度和访问磁盘等外存速度不对等的问题。


现在想想,觉得挺遗憾的,大学阶段没有把计算机网络这门课学好。当时把所有的重心都扑到了 Java 这门编程语言上,但其实我的专业是计算机网络。


像下图中的这些计算机网络的相关知识点也是面试中的常客:


image.png


像《TCP/IP 详解,卷 1》是讲解网络协议的经典书,不过学习难度比较大,可以看一看《图解 HTTP》以及《网络是怎样连接的》这两本书,有大量的图片穿插,阅读起来就不会那么枯燥。


数据结构与算法,@程序员吴师兄画过一副思维导图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。




常见的数据结构有数组、链表、栈、队列、哈希表、二叉树、堆和图;常见的算法有递归、排序、二分查找、哈希算法、贪心算法、分治算法、回溯算法和动态规划等。


可能很多时候,我们会觉得数据结构与算法不重要,不如直接学习 Java、学习 Python 更直接一点。但我想说的一点是,学习数据结构和算法能让我们学到一种思想:就是如何把现实问题转化为计算机语言来表示(来自《码农翻身》的作者刘欣大佬)。


另外一个很现实的问题是,面试要考,尤其是一些大厂,很喜欢考。所以必须玩得 66 的,ACM 的题,或者 LeetCode 的题目,必须刷到自己都感觉废了的地步:他喵的,BAT 大佬的这份刷题笔记太强了!


最后,二哥必须要说的一点是,月薪两万只是一个数字,每个人的情况都是不同的,不同的城市,不同的公司,不同的面试官,不同的学历,不同的面试表现。


但要学习的内容我觉得还是很具有普适性的,虽然没有总结得很完全,但是我觉得这些都是非常必须的,从去携程实习的这个读者给出的面试题就能看得出。


另外,二哥要强调的一点是,一定要实战能力强,到了实习的时候能独立地把安排的活给完成了。


我是沉默王二,端午安康,大家可以三连支持了!希望大家多来给报喜呀~~~~


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 安全 Java
【Java基础】全网最详细 - 从入门到转行
【Java基础】全网最详细 - 从入门到转行
141 0
|
6月前
|
缓存 架构师 Java
Java开发三年,花费半年时间学完这些技术栈,面试定级阿里P7
现在 Java 相关岗位薪资越来越高、涨幅越来越大。 通过职友集数据可以查看,以北京 Java 相关岗位为例,其中 【20k-30k】 薪酬的 Java 工程师,占到了整体从业者的 30.8%!
|
Java
java时间换算(BJU转UTC)
UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。
299 0
java时间换算(BJU转UTC)
|
Java
java判断当前时间是否在某个时间区间内(可精确到毫秒)
java判断当前时间是否在某个时间区间内(可精确到毫秒)
847 0
java判断当前时间是否在某个时间区间内(可精确到毫秒)
|
算法 搜索推荐 Java
线性时间选择(Top K)问题(Java)
线性时间选择(Top K)问题(Java)
255 0
线性时间选择(Top K)问题(Java)
java获取时间间隔,获取当天每隔15分钟的时间
Java开发中日常遇到的关于时间的问题
java获取时间间隔,获取当天每隔15分钟的时间
|
Java 程序员
Java中如何处理时间--Date类
在实际业务中,总会碰到关于时间的问题,例如收集当年的第一季度的数据。第一季度也就是当年的一月一日到三月三十一日。如何处理时间的逻辑,如果用字符串去处理显然不可以,Java有专门的处理时间的类,在此记录一下。Date 类有如下两个构造方法。Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。
175 0
Java中如何处理时间--Date类
|
关系型数据库 MySQL Java
Linux系统下java程序获取的时间与系统时间不一致的问题
解决Linux系统下java程序获取的时间与系统时间不一致的问题
1370 0
Linux系统下java程序获取的时间与系统时间不一致的问题
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例
710 0
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例