一个中级java工程师应该掌握哪些知识?有啥途径去获取这些知识?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个中级java工程师应该掌握哪些知识?有啥途径去获取这些知识?相关的知识,希望对你有一定的参考价值。

首先起码有自己的技术体系结构,并可以持续丰富这个体系结构;主动寻找大型项目的机会,提高自己的综合能力;除了写博客之外,录制一些编程开发的视频,扩展自己的技能;编码能力(点(算法)、线(设计模式、组织代码)、面(框架和学习、理解和应用)、体(操作系统、计算机网络、编译原理等))业务能力(理解需求或问题能力、沟通和协调资源能力、预估和安排计划能力、调研和解决问题能力)

1.接口和抽象类的区别

抽象类里可以有构造方法,而接口内不能有构造方法。抽象类中可以有普通成员变量,而接口中不能有普通成员变量。抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只有public和默认类型。抽象类中可以包含静态方法,接口内不能包含静态方法。抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public  static类型,并且默认为public static类型。一个类可以实现多个接口,但只能继承一个抽象类。接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用。

2.Java虚拟机的运行时数据区有几块?线程私有和线程共享区域有哪些?

程序计数器:线程私有,当前县城执行的字节码的行号指示器。虚拟机栈:线程私有,存放基本数据类型、对象引用和returnAddress类型。本地方法栈:为虚拟机使用到的Native方法服务。Java堆:线程共享,存放对象的实例,也是GC回收器管理的主要区域。方法区:线程共享,存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。运行时常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用。直接内存:不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,容易引起OOM异常,NIO会调用,不受Java堆大小的限制。


3.HashMap和HashTable区别?

Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。Hashtable的方法是同步的,而HashMap的方法不是,因此HashTable是线程安全的,但是代码的执行效率上要慢于HashMap。HashMap允许空值和空键,但是HashTable不可以。HashMap非同步实现Map接口,是一个“链表数组”的数据结构,最大承载量是16,可以自动变长,由Entry[]控制(key,value,next),hashCode()判断key

接下来是一些经验和需要的框架  

3-5年软件研发经验,2年以上软件架构设计经验;
精通weblogic、jboss tomcat、websphere等应用服务器
精通linux\\windows系统上的安装部署、配置及性能调优;
掌握EJB、servlet、JSP等技术
掌握Spring MVC、dubbo、Spring boot、spring cloud、hibernate、MyBatis等开源框架
掌握分布式开发新技术;
熟练掌握html、CSS、javascript等WEB页面设计与编程
熟悉AJAX;精通数据库技术,至少精通
SQLServer/DB2/Oracle/mysql中两种数据库;
精通OOD、OOP及软件架构设计模式
至少熟悉UML及Visio/Rational Rose/PowerDesigner中一种设计工具;
熟悉软件工程思想与软件设计开发流程;
有Redis和MongDB、Memcached应用经验优先;
良好的沟通协调能力,具备良好的学习能力和潜力;

参考技术A 中级java工程师需要对Java的一些基本东西都要全部了解,其次也应该有着更多的制作工程技术,同时也需要解决更多的问题,而且也需要在做编程的时候有更多的了解和探知,可以向相关的课程也可以在学校学习,都会有着一定的帮助,而且能够让java的语言学习的更好。 参考技术B 精通消息列队的配置和使用,定时任务的配置和使用,自动化测试用例编写等,可以通过读书,查阅资料,翻看视频,或者找老师学习。 参考技术C 一个中级java工程师应该掌握编码能力和业务能力,可以通过网上课程获取这些知识,中级java工程师需要综合能力,丰富的经验。

JAVA中级开发应该掌握的小知识点

一.悲观锁、乐观锁的区别:

悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行,只有一个线程可以执行,其他线程在入口处等待,直到锁被释放。
乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行,可以同时进入执行,在最后跟新数据时候检查这些数据是否被其他线程修改,
版本和执行初是否相同),没有修改进行跟新,有就放弃这次操作。
//0.开始事务
begin;/begin work;/start transaction; (三者选一就可以)
//1.查询出商品信息
select status from t_goods where id=1 for update;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2;
//4.提交事务
commit;/commit work;


1.查询出商品信息
select (status,status,version) from t_goods where id=#id
2.根据商品信息生成订单
3.修改商品status为2
update t_goods
set status=2,version=version+1
where id=#id and version=#version;


 

二.mysql的优化:

1.尽量避免全表查询,在where和order by 后面建立索引

2.尽量避免where条件后面使用!=和<>的操作符,否则会引起引擎放弃索引而走全表查询

3.尽量使用数字型字段,不要设计为字符型字段,,这样会降低查询和链接性能,并会增加存储开销
这是因为引擎在处理查询和链接时候会逐个比较字符串中每个字符,而数字型而言只需要一次


 

三.线程池:

在初始化一个多线程程序中创建的一个线程集合,然后在需要执行新的任务时候重用这些线程而不是新建一个线程。

好处:
1、线程池改进了一个应用程序的响应时间。由于线程池中的线程已经准备好且等待被分配任务,应用程序可以直接拿来使用而不用新建一个线程。

2、线程池节省了CLR 为每个短生存周期任务创建一个完整的线程的开销并可以在任务完成后回收资源。

3、线程池根据当前在系统中运行的进程来优化线程时间片。

4、线程池允许我们开启多个任务而不用为每个线程设置属性。

5、线程池允许我们为正在执行的任务的程序参数传递一个包含状态信息的对象引用。

6、线程池可以用来解决处理一个特定请求最大线程数量限制问题。


 

四.JVM里面的概念:

1、Java虚拟机栈:

线程私有;每个方法在执行的时候会创建一个栈帧,存储了局部变量表,操作数栈,动态连接,方法返回地址等;每个方法从调用到执行完毕,
对应一个栈帧在虚拟机栈中的入栈和出栈。

2、堆:
线程共享;被所有线程共享的一块内存区域,在虚拟机启动时创建,用于存放对象实例。

3、方法区:
线程共享;被所有线程共享的一块内存区域;用于存储已被虚拟机加载的类信息,常量,静态变量等。

4、程序计数器:
线程私有;是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。

5、本地方法栈:
线程私有;主要为虚拟机使用到的Native方法服务。


 

五.TCP三次握手

TCP三次握手:
三次握手就是建立一个TCP连接,里面客户端和服务端总共发3个包以确定连接的建立。在socket编程中由客户端执行
connect来触发。

TCP三次握手.png
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,
等待Server确认。

(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,
随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据
包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,
完成三次握手,随后Client与Server之间可以开始传输数据了。

简单来说,就是

1、建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认

2、服务器收到SYN包,必须确认客户的SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态

3、客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,
完成三次握手,客户端与服务器开始传送数据。


 

六.TCP四次挥手.png

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向
的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,
直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),
Server进入CLOSE_WAIT状态。

(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入
CLOSED状态,完成四次挥手。


七.Kafka、ActiveMQ、RabbitMQ、RocketMQ

一般的业务系统要引入 MQ,最早大家都用 ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,
所以大家还是算了吧,我个人不推荐用这个了;

后来大家开始用 RabbitMQ,但是确实 erlang 语言阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,
但是确实人家是开源的,比较稳定的支持,活跃度也高;

不过现在确实越来越多的公司会去用 RocketMQ,确实很不错,毕竟是阿里出品,但社区可能有突然黄掉的风险(目前 RocketMQ
已捐给 Apache,但 GitHub 上的活跃度其实不算高)对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用
RabbitMQ 吧,人家有活跃的开源社区,绝对不会黄。

所以中小型公司,技术实力较为一般,技术挑战不是特别高,用 RabbitMQ 是不错的选择;大型公司,基础架构研发实力较强,
用 RocketMQ 是很好的选择。

如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况
几乎是全世界这个领域的事实性规范。


 

八.HashMap源码解析(jdk1.8):

HashMap结构在jdk1.2开始出现,一直到jdk1.7一直没有太多变化,在1.8后有个大变化
jdk1.7:数组+链表(增删效率高)
jdk1.8:数组+链表+红黑(查询效率也变快了)

红黑树只有在链表长度不小于8,而且数组长度不小于64才可以转化为红黑树

什么是红黑树:一个自平衡的二叉查找树,也就是说红黑树的查询效率更高


九.单例模式:

懒汉式单例

public class Singleton 
private static Singleton singleton = null;
private Singleton()

public synchronized static Singleton getSingleton()
if(singleton == null)
singleton = new Singleton();

return singleton;

 

饿汉式单例:

public class Singleton 
private static final Singleton singleton = new Singleton();
private Singleton()

public static Singleton getSingleton()
return singleton;

 

Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,
因为它限制了实例的个数,有利于Java垃圾回收


十.sql中exists 和not exists用法:

exist:强调的是返回的结果集,而不要求知道返回的是什么(exists子句不在乎返回什么,而是在乎是不是有结果集返回)

exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
select name from student where sex = ‘m‘ and mark in (select 1,2,3 from grade where ...)

,in子句返回了三个字段,这是不正确的,exists子句是允许的,但in只允许有一个字段返回,在1,2,3中随便去了两个字段即可。


十一.SOA:SOA又叫服务治理,帮助我们把服务之间调用的系统治理起来

统一标准:各系统的协议、地址、交互方式。
新的交互方式:各个系统分别根据统一标准向数据总线进行注册,各子系统调用其他子系统时,我们并不关心如果找到其他子系统,
我们只招数据总线,数据总线再根据统一标准找其他子系统,所以数据总线在这里充当一个只路人的作用。

SOA的好处:

1、降低用户成本,用户不需要关心各服务之间是什么语言的、不需要知道如果调用他们,只要通过统一标准找数据总线就可以了。

2、程序之间关系服务简单

3、识别哪些程序有问题(挂掉)

缺点:提示了系统的复杂程度,性能有相应影响。

目前应用数据总线的有阿里的dubbo,还有zookeeper。

 

 

 

以上是关于一个中级java工程师应该掌握哪些知识?有啥途径去获取这些知识?的主要内容,如果未能解决你的问题,请参考以下文章

计算机与软件专业技术资格(水平)中级网络工程师考试都考哪些内容?

JAVA中级开发应该掌握的小知识点

java工程师需要掌握哪些知识

java工程师需要掌握啥技能?

初中级前端开发工程师如何提升个人能力?

Java工程师应该掌握的相关知识(基础篇01)