面试的角度诠释Java工程师(一)

前言:

我相信每一个程序员都是为了生活而努力着的。很多人因为兴趣,从此踏上了这条‘烧脑大行动’的金桥;也有很多人因为梦想和执着,奋不顾身融入这个职业;还有很多人因为被现实逼得太无奈,不得不为自己、为家人、为未来谋这么一条坎坷的路。

这里,我不去评价什么,再说我也没有资格去评价啊。言归正传,下面我写这篇文章的定位是各位在场的读者,如果你认为我接下来说的内容会跟书里说的差不多,那么请高抬贵脚移步它处,但是我相信你绝对不会这样觉得的。不知道作为程序员的你们,是否还在抱着面试或者笔试题复习呢?是否还在抱着各种面试书乱翻呢?

我只说一点,面试的目的不是让考官知道你怎么样,而是让你自己清楚自己怎么样。也就是说你会什么、能够做什么!举个例子,如果你去面试Java工程师,你至少要会该职位的职能,而不是只会面面试、做做笔试题。所以,这就是我写这篇文章的初衷!

0和1.jpg

一、基础篇

1.面向对象的三大特性

继承、封装、多态

什么是继承?
①继承是面向对象程序设计能够提高软件开发效率的重要原因之一。
②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷。
③继承来的属性和方法是隐式的,也就是在本类里面是看不见的。
④一个类只能有一个父类,也就是类只能是单继承。
⑤一个接口可以有多个父类,也就是接口可以是多继承。
实际项目开发中,一个类继承于另一个类,那么前者就是后者的子类,反则反之。

什么是封装?
对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据。
实际项目开发中,使用封装最多的就是实体类,常常和JavaBean(类必须是具体的和公共的,并且具有无参数的构造器)一起使用。
那么,实体类有那些东西呢?
答:私有的成员变量、无参数的构造器、有参数的构造器、setter和getters方法、重写tostring方法、重写hashCode和equals方法。

什么是多态?
①多态就是对象拥有多种形态:引用多态和方法多态。
②引用多态:父类的引用可以指向本类对象、父类的引用可以指向子类的对象。
③方法多态:创建本类对象时,调用的方法为本类的方法;创建子类对象时,调用的方法为子类重写的方法或者继承的方法。
④存在多态的必要条件:继承、重写。
⑤多态的作用是消除类型之间的耦合关系。
在实际项目开发中,A类继承B类,如果在A类中不重写B类的方法的时候,输出的仍旧是B类方法里面的信息(B b=new A());如果在A类中重写B类的方法的时候,输出的是A类方法里面的信息(B b=new A())。

2.Java集合框架树

java集合框架成员.png

Collection接口:它是Java集合框架的一个根接口,也是List、Set和Queue接口的父接口。同时它定义了可用于操作List、Set和Queue的方法—增删改查。

Map接口:它提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的。Map接口有一个重要的实现类HashMap。
①在Map接口中的键值对是以Entry类型的对象实例形式存在。
②在Map接口中键值(Key值)是不可以重复的,value值却可以重复,也就是存在多对一的关系。
③在Map接口中提供了分别返回Key值的集合、value值的集合以及Entry集合的方法。
④Map支持泛型,同时Key值和value值都是可以为null的。
⑤在HashMap中的Entry对象是无序排序的,这点特性和List接口是相反的。
⑥在HashMap中有且只能有一个Key值为null的映射。(注:key值是不能重复的)

List接口:List接口有一个重要的实现类ArrayList(数组序列)。
①List是元素有序并且可以重复的集合。
②List可以精确的控制每个元素的插入位置,或删除某个元素的位置。

Comparator接口:临时的比较规则。如果某一个类要实现这个接口,那必然要实现它的Compare()方法。

Comparable接口:默认的比较规则。当实现了这个接口,则表示这个类的实例可以比较大小,可以进行自然排序。如果某一个类要实现这个接口,那必然要实现它的CompareTo()方法。

3.Java中的IO流

字节流

//一个字节一个字节的读写
FileInputStream in=new FileInputStream("源文件");
FileOutputStream out=new FileOutputStream("目标文件");
......
in.close();
out.close();

首先要记住,一旦使用了IO流最后一定要记得关闭,这是常识。

//利用缓冲区,高效的读取字节
BufferedInputStream in=new BufferedInputStream(new FileInputStream("源文件");
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("目标文件");
......
in.close();
out.close();

字符流

InputStreamReader isr=new InputStreamReader(new FileInputStream("源文件路径"),"设置编码");
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("目标文件路径"),"设置编码");
......
osw.close();
isr.close();

也可以这样写:

FileReader fr=new FileReader("源文件路径");
FileWriter fw=new FileWriter("目标文件路径");
......
fr.close();
fw.close();
//利用缓冲区,高效的读取字符
BufferedReader br=new BufferedReader(new FileReade("源文件路径");
PrintWriter pw=new PrintWriter("目标文件路径");
......
br.close();
pw.close();

序列化和反序列化

//对象的序列化
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));

这里的file指的是String file="文件在项目中的路径";

//对象的反序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));

4.Java的Socket通信(多线程)

Socket通信模型.png

思路:
①首先创建服务器端Socket,指定并侦听某一个端口,然后循环监听开始等待客户端的连接....
②创建客户端socket,指定服务器地址和端口,然后获取输出流,向服务器端发送请求,并关闭socket输出流。
③服务端接收到客户端的请求后,创建新线程并启动。
④创建线程处理类,执行线程操作,获取输入流,服务端读取客户端用户详情,关闭资源。
⑤执行线程操作,获取输出流,响应客户端请求,客户端接受到服务端的响应,关闭资源。

简单点讲,就相当于我跟你说话(客户端→服务端),你收到我说的话(服务端→线程处理类),大脑进行思考后(线程处理类),做出回答我的话(线程处理类→客户端)。

5.关系型数据库

数据库的三范式
①字段不可分。
②有主键,非主键字段依赖主键。
③非主键字段不能互相依赖。

T-SQL

T-SQL简介.png

在整个数据库中,查询操作占据增删改查的80%,而说到查询,T-SQL语句自然不能少。如图上示。


①插入单行
insert into <表名> (列名) values (列值)
②将现有的表数据添加到一个已有表
insert into <已有的新表> (列名) select <源表列名> from <源表名>
③直接拿现有表数据创建一个新表并填充
select <新建表列名> into <新建表名> from <源表名>


①删除满足条件的行
delete from <表名> where <删除条件>
②删除整个表
truncate table <表名>

注:删除表的所有行,但表的结构、列、约束、索引等不会被删除;不能用语有外建约束引用的表。


①更新
update <表名> set <列名=更新值> where <更新条件>

子查询
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

其中:
①SELECT * FROM t1 ...称为外查询。
②SELECT column1 FROM t2 称为子查询。
所以,我们就说子查询是嵌套在外查询内部的。而事实上它也有可能在子查询内部再嵌套一个或者多个子查询。这里要注意,子查询必须出现在圆括号之间哦。

二、Web篇

JavaScript总结

JSP:

JSP页面生命周期.png

思路:当用户使用客户端浏览器向服务器发送一个请求访问index.jsp页面,当服务器接收到客户的请求之后,开始判断用户所访问的这个资源是否是第一次访问?
①如果是第一次请求,那么Tomcat的JSP引擎就把这个JSP文件转换成一个Servlet(一个Servlet从本质上而言也是一个Java类),既然是一个Java类就需要通过编译,生成相应的字节码文件,然后执行jspInit这个初始化方法。再生成JSP页面的字节码文件,转到③。
②直接访问所生成的JSP页面的字节码文件,转到③。
③最后解析执行这个Java类当中的jspService方法,这个方法就是专门用来处理用户的请求。

JSP九大内置对象:

JSP内置对象简介.png

out对象:它是JspWriter类的实例,是向客户端输出内容常用的对象。
request对象:它表示客户端的一次请求,这个请求里面的信息是被封装在request对象中的。同时它也是HttpServletRequest类的实例,并且具有请求域,也就是在完成客户端的请求之前,该对象是一直有效的。
常用方法

request.setCharacterEncoding("UTF-8");//设置编码,解决中文乱码问题。
request.setAttribute("","");//前者为需要设置的属性,后者为需要的值。
request.getAttribute();
request.getRequestDispatcher("index.jsp").forward(request, response);//请求转发到index.jsp页面,该请求对象是一直有效的。

response对象:它包含了响应客户请求的相关信息,它也是HttpServletResponse类的实例。和request一样,它具有页面的作用域,也就是在访问一个页面的时候,该页面的response对象只对这次访问有效,往后执行是不存在、无效的。
常用方法

response.setContentType("text/html","charset="utf-8");//设置响应的MIMI类型。
response.sendRedirect("index.jsp");//请求重定向,如果存在多次重定向,那么对象数据是不会保存下来的,即为null。

请求转发和请求重定向的区别分析:

请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
请求转发:服务器行为,request.getRequestDispatcher().forward(req, resp);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。

session对象:当我们第一次访问页面的时候,session对象就会被自动装载和创建。它是HttpSession类的实例对象。
什么是会话?为什么要用session对象?

会话:当一个客户端打开浏览器连接到服务器开始,到客户端关闭浏览器服务器结束这个过程,我们称为一个会话。
在实际情况下,客户在访问服务器的过程中,避免不了会在服务器的几个页面之间切换,这时候服务端有必要知道当前操作的客户是不是操作前几个页面的客户,也就是必须要清楚知道是否同一个人在进行操作。所以就引入了session对象这个概念。

application对象:它实现了用户间数据的共享,可以存放全局变量,它是ServletContext类的实例。它的生命周期开始于服务器的启动,终止于服务器的关闭。

注:
①在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
②在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。

JSP的指令和动作:

①三个编译指令:page、include、taglib。
②七个动作指令:jsp:forward、jsp:param、jsp:include、jsp:plugin、jsp:useBean、jsp:setProperty、jsp:getPProperty。

JSP指令

JSP指令.png

include指令和include动作指令区别

include指令与include动作的区别.png

Session的生命周期

session的生命周期.png

Session生命周期的“活动”思路:
①某次会话当中通过超链接打开的新页面属于同一次会话。
②只有当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
③除非本次会话的所有页面都关闭后再重新访问某个Jsp或者Servlet将会创建新的会话。

注:
注意原有会话是还存在的,只是这个旧的SessionId仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务端校验。

Session与Cookie的对比.png
过滤器的工作原理.png
过滤器的生命周期.png

注:
①当Web容器启动的时候,过滤器就已经加载并启动了。
②实例化只会实例化一次,也就是说在Web容器中只会使用一次。

过滤器的分类.png
Servlet生命周期.png

思路:
①首先判断Servlet实例是否存在,如果存在则跳入第③步。
②初始化阶段,init初始化方法是在创建实例之后完成的。
③响应阶段,响应客户端的请求,调用service()方法。由service()方法根据提交方式选择性执行doGet()方法或者doPost()方法。
④终止阶段,调用Destroy()方法销毁,服务器关闭。

Tomcat容器等级.png

Web监听器

web监听器.png

Web监听器是有Servlet规范定义的一种特殊类,它可以监听客户端的请求和服务端的操作,同时它还可以监听,包括ServletContext、HttpSession、ServletRequest等对象。

Web监听器的启动顺序.png

监听器的分类

HttpSession的事件监听器

HttpSession的事件监听器.png

ServletContext的事件监听器

ServletContext的事件监听器.png

ServletRequest的事件监听器

ServletRequest的事件监听器.png

注:
这三个监听事件,分别实现对应的接口,也就是图示的1..N。既然实现了接口,即必然要实现其对应的方法,如图所示。主要用途也如图所示。

绑定到HttpSession域中的对象状态的事件监听器

绑定到HttpSession域中的对象状态的事件监听器.png

注:
为什么要用session钝化?
首先,正常情况下,我们的session是存放在服务器的session当中的,但是如果我们的用户很多的时候,仍然把session存放在服务器里,这时服务器的开销是很大的,会直接影响我们Web应用的使用。所以就需要使用到session钝化机制,它的本质就是将服务器未使用到的session对象暂时序列化到系统文件当中,当要使用的时候再反序列化到服务器内存当中。

Model1和Model2

Model1模型.png

注:
Model1是最早的能体现分层思想的一种开发模式,简单来说Model1就是一种Jsp+JavaBean的一种开发模式。
缺点:可维护性和可扩展性是比较差的。

Model2模型.png

思路:
①首先由Jsp页面向Servlet提交一个请求。
②然后在我们的控制层Servlet实例化一个模型层的对象或者调用模型层的一些功能。
③然后由模型层来访问读取我们的数据库层。
④当得到读取到结果后,再将结果返回到我们的控制层。
⑤控制层得到这个结果后,会根据这个结果给用户展示不同的Jsp页面。

下一篇:面试的角度诠释Java工程师(二)


如果大家觉得我写的对你有帮助,请顺手点个赞支持一下呗;如果大家觉得我有写的不对的地方,欢迎大家多多发言。谢谢!

转载请注明作者及文章出处噢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,934评论 6 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,604评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,220评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,642评论 18 139
  • 刚开始做表单提交图片的时候,遇到一个问题,就是如果采用前后分离的方式来做表单提交,那么这种情况下图片的上传将如何实...
    树_b1f5阅读 2,712评论 0 0