Java工程师面试基础篇(一)

    |     2017年2月15日   |   Java面试题   |     0 条评论   |    1687

我相信每一个程序员都是为了生活而努力着的。很多人因为兴趣踏上这条“烧脑”路;也有人因为梦想和执着;还有人被现实逼着,为自己、为家人谋这么一条坎坷的路。面试的目的不是让考官知道你怎么样,而是让你自己清楚你会什么、能够做什么。去面 Java 工程师,至少要会该职位的职能,而不是只会背题。

20140731144525904006

下面按基础篇整理:面向对象、集合、IO、Socket、关系型数据库。若你觉得会和书上差不多,可以先对照自己会不会动手写。

一、面向对象的三大特性

继承、封装、多态。

什么是继承?

  • 继承是面向对象能提高软件开发效率的重要原因之一。
  • 继承具有传递性,像孙子不仅像爸爸还像爷爷。
  • 继承来的属性和方法是隐式的,在本类里看不见。
  • 类只能单继承:一个类只能有一个父类。
  • 一个接口可以有多个父接口,接口可以多继承。

实际项目中,A 继承 B,则 A 是 B 的子类。

什么是封装?

对象数据和操作该对象的指令都是对象自身的一部分,尽可能对外部隐藏数据。项目里封装用得最多的是实体类,常和 JavaBean 一起用:类必须具体且 public,并有无参构造器。实体类通常包含:私有成员变量、无参/有参构造器、setter/getter、重写 toString、重写 hashCode 和 equals。

什么是多态?

  • 对象拥有多种形态:引用多态和方法多态。
  • 引用多态:父类引用可指向本类对象,也可指向子类对象。
  • 方法多态:创建本类对象时调本类方法;创建子类对象时调子类重写的方法或继承的方法。
  • 必要条件:继承、重写。
  • 作用是消除类型之间的耦合。

A 继承 B:A 不重写 B 的方法时,B b = new A() 输出仍是 B 方法里的信息;A 重写后,同样写法输出 A 方法里的信息。

二、Java 集合框架树

Collection 接口:集合框架的根接口之一,也是 List、Set 和 Queue 的父接口,定义增删改查。

Map 接口:提供映射关系,元素以键值对存储。重要实现类 HashMap。

  • 键值对以 Entry 对象实例存在。
  • Key 不可重复,value 可以,即多对一。
  • 可分别返回 Key 集合、value 集合、Entry 集合。
  • 支持泛型;Key 和 value 都可以为 null。
  • HashMap 的 Entry 无序,和 List 相反。
  • 有且只能有一个 Key 为 null 的映射(key 不能重复)。

List 接口:重要实现类 ArrayList。元素有序且可重复;可精确控制插入或删除位置。

Comparator:临时比较规则,实现类必须实现 compare()。 Comparable:默认比较规则,实例可比较大小、可自然排序,必须实现 compareTo()。

接口 特点
Collection List / Set / Queue 的根,定义增删改查
List 有序可重复,可按位置操作
Map Entry 键值对,Key 唯一
Comparable / Comparator 自然排序 vs 临时比较器

三、Java 中的 IO 流

字节流:用完一定要关闭。

// 一个字节一个字节的读写
FileInputStream in = new FileInputStream("源文件");
FileOutputStream out = new FileOutputStream("目标文件");
......
in.close();
out.close();
// 利用缓冲区,高效的读取字节
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 FileReader("源文件路径"));
PrintWriter pw = new PrintWriter("目标文件路径");
......
br.close();
pw.close();

序列化和反序列化。这里的 file 指 String file = "文件在项目中的路径";:

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

四、Java 的 Socket 通信(多线程)

思路:

  • 创建服务器端 Socket,指定并侦听某一端口,循环等待客户端连接。
  • 创建客户端 Socket,指定服务器地址和端口,获取输出流向服务器发请求,关闭 socket 输出流。
  • 服务端收到请求后,创建新线程并启动。
  • 线程处理类获取输入流,读取客户端详情,关闭资源。
  • 获取输出流响应客户端,客户端收到响应后关闭资源。

简单讲:我跟你说话(客户端→服务端),你收到后交给大脑思考(线程处理类),再回答我(线程处理类→客户端)。

五、关系型数据库

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

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); 外层是外查询,括号内是子查询,必须出现在圆括号之间,还可以再嵌套。

转至:http://www.jianshu.com/p/e4ba72acffa9#

一句话总结:面试基础篇先把继承封装多态讲清楚,再顺着集合树、IO 开关流、Socket 一请求一线程、SQL 三范式和增删改查把动手能力摆出来。

转载请注明来源:Java工程师面试基础篇(一)
本文链接地址:https://ai.zhousir.top/?p=1918
回复 取消