首页 > 代码库 > 面试的角度诠释 Java 工程师(一)(上)

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

来源:locality,

http://www.jianshu.com/p/a0b8b6f17888

 

前言:

 

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

 

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

 

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

 

技术分享

 

一、基础篇

 

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集合框架树

 

技术分享

 

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,指定并侦听某一个端口,然后循环监听开始等待客户端的连接….

 

②创建客户端socket,指定服务器地址和端口,然后获取输出流,向服务器端发送请求,并关闭socket输出流。

 

③服务端接收到客户端的请求后,创建新线程并启动。

 

④创建线程处理类,执行线程操作,获取输入流,服务端读取客户端用户详情,关闭资源。

 

⑤执行线程操作,获取输出流,响应客户端请求,客户端接受到服务端的响应,关闭资源。

 

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

 

5.关系型数据库

 

数据库的三范式:

 

①字段不可分。

②有主键,非主键字段依赖主键。

③非主键字段不能互相依赖。

 

T-SQL:

 

技术分享

 

在整个数据库中,查询操作占据增删改查的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 称为子查询。

 

所以,我们就说子查询是嵌套在外查询内部的。而事实上它也有可能在子查询内部再嵌套一个或者多个子查询。这里要注意,子查询必须出现在圆括号之间哦。

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