Java 开发面试题整理(2019 春招版)
1、ArrayList 和 LinkedList 可想从名字分析,它们一个是 Array(动态数组)的数据结构,一个是 Link(链表)的数据结构,此外,它们两个都是对 List 接口的实现。前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列
2、当随机访问 List 时(get 和 set 操作),ArrayList 比 LinkedList 的效率更高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
3、当对数据进行增加和删除的操作时(add 和 remove 操作),LinkedList 比 ArrayList 的效率更高,因为 ArrayList 是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
4、从利用效率来看,ArrayList 自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而 LinkedList 自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
5、ArrayList 主要控件开销在于需要在 lList 列表预留一定空间;而 LinkList 主要控件开销在于需要存储结点信息以及结点指针信息。
4. RESTFul 风格接口的特点?
此题是现在做应用开发常问的题目,RestFul 风格在现在的应用开发还是比较常用的,所以还是比较重要,建议进行了解:以下是作者自认为不错的一篇关于 RestFul 架构风格的博客,推荐!博客·链接
5. 面向对象的七种设计原则
面向对象七大设计原则:
1、 开闭原则(OCP:Open Closed Principle)
核心:对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
根据开闭原则,在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。
2、 里氏替换原则(LSP:Liskov Substitution Principle)
核心:在任何父类出现的地方都可以用他的子类来替代(子类应当可以替换父类并出现在父类能够出现的任何地方)
1.子类必须完全实现父类的方法。在类中调用其他类是务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了 LSP 原则。
2.子类可以有自己的个性。子类当然可以有自己的行为和外观了,也就是方法和属性
3.覆盖或实现父类的方法时输入参数可以被放大。即子类可以重载父类的方法,但输入参数应比父类方法中的大,这样在子类代替父类的时候,调用的仍然是父类的方法。即以子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或者更宽松。
4.覆盖或实现父类的方法时输出结果可以被缩小。
3、 单一职责原则(SRP:Single responsibility principle)
核心:解耦和增强内聚性(高内聚,低耦合)
类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。
4、 接口隔离原则(ISP:Interface Segregation Principle)
核心思想:不应该强迫客户程序依赖他们不需要使用的方法。接口分离原则的意思就是:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口当中.
分离接口的两种实现方法:
1.使用委托分离接口。(Separation through Delegation)
2.使用多重继承分离接口。(Separation through Multiple Inheritance)
5、 依赖倒置原则(DIP:Dependence Inversion Principle)
核心:要依赖于抽象,不要依赖于具体的实现
1.高层模块不应该依赖低层模块,两者都应该依赖其抽象(抽象类或接口)
2.抽象不应该依赖细节(具体实现)
3.细节(具体实现)应该依赖抽象。
三种实现方式:
1.通过构造函数传递依赖对象
2.通过 setter 方法传递依赖对象
3.接口声明实现依赖对象
6、 迪米特原则(最少知识原则)(LOD:Law of Demeter)
核心思想:一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。(类间解耦,低耦合)意思就是降低各个对象之间的耦合,提高系统的可维护性;在模块之间只通过接口来通信,而不理会模块的内部工作原理,可以使各个模块的耦合成都降到最低,促进软件的复用
注:
1.在类的划分上,应该创建有弱耦合的类;
2.在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
3.在类的设计上,只要有可能,一个类应当设计成不变;
4.在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
5.尽量降低类的访问权限;
6.谨慎使用序列化功能;
7.不要暴露类成员,而应该提供相应的访问器(属性)
7、 组合/聚合复用原则(CRP:Composite Reuse Principle)
核心思想:尽量使用对象组合,而不是继承来达到复用的目的。该原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。
复用的种类:
1.继承
2.合成聚合
注:在复用时应优先考虑使用合成聚合而不是继承
6. 谈谈堆和栈的区别!
a.堆栈空间分配
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收,分配方式倒是类似于链表
b.堆栈缓存方式
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
c.堆栈数据结构区别
堆(数据结构):堆可以被看成是一棵树,如:堆排序。
栈(数据结构):一种先进后出的数据结构。
7. 谈谈你所了解的设计模式,并简单描述其特点和用法,或简单写一个某某设计模式!
1. 单例设计模式
2. 工厂设计模式
3. 代理模式
4. 观察者设计模式
5. 适配器模式
6. 策略模式
7. 门面模式
8. 桥接模式
来一个参考链接几种常用的设计模式参考博客链接
注:设计模式有很多,这里列举几种常用的!读者需要自行将这几种设计模式理解清楚!前五种是常用也是常考的!
8. 熟悉 HTTP 基本的状态码!
一些常见的状态码为:
200 - 服务器成功返回网页
404 - 请求的网页不存在
503 - 服务不可用
具体详细的可以参考博客?HTTP状态码详细博客链接
9. List、Set 和 Map 的特点和区别(重点)
List:
1.可以允许重复的对象。
2.可以插入多个 null 元素。
3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
Set:
1.不允许重复对象
2.无序容器,你无法保证每个元素的存储顺序,TreeSet 通过 Comparator 或者 Comparable 维护了一个排序顺序。
3.只允许一个 null 元素
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
Map:
1.不是 collection 的子接口或者实现类。Map 是一个接口。
2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3.TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4.Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap 最常用)
10.监听器、过滤器、拦截器、se
rvlet 的区别
**eb.xml 的加载顺序是:context- param -> listener -> filter -> servlet
监听器(listener):**
在 request、session、application 三个对象创建消亡或者往其中增/删/改属性时自动执行指定代码的功能组件。
生命周期:随 web 应用的启动而启动,只初始化一次,随 web 应用的停止而销毁。
作用:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
过滤器(filter):
拦截请求,filter 能够在一个请求到达控制层之前预处理用户请求,也可以在离开控制层时处理 http 响应,进行一些设置以及逻辑判断,然后再传入 servlet 或者 struts 的 action 进行业务逻辑,基于函数回调。
生命周期:它是随你的 web 应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的 web 应用停止或重新部署的时候才销毁。
作用:a.对请求或响应(Request、Response)统一设置统一编码,简化操作;b.进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。c.过滤掉非法 url
拦截器(interceptor):
拦截器是在面向切面编程中应用的,基于 JAVA 的反射机制,在一个业务逻辑(某个方法) 前、后调用另一个方法。
生命周期:
作用:
servlet:
servlet 是一种运行服务器端的 java 应用程序,具有独立于平台和协议的特性,并且可以动态的生成 web 页面,它工作在客户端请求与服务器响应的中间层。
参考链接:参考博客链接
11. 当在浏览器输入一个网址,所要经过的全部在过程,请详细描述!
浏览器访问某地址的详细过程:
在服务器上输入一个地址:例如 www.baidu.com 后,回车:浏览器会根据输入的 URL 到 DNS 服务器查询对应的 IP 地址和域名;返回到客户端,客户端再根据所查到的的域名和 IP,请求建立 TCP 连接,连接到对应的百度服务器,向服务器发送 HTTP Request(请求),服务端接收到请求包并进行处理,并调用自身服务,返回 HTTP Response(响应)。客户端接到响应的时候开始渲染这个 Response 包里的主体(body),等接收完所有内容后自动断开该 TCP 连接。
详细过程图:
12. 简单描述 Spring 的特点:
spirng 就是一个容器 ,它通过控制反转 IOC 和依赖注入(DI)实现高内聚、低耦合的应用。除此之外她还能整合很多第三方框架,它提供了面向切面编程 AOP 的能力,使其对数据库事务管理极为方便。
简介:Spring 就是一个轻量级的开源的 Java SE 和 Java EE 的开发应用框架。目的在于简化企业级应用的开发。
=======================================================================
1. 详细描述几种你所熟悉的优化数据库的方式。
1、选取最适用的字段属性
2、使用连接(JOIN)来代替子查询(Sub-Queries)
3、使用联合(UNION)来代替手动创建的临时表
4、事务
5、锁定表
6、使用外键
7、使用索引
8、优化的查询语句
参考链接:优化数据库的八种方式详解
评论