C++ 和 Java
怎么选?博主向同学了解了C++的一些情况:C++学的东西比java要少:C++基础、网络、linux好像大概就这些;而Java呢:java基础、linux、网络、SSM等框架、分布式框架、消息中间件。java面试中的linux和网络要比C++要浅,但是javaEE那些框架就够你喝几壶的了,何况还有懂框架源码。另外,分布式、消息中间件这些你不但但要会用,更重要的是要了解底层原理:如何实现高可用、如果实现消息不丢失等等一些原理。当然不要被我吓唬到了这些其实并不非常难,只是东西有点多~
C++ 的岗位偏窄,服务器开发,客户端开发,游戏开发三部分。
Java 主要有后端和大数据,其中后端公司招的很多。
那java优势呢?按照上面这么说java就一无是处了。java学的东西多,但是这也意味着java的选择很广,java可以做web后台、客户端、分布式、大数据等等,而且javaEE用的也很广,各种网站就不用说了吧,阿里系主要就是java。C++就业相对要“窄”一些,C++偏底层一些,所以操作系统、网络这些要求较高。偏底层就业选择相对窄一些。这里说的相对指意思是不是压倒性优势。
C++ 偏底层,对操作系统,计算机网络会深入的问。
Java 偏应用层,知识范围广,深度没有C++那么深。
如何选择?在和走C++方向的同学聊天过程中了解到:C++的项目基本都是来自实验室,很少网络上找项目,主要是不好找......C++做图像、深度学习相关的实验室较多,他们的项目也是大多来源于此。也就是如果你的实验室没有较好的C++项目背景,建议走java方向,除非你解决了C++项目问题。反过来看java:应该很少实验室说是java方向,但是java自学相对比较简单,重要的是如果实验室没有“拿得出手”的项目,选择Java的同学可以在网络上找,而且在网络上找java项目的同学不是少数,因为javaEE项目网络上遍地都是,当然有时候这也带来了选择问题。但是如果你实验室有C++相关项目,那么你可以考虑选择C++。
C++ 项目自己不容易做
Java 的项目网上很多,自学容易,而且与Java EE广泛结合,面试容易被问到。
02 javaEE入门学习
上面的基础部分的学习主要是为后阶段打好基础。javaEE是java开发学习路上举足轻重的一员,那么javaEE该如何学习呢?框架那么多,该学哪些呢?从哪个框架开始学习呢?从博主以及身边同学的面试来看,javaEE主要需要掌握以下几个部分:servlet、jsp、hibernate、mybatis、springMvc、spring,有余力的同学可以学习spring boot,它是轻量级的spring,互联网公司使用较多,学完spring之后,学习spring boot就很简单了。框架学习顺序,在整理的资料中有写。
servlet和jsp属于基础,高层框架都是建立在servlet和jsp的基础之上,博主和身边同学建议学习。虽然现在项目中很少直接使用jsp和servlet,但是框架都是在这基础之上进行了封装,学习servlet和jsp可以帮助你更好的理解框架,而不是只会配置,调API,不知原理。另外,servlet在面试中问的很多,jsp面试问的少,但是后面做项目的时候你得会写简单的页面啊,否则项目都搭不起来,会产生严重挫败感。
如何高效学习Java EE?跟着视频过一遍,重点掌握面试内容,在实际项目中加深理解。
怎么选项目?
-
首先最好是使用SSM框架的项目,SSH用的不太多,不推荐;
-
分布式的项目最好是,不是也没关系,大部分网络上的项目都不是分布式的;
-
最好不要找商城,因为商城已经烂大街 了。
-
数据库最好mysql,另外面试时数据库表设计也会是常问问题,大家学习的时候注意一下
如何高效准备项目? 不要盲目的跟着视频敲一遍,这样写出来的代码没有亮点,最好找别人的项目或者现有的项目,找到项目中的亮点中点。
Java 的面试重点
java语言基本使用能力; 使用IDEA熟练编写Java代码
面向对象特性;类、
接口抽象类区别;
重载、重写区别;
JDK8新特性、
以上为Java 面向对象基础
JDK容器源码:HashMap、ArrayList、LinkedList、AQS、ConcurrentHashMap等;
JDK concurrent包下的源码;
以上为Java集合和Java并发
java虚拟机:内存模型、gc、类加载、异常的分类和排查;
设计模式(最好找到JDK或者spring等框架中中对应场景);
设计模式不要单独看,后期结合spring 和 JDK源码看
排序算法;Object中的方法;如何排查OOM;如何判断死循环;违反双亲委派模型的案例;
java反射和CGLIB原理以及异同;
阻塞队列的源码(要求手写实现,重点);
创建对象的四种方式等等。
多线程并发:synchronize特性、volatile特性、JMM中的原子操作(read、load、use;assign、store、write)、countDownLatch和CyclicBarrier异同点;线程池参数、类型;如何让多个线程有序运行;生产者消费者等;创建线程的三种方式;进程和线程之间的区别;进程见间通信的方式;会写简单的sock通信代码;IO 操作;如何让多个线程顺序执行等等。
数据库:mysql索引底层实现:B+树;索引失效场景/原因;SQL优化;SQL注入等相关web安全问题;MySQL主从复制;Redis常用数据结构(能看一两数据结构源码最好);Redis集群;Redis分布式锁;持久化AOF、RDB;Redis应用场景、解决了什么问题、秒杀系统;基本SQL语句、ACID、隔离级别、MVCC、行锁和表锁等。
javaEE:get、post的区别;request头;response头;这块问题大多和你的项目有关,session和cookie、SSM框架,spring源码(能看多少是多少,一定会问)。spring解决了哪些问题、spring的IOC,AOP,spring事务、spring bean。springMVC生命周期,一个完整的http请求包括哪些流程、https访问流程:加密解密(对称加密和非对称加密);servlet生命周期。项目如何考虑分布式问题
linux:虚拟内存、查看某个进程使用的内存,cpu、查找某个文件、查找某个大文件中的关键字所在位置;查看磁盘使用;用户空间和内核空间的区别;linux常用命令;chmod,ps,top,grep,linux软硬链接、权限等等。另外,有的公司也会问:select、poll和epoll异同。
系统设计:给定一个现实场景,让你完成对应系统的设计。keep:如何实现360的开机时间、百度:实现QQ通信,问的很细,包括协议;度小满:秒杀系统设计。后面会有相关文章总结。
计算机网络:OSI七层模型、经典五层模型、tcp三次握手四次挥手、流量控制和拥塞控制、tcp和udp区别、如何解决很多个tcp连接处在time_waiting状态等等。一定要能画出三次握手和四次挥手的状态图,以及记住每个状态的名字。
分布式:zookeeper及其应用场景,zookeeper可以解决绝大部分面试中的分布式问题:高可用、分布式读写锁、分布式共享锁、分布式队列等等。所以感觉学习zookeeper性价比很高。