鼓起勇气,从安卓转到Java开发,终于四面拿下了美团offer

#种一棵树最好的时间是十年前,其次是现在

很多程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来。

但是没过多久,能了解到的资料就开始超过每天学习的能力,像是买了没看的书、收藏没读的贴、mark 了之后再也没有关注过的文章越积越多,更别提每天面对各种技术分享或者微博里的新鲜玩意了。

大多数人每天能留给自己学习的时间有限,这个阶段如何提升学习效率就成了要解决的重点。

说说自己提升学习效率的心得,其实非常简单:体系化的学习。

我曾经很喜欢看一些博客或者是一些 “看起来” 比较通俗易懂的文章,每天在微博微信里刷到什么技术文章就 mark 下来,基本上几分钟就能读完。可一段时间下来,虽然读了不少东西,但是还是有种在原地打转的状态,并没有感受到有什么实际的提高。

最后实在忍不住,抱着厚书硬啃了一遍,突然有种豁然开朗的感觉:读书时自己学到的是一张完整的知识网络,每个知识点和其它内容相互联系和区别。这种全方位的理解比起一篇篇独立的文章,不知要高到哪里去了。

在重复了几次痛苦的学习-梳理过程后,再去看一些独立的文章或者资料往往会事半功倍,因为能在体系内找到相对应的知识,甚至有时候一本书里一页只需要看一句话,点破那层窗户纸,就可以掌握新的知识。很多程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来。
但是没过多久,能了解到的资料就开始超过每天学习的能力,像是买了没看的书、收藏没读的贴、mark 了之后再也没有关注过的文章越积越多,更别提每天面对各种技术分享或者微博里的新鲜玩意了。
大多数人每天能留给自己学习的时间有限,这个阶段如何提升学习效率就成了要解决的重点。
说说自己提升学习效率的心得,其实非常简单:体系化的学习。
我曾经很喜欢看一些博客或者是一些 “看起来” 比较通俗易懂的文章,每天在微博微信里刷到什么技术文章就 mark 下来,基本上几分钟就能读完。可一段时间下来,虽然读了不少东西,但是还是有种在原地打转的状态,并没有感受到有什么实际的提高。
最后实在忍不住,抱着厚书硬啃了一遍,突然有种豁然开朗的感觉:读书时自己学到的是一张完整的知识网络,每个知识点和其它内容相互联系和区别。这种全方位的理解比起一篇篇独立的文章,不知要高到哪里去了。
在重复了几次痛苦的学习-梳理过程后,再去看一些独立的文章或者资料往往会事半功倍,因为能在体系内找到相对应的知识,甚至有时候一本书里一页只需要看一句话,点破那层窗户纸,就可以掌握新的知识。所以我建议你看文章博客,不能只看一篇,通透的、连续的学习,效果才是最佳的。

开篇:为什么转Java?

先说说个人情况吧,坐标广州,16年从一所普通二本大学毕业,毕业后在一家小公司干android开发,年薪在15w左右。转Java的契机是认识到了一个朋友,做Java后台的,经常跟他聊相关的内容,经过慎重考虑及个人的发展规划,所以就决定转型了。

从安卓转Java,肯定不能是说转就转的,需要耗费大量的时间和精力,所以在工作之余是一定要抽出自己的时间来学习。好在付出终是有回报的,简历上不说敢写精通,熟练是没多大问题的,最终4面拿下了美团offer。

美团点评面试场景还原,最真实的面经

美团点评第一面:

  1. 做一下自我介绍吧,简单说一下你的项目;
  2. 有遇到过内存泄漏吗?你们是怎么解决的?
  3. Java的基本类型有哪几个?String是不是java的基本类型?String为什么要是final类型的?
  4. 反射机制的底层实现是什么?动态呢?动态的实现原理?
  5. HashMap了解吗?说一下hashmap相关的一些东西?hashmap是线程安全的吗?为什么是线程安全的?
  6. concureenthashmap了解吗?他是如何实现线程安全的?
  7. 你刚才说1.8基于cas?cas的ABA问题怎么解决?
  8. 说一下JVM的线程模型?这些区域都分别是干啥用的?、
  9. 说一下Java类加载器的工作机制?类加载在哪个域进行的?
  10. 说一下Java的线程模型?
  11. violate了解吗?它的原理是什么?violate是线程安全的吗?
  12. 保证线程安全的解决方法有哪些?说一说读写锁吧,读写锁的读
  13. 数据库的索引有哪几种?为什么要用B+树来做索引?组合索引和几个单个的索引有什么区别?数据库的大表查询优化了解吗?MVCC机制了解不?MVCC机制有什么问题?怎么去解决这个问题?mysql慢语句调优做过吗?说说你是怎么做的?
  14. redis了解吗?你说说怎么用redis实现分布式锁?
  15. spring中Bean的作用域,springMVC的controller是线程安全的吗?怎么去保证线程安全呢?
  16. 消息队列有用过吗?说说你怎么用的?
  17. 计算机网络了解吗?说一说TCP三次握手和四次挥手吧
  18. time_wait状态产生的原因是什么?,有什么危害?可以如何避免?
  19. 寻找旋转排序数组中的最小值

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

你可以假设数组中不存在重复元素。

示例 1:

输入: [3,4,5,1,2]

输出: 1

示例 2:

输入: [4,5,6,7,0,1,2]

输出: 0

美团点评第二面:

  1. 首先还是问项目。
  2. String,StringBuffer,StringBuilder的区别,为什么String是不可变的,StringBuffer和StringBuilder哪个是线程安全的,他们分别适用于什么场景。
  3. java类加载过程是怎么样的,说一下volatile。
  4. 并发包了解吗?假如几个线程之间相互等待,可以用哪个并发类来实现,他的原理是什么?
  5. 数据库慢查询优化了解哪些?
  6. 说一下spring容器的启动过程?
  7. 讲一下分布式锁,基于zookeeper实现和redis实现在性能上有什么差异?
  8. kafka如何保证不丢消息又不会重复消费。了解大数据相关的一些技术吗?
  9. 最后写了道题:跳跃游戏;

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]

输出: true

解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]

输出: false

美团点评第三面:

  1. 自我介绍
  2. 项目介绍
  3. 怎么管理项目成员
  4. 当意见不一致时,如何沟通并说服开发成员,并举个例子
  5. 怎么保证项目的进度
  6. 数据库的索引原理
  7. 非聚簇索引和聚簇索引
  8. 索引的使用注意事项
  9. 联合索引
  10. 从底层解释最左匹配原则
  11. Mysql对联合索引有优化么?会自动调整顺序么?哪个版本开始优化?
  12. Redis的应用
  13. Redis的持久化的方式和原理
  14. 技术选型,一个新技术和一个稳定的旧技术,你会怎么选择,选择的考虑有哪些
  15. 说你印象最深的美团点评技术团队的三篇博客
  16. 最近在学什么新技术?
  17. 你是怎么去接触一门新技术的?
  18. 会看哪些书
  19. 怎么选择要看的书
  20. 为什么要转Java?

美团点评第四面:

  • 在原公司的哪一段时间是比较享受的?
  • 为什么现在出来看机会呢?看什么类型的机会?
  • 同事或者朋友之间如何评价你?
  • 平时如何学习呢?有没有什么技巧?
  • 你对我们的业务方向有了解吗?
  • 你的职业规划是什么?
  • 你的一些优点有哪些?
  • 目前还在看哪些机会呢?手里还有别的Offer吗?
  • 转Java之后有遇到哪些困难?怎么解决的?

美团4面面试题完整答案(详细解析版):

从安卓转到Java,我经历了哪些?如何才敢挑战美团?

(一)清楚自己要什么:调整心态,多给自己勇气,重新规划目标

安卓转Java,这个想法是需要比较大的勇气的,前后我大概是纠结了一年多的时间才做出了决定,期间的心态是比较复杂和焦虑的,最主要的是“担心”,所以要想成功转到Java,首先第一个难关就是自己的心态问题。这个过程中,我不断给自己加油打气,重新规划目标,才得以冷静且稳定下来,重新规划了自己的目标。

(二)清楚自己学什么:重新梳理知识结构,整理知识脉络

做安卓的,都是具备一定的Java基础的,所以相对其他语言来说,转Java要容易不少。但要想成为合格的Java后台开发,具备的技术肯定是远远不够的,因此需要重新去梳理一遍自己的知识结构,整理Java的知识脉络,清楚目前掌握了多少,需要学习哪些内容。

Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

(三)清楚面试问什么:飞速提升,恶补开源,刷题备战

当自己学习到一定程度后,需要的就是准备面试及工作了,所以这一步就需要让自己有一个飞速的提升,要优化自己所学,要清楚Java面试会问一些什么?因此接下来的安排就是要读一些书籍笔记,开始刷题备战面试了。

  • 实战系列:Spring全家桶+Redis等

  • 其他相关的电子书:源码+调优

  • 大厂面试题题库:阿里巴巴、腾讯、美团、字节跳动、网易、拼多多等

写在最后

说了这么多,不善言辞,也是随性发挥,想到啥说些啥,更多是对自己开发历程的一些感受和自己学习的方法。不过,最后我想表达的是,在开发过程中每一行代码,每一种设计模式的使用,思考的重点和角度都会有所不同。所以,能够尝试不同的技术栈,从不同的视角来思考并解决问题,融会贯通,才是我个人追求的技术之“道”。

以上内容中,我谈及到的学习方法、学习面试资料,均可以分享给大家,希望大家在今年的金九银十里能够发挥顺利,进到自己想进的公司,共勉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现正四面体的透视投影动态隐线算法,需要以下步骤: 1. 定义正四面体的顶点坐标和连接关系。 2. 根据相机位置和视角计算出每个顶点在屏幕上的坐标。 3. 对于每个面,判断其是否朝向相机,如果是则不需要绘制,否则需要进行透视投影。 4. 对于每个面,判断其是否需要显示边界,如果需要则进行动态隐线算法。 下面是一个简单的 Java 代码实现: ```java import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; public class Tetrahedron extends JPanel implements ActionListener { private static final int WIDTH = 800; private static final int HEIGHT = 600; private static final int SIZE = 100; private static final int[] X = {0, 0, SIZE/2, -SIZE/2}; private static final int[] Y = {0, SIZE, -SIZE/2, -SIZE/2}; private static final int[][] Z = {{0, SIZE/2, SIZE/2, SIZE/2}, {0, 0, SIZE/2, -SIZE/2}, {0, 0, -SIZE/2, SIZE/2}, {0, -SIZE, 0, 0}}; private static final int[][] CONNECT = {{0, 2}, {0, 3}, {0, 1}, {1, 2}, {1, 3}, {2, 3}}; private double angle = 0; private Timer timer = new Timer(30, this); public Tetrahedron() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); timer.start(); } @Override public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.clearRect(0, 0, WIDTH, HEIGHT); // calculate vertex coordinates double sin = Math.sin(angle); double cos = Math.cos(angle); int[][] coords = new int[4][2]; for (int i = 0; i < 4; i++) { int x = X[i]; int y = (int)(Y[i]*cos - Z[i][0]*sin); int z = (int)(Y[i]*sin + Z[i][0]*cos); coords[i][0] = x; coords[i][1] = (int)(y*cos - z*sin); } // draw edges g2d.setColor(Color.BLACK); for (int[] conn : CONNECT) { int x1 = coords[conn[0]][0] + WIDTH/2; int y1 = coords[conn[0]][1] + HEIGHT/2; int x2 = coords[conn[1]][0] + WIDTH/2; int y2 = coords[conn[1]][1] + HEIGHT/2; if (isVisible(x1, y1, x2, y2)) { g2d.drawLine(x1, y1, x2, y2); } } angle += 0.05; } private boolean isVisible(int x1, int y1, int x2, int y2) { boolean visible = true; for (int[] conn : CONNECT) { int x3 = X[conn[0]]; int y3 = Y[conn[0]]; int z3 = Z[conn[0]][0]; int x4 = X[conn[1]]; int y4 = Y[conn[1]]; int z4 = Z[conn[1]][0]; if (isIntersecting(x1, y1, x2, y2, x3, y3, z3, x4, y4, z4)) { visible = false; break; } } return visible; } private boolean isIntersecting(int x1, int y1, int x2, int y2, int x3, int y3, int z3, int x4, int y4, int z4) { double t = ((x3-x1)*(y4-y3) - (y3-y1)*(x4-x3))/((x2-x1)*(y4-y3) - (y2-y1)*(x4-x3)); double s = ((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1))/((x2-x1)*(y4-y3) - (y2-y1)*(x4-x3)); if (t >= 0 && t <= 1 && s >= 0 && s <= 1) { int z1 = (int)((1-t)*z3 + t*z4); int z2 = (int)((1-s)*z3 + s*z4); if (z1 < z2) { return true; } } return false; } public static void main(String[] args) { JFrame frame = new JFrame("Tetrahedron"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new Tetrahedron()); frame.pack(); frame.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { repaint(); } } ``` 在这个代码中,我们首先定义了正四面体的顶点坐标和连接关系,然后在 `paintComponent` 方法中计算出每个顶点在屏幕上的坐标。接着,我们绘制正四面体的边界,对于每条边,我们判断其是否需要进行透视投影和动态隐线算法。最后,在 `actionPerformed` 方法中更新角度并重绘图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值