问题链接转载 Java面试通关要点汇总集【终极版】
一、面向对象的特征
- 封装
- 抽象
- 继承
- 多态
二、final, finally, finalize 的区别
-
final是一个属性,修饰类,方法和变量,修饰类则该类不能被继承,如String;修饰方法则该方法不能被重写,修饰变量则该变量为常量,必须要初始化。
- finally是异常处理的一部分,用在try/catch语句里,表示总是执行,不管这个异常有没有捕捉到都会在最后执行
- finalize()是每个对象都会有的,当gc启动时,对象被回收时会调用。
三、int 和 Integer 有什么区别
int是8种基本数据类型之一(bool,char,byte,short,int,long,float,double),Integer是int的包装类。int的初始值是0,而Integer是null。自从Java5引入了自动装箱/拆箱机制后,int和Integer可以相互转换
四、重载和重写的区别
重载是指同个类里的函数函数名相同,但参数不一样,不一样包括参数个数不一样,参数类型不一样,参数顺序不一样。重写指子类重写了父类的函数,函数名和参数全一致。但子类无法重写父类的final修饰的函数
五、抽象类和接口有什么区别
- 抽象类里可以有具体化的函数,但接口类里的函数只能有函数名,不能有具体实现的内容
- 抽象类的成员变量可以是各种类型,但接口类的成员变量必须是public final static
- 抽象类可以有main函数,但接口类不能有main函数
- 只能继续一个抽象类,但可以实现多个接口
- 抽象类像一个模版,接口像一个行为规范
- 抽象类可以有构造函数,但接口不能有构造函数
- 抽象类可以静态代码块和静态函数,但接口不能控油
六、说说反射的用途及实现
反射的核心是在JVM运行时才会动态加载类或调用函数,访问变量,一般用于构建通用架构
- 用instanceOf判断这个对象是不是某个类的实例
- 获取这个对象所属的类
- 获取任意类的成员函数或变量
- 创建class对象的实例,用newInstance()
七、说说自定义注解的场景及实现
Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中出现
八、HTTP 请求的 GET 与 POST 方式的区别
什么是HTTP?
超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议。
HTTP在客户端和服务器之间以request-responseprotocol(请求-回复协议)工作。
GET方法:
使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器:
/test/demo_form.jsp?name1=value1&name2=value2
特点:
· GET请求能够被缓存
· GET请求会保存在浏览器的浏览记录中
· 以GET请求的URL能够保存为浏览器书签
· GET请求有长度限制
· GET请求主要用以获取数据
POST方法:
使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器:
POST/test/demo_form.jsp HTTP/1.1
Host:w3schools.com
name1=value1&name2=value2
特点:
· POST请求不能被缓存下来
· POST请求不会保存在浏览器浏览记录中
· 以POST请求的URL无法保存为浏览器书签
· POST请求没有长度限制
九、session 与 cookie 区别
因为HTTP是一种无状态的协议,为了保存状态,cookie和session便出现了。session是保存到服务器上,保存的是对象,而cookie是保存到客户端,保存的是string类型。session会有个session id进行识别
十、session 分布式处理
- session黏性:即当服务器开启一个session后,这个用户以后的所有操作都只在这台服务器上
- 广播共享方式:当开启一个session后,将这个session的所有数据通过广播共享到其他服务器上
- 采用中间件保存,如redis或memcached,目前采用最多
- session 保存到数据库中
十一、JDBC 流程
JDBC是运行sql语句获取数据库数据的Java API,用于通过网络操作数据库
加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
1.注册驱动 (只做一次)
方式一:Class.forName(“com.MySQL.jdbc.Driver”);
推荐这种方式,不会对具体的驱动类产生依赖。
方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
2.建立连接
Connection conn = DriverManager.getConnection(url, user, password);
URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
其他参数如:useUnicode=true&characterEncoding=utf8
3.创建执行SQL语句的statement
1 //Statement
2 String id = "5";
3 String sql = "delete from table where id=" + id;
4 Statement st = conn.createStatement();
5 st.executeQuery(sql);
6 //存在sql注入的危险
7 //如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录
1 //PreparedStatement 有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)
2 String sql = “insert into user (name,pwd) values(?,?)”;
3 PreparedStatement ps = conn.preparedStatement(sql);
4 ps.setString(1, “col_value”); //占位符顺序从1开始
5 ps.setString(2, “123456”); //也可以使用setObject
6 ps.executeQuery();
4.处理执行结果(ResultSet)
1 ResultSet rs = ps.executeQuery();
2 While(rs.next()){
3 rs.getString(“col_name”);
4 rs.getInt(1);
5 //…
6 }
5.释放资源
//数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
//都要加try catch 以防前面关闭出错,后面的就不执行了
1 try {
2 if (rs != null) {
3 rs.close();
4 }
5 } catch (SQLException e) {
6 e.printStackTrace();
7 } finally {
8 try {
9 if (st != null) {
10 st.close();
11 }
12 } catch (SQLException e) {
13 e.printStackTrace();
14 } finally {
15 try {
16 if (conn != null) {
17 conn.close();
18 }
19 } catch (SQLException e) {
20 e.printStackTrace();
21 }
22 }
23 }
十二、equals 与 == 的区别
== 可以用于基本数据类型,用在对象比较时比较的是对象的引用地址,而equals()比较的是对象的内容