2018年度最新Java面试题'整编汇总.doc
《2018年度最新Java面试题'整编汇总.doc》由会员分享,可在线阅读,更多相关《2018年度最新Java面试题'整编汇总.doc(36页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、1 1 基础篇基础篇1.11.1 基本功基本功1.1.11.1.1面向对象特征面向对象特征封装,继承,多态和抽象 1、 封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方 法来改变它内部的数据。在 Java 当中,有 3 种修饰符: public, private 和 protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访 问权限。下面列出了使用封装的一些好处: 1)通过隐藏对象的属性来保护对象内部的状态。 2)提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展 。 3)禁止对象之间的不良交互提高模块化 2、 继承
2、 继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以 在不修改类的情况下给现存的类添加新特性。 3、 多态 多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型 上的操作可以应用到其他类型的值上面。 4、 抽象 抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现 细节来创建类。 Java 支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类 的行为和实现细节分离开。1.1.21.1.2final,final, finally,finally, finalizefinalize 的区别的区别1、 fina
3、l修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。 因此一个类不能既被声明为 abstract的,又被声明为final的。 将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量 必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方 法也同样只能使用,不能重载。2、 finally 在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。3、 finalize 方法名。Java
4、技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃 圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。1.1.31.1.3intint 和和 IntegerInteger 有什么区别有什么区别int是基本数据类型 ,而Integer是其包装类,注意是一个类。 为什么要提供包装类呢? 一是为了在各种类型间转化,通过各种方法的调用。否则你无
5、法直接通过变量转化。1.1.41.1.4重载和重写的区别重载和重写的区别override(重写)1. 方法名、参数、返回值相同。2. 子类方法不能缩小父类方法的访问权限。3. 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。4. 存在于父类和子类之间。5. 方法被定义为final不能被重写。 overload(重载)1. 参数类型、个数、顺序至少有一个不相同。2. 不能重载只有返回值不同的方法名。3. 存在于父类和子类、同类中。区别点重载重写(覆写)英文OverloadingOveriding定义方法名称相同,参数的类型或个数 不同方法名称、参数类型、返回值类型全部相 同权限
6、对权限没要求被重写的方法不能拥有更严格的权限范围发生在一个类中发生在继承类中1.1.51.1.5抽象类和接口有什么区别抽象类和接口有什么区别接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可 以有私有方法或私有变量的,另外,实现接口的一定要实现接口里定义的所有方法,而实 现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽 象类实现接口,最后才到具体类实现。 还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接 口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面 的变量全是常量)的作用。1
7、.1.61.1.6说说反射的用途及实现说说反射的用途及实现Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有 的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架 Java反射的主要功能: - 确定一个对象的类 - 取出类的modifiers,数据成员,方法,构造器,和超类. - 找出某个接口里定义的常量和方法说明. - 创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象). - 取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到. - 在运行时刻调用动态对象的方法. - 创建数组,数组大小和类型在运行时刻才确定,
8、也能更改数组成员的值. 反射的应用很多,很多框架都有用到 spring 的 ioc/di 也是反射. javaBean和jsp之间调用也是反射. struts的 FormBean 和页面之间也是通过反射调用. JDBC 的 classForName()也是反射. hibernate的 find(Class clazz) 也是反射. 反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使 用使你的系统达到最优就看你系统架构和综合使用问题啦,这里就不多说了。 来源:http:/ 提到注解就不能不说反射,Java自定义注解是通过运行时靠反射获取注解。 实际开发中,例如我们要获
9、取某个方法的调用日志,可以通过AOP(动态代理机制)给 方法添加切面,通过反射来获取方法包含的注解,如果包含日志注解,就进行日志记录。1.1.81.1.8HTTPHTTP 请求的请求的 GETGET 与与 POSTPOST 方式的区别方式的区别1、 请求数据的方式 GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用 成功加载后,会将Driver类的实例注册到DriverManager类中。 2、 提供JDBC连接的URL - 连接URL定义了连接数据库时的协议、子协议、数据源标识。 - 书写形式:协议:子协议:数据源标识 协议:在JDBC中总是以jdbc开始 子协议
10、:是桥连接的驱动程序或是数据库管理系统名称。数据源标识:标记找到数据库来 源的地址与连接端口。 例如: /MySql的连接URL,true表示使用Unicode字符集, characterEncoding字符编码方式。jdbc:mysql:/localhost:3306/test?useUnicode=true 3、创建数据库的连接 - 要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。 - 使用DriverManager的getConnectin(String url , String username , S
11、tring password )方法传入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。 例如: /连接MySql数据库,用户名和密码都是rootString url = “jdbc:mysql:/localhost:3306/test“; Connection con = DriverManager.getConnection(url, “root“,“root“) 4、 创建一个Statement,要执行SQL语句,必须获得java.sql.Statement实例,Statement 实例分为以下3 种类型: 1)执行静态SQL语句。通常通过Statement实例实现。State
12、ment stmt = con.createStatement() ; 2)执行动态SQL语句。通常通过PreparedStatement实例实现。PreparedStatement pstmt = con.prepareStatement(sql) ; 3)执行数据库存储过程。通常通过CallableStatement实例实现。 CallableStatement cstmt = con.prepareCall(“CALL demoSp(? , ?)”) ; 5、 执行SQL语句 提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute 1)R
13、esultSet executeQuery(String sqlString):执行查询数据库的SQL语句 ,返回一个结果集(ResultSet)对象。 2)int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等 3)execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的 语句。 6、 处理结果: 1)执行更新返回的是本次操作影响到的记录数。 2)执行查询返回的结果是一个ResultSet对象。 ResultSet包
14、含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这 些行中数据的访问(列是从左到右编号的,并且从列1开始)。 使用结果集(ResultSet)对象的访问方法获取数据: while(rs.next() String name = rs.getString(“name”) ; String pass = rs.getString(1) ; / 此方法比较高效 7、 关闭JDBC对象 操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明 顺序相反: 1)关闭记录集rs.close() 2)关闭声明stmt.close() 3)关闭连接对象conn.clo
15、se()1.1.111.1.11 MVCMVC 设计思想设计思想M:Model 模型 V:View 视图 C:Controller 控制器 模型就是封装业务逻辑和数据的一个一个的模块, 控制器就是调用这些模块的(java中通常是用Servlet来实现,框架的话很多是用Struts2来 实现这一层), 视图就主要是你看到的,比如JSP等。 当用户发出请求的时候,控制器根据请求来选择要处理的业务逻辑和要选择的数据,再返回 去把结果输出到视图层,这里可能是进行重定向或转发等.1.1.121.1.12 equalsequals 与与 = 的区别的区别值类型(int,char,long,boolean等
16、)都是用=判断相等性。 对象引用的话,=判断引用所指的对象是否是同一个。 equals是Object的成员函数,有些类会覆盖(override)这个方法,用于判断对象的 等价性。 例如String类,两个引用所指向的String都是”abc”,但可能出现他们实际对应的对 象并不是同一个(和jvm实现方式有关),因此用=判断他们可能不相等,但用equals判断一定是相等的。1.21.2 集合集合1.2.11.2.1 ListList 和和 SetSet 区别区别List,Set都是继承自Collection接口 List特点:元素有放入顺序,元素可重复 Set特点:元素无放入顺序,元素不可重复,
17、重复元素会覆盖掉 (注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其 位置其实是固定的,加入Set的Object必须定义equals()方法,另外list支持for循环,也 就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来 取得想要的值。) Set和List对比: Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会 引起其他元素位置改变。1.2.21.2.2 ListList 和和 MapMap 区别区别Li
18、st是对象集合,允许对象重复。 Map是键值对的集合,不允许key重复。1.2.31.2.3 ArraylistArraylist 与与 LinkedListLinkedList 区别区别ArraylistArraylist: 优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了, 查询操作效率会比较高(在内存里是连着放的)。 缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。 LinkedListLinkedList: 优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要 等一个连续的地址
19、,对于新增和删除操作add和remove,LinedList比较占优势。LinkedLis t 适用于要头尾操作或插入指定位置的场景 缺点:因为LinkedList要移动指针,所以查询操作性能比较低。 适用场景分析: 当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改 时采用LinkedList。1.2.41.2.4 ArrayListArrayList 与与 VectorVector 区别区别/构造一个初始容量为10的空列表public ArrayList() /构造一个具有指定初始容量的空列表。public ArrayList(int initialC
20、apacity) /构造一个包含指定 collection 的元素的列表public ArrayList(Collection c)Vector有四个构造方法: /使用指定的初始容量和等于零的容量增量构造一个空向量public Vector() /构造一个空向量,使其内部数据数组的大小,其标准容量增量为零public Vector(int initialCapacity) /构造一个包含指定 collection 中的元素的向量public Vector(Collection c) /使用指定的初始容量和容量增量构造一个空的向量public Vector(int initialCapacity
21、,int capacityIncrement) ArrayList和Vector都是用数组实现的,主要有这么三个区别: Vector是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果。 而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修 饰,这样就导致了Vector在效率上无法与ArrayList相比; 两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不 同。 Vector可以设置增长因子,而ArrayList不可以。 Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
22、 适用场景分析: Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。 如果不考虑到线程的安全因素,一般用ArrayList效率比较高。 如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据 ,用Vector有一定的优势。1.2.51.2.5 HashMapHashMap和和HashtableHashtable的区别的区别1.hashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKe y()方法。 2.hashTable同步的,而HashMap是非同步的,效率上
23、逼hashTable要高。 3.hashMap允许空键值,而hashTable不允许。 注意: TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态 。 Treemap:适用于按自然顺序或自定义顺序遍历键(key)。 参考:http:/ HashSetHashSet 和和 HashMapHashMap 区别区别set是线性结构,set中的值不能重复,hashset是set的hash实现,hashset中值不能重 复是用hashmap的key来实现的。 map是键值对映射,可以空键空值。HashMap是Map接口的hash实现,key的唯一性是通 过key
24、值hash值的唯一来确定,value值是则是链表结构。 他们的共同点都是hash算法实现的唯一性,他们都不能持有基本类型,只能持有对象1.2.71.2.7 HashMapHashMap 和和 ConcurrentHashMapConcurrentHashMap 的区别的区别ConcurrentHashMap是线程安全的HashMap的实现。(1)ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都 用lock锁进行保护,相对于HashTable的syn关键字锁的粒度更精细了一些,并发性能更好 ,而HashMap没有锁机制,不是线程安全的。 (2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2018 年度 最新 Java 试题 39 整编 汇总
限制150内