1.自我介绍:
我是 *** 工作了**年
先后在**公司和**公司工作
先后做过**和**项目

2.简单介绍一下**项目
为了解决**问题,开发了**系统,该系统主要由**部分组成
我参与了**模块的开发--简单说一下该模块的业务及设计
简单介绍一下项目的整体架构,根据所在模块进行解释

3.java的专业技能

4.你还有什么需要问我的?
暂时没有。/ 公司项目是什么以及项目用到的技术。

5.多轮面试后,自我介绍和项目经验面试官不关心。说一下你最擅长什么?
简单说一下。。自己最擅长的

6.最终技术面试完后,回家等消息/等hr谈薪资和福利

1. java的跨平台原理:
java通过不同的系统,不同版本、不同位数的jVM,来屏蔽不同的系统指令集差异,而对外提供统一的接口(java api)
普通java开发人员只需要按照接口开发即可
如果系统需要部署到不同的环境时,只需要在系统上安装对应版本的虚拟机即可

2.搭建java开发环境的步骤:
开发环境需要什么:
适用于开发环境的jdk
对应开发环境的idea
需要web服务器(Tomcat)

1.下载对应的组件
2.安装 按照正常流程即可
配置java_home (idea和Tomcat会依赖于这个变量 )
安装idea,设置workspace的默认编码
安装Tomcat
将Tomcat集成到idea中
...
SVN git

3.java中的int数据占几个字节:4字节
java中有几种数据类型: byte short int(4-32) long
float double char boolean(1字节)

4. 封装、继承、抽象、多态--抽象问题举例说明

封装:张三姓名等属性,要相对封闭。
name(set get)让其他类进行访问

抽象:将显示生活中的对象抽象成类
eg 张三

继承:父类和子类
设计和定义一个类,可以使用已经存在的内容,也可以新定义新的内容

多态: 同一个行为具有多个不同表现形式或形态的能力。


5.有了基本类型为什么还要包装类型:
包装类型:每个基本数据类型都会对应包装类型

装箱:
拆箱:

6. 字符串:String StringBuffer StringBuilder
String内容不可变,final的字符数组。
StringBuffer StringBuilder内容可变、字符串追加:

字符串拼接:String c = a + b ;
StringBuilder s = new StringBuilder();
s.append["a"].s.append["b"];
拼接字符串要使用stringBuilder和stringbuffer

StringBuffer和StringBuilder:StringBuilder线程不安全而效率较高 StringBuffer线程安全(加了同步锁)、效率较低

7. 集合:值、key-value两种
值【list、set】
key-value【map】

list:有序的、可重复的
set:无序、不可重复---根据equals和hashcode判断。如果对象要存储在set中,需要重写equals和hashcode方法。

list: Arraylist、LinkedList
ArrayList 底层数组 连续的内存空间 ---适用于查询多、插入删除少时
LinkedList 链表 查询时从头结点开始,效率低,插入时不需要移动内存。 ---适用于查询少、插入删除多时

8. hashmap 和 hashtable :
(1)都可以存储 key-valule
(2) hashmap可以把null作为key-value hashtable不可以
(3)hashmap 线程不安全、效率高 hashtable线程安全、效率低

CurrentHashmap: 大的hashmap分为小的hashtable,小的map实现了线程安全

9. 实现拷贝文件工具使用字节流还是字符流?
拷贝文件(图片、图像)不知包含字符流还有字节流。需要字节流

10. 线程的几种实现方式:
(1)继承Thread类实现
(2)实现runnerable接口实现
继承的扩展性不强(单继承)。一个类继承了Thread就不能继承其他类

启动:
Thread thread = new Thread(new MyThread());
thread.start();

如何区分线程:设置线程名称
thread.setName();

创建线程完成后,都需要设置名称

11. 线程并发库:JDK1.5
通过executor的四个静态方法来创建线程池


12.线程池作用:
限定线程的个数,不过导致线程过多而导致线程溢出,导致系统运行缓慢或者崩溃。
不需要每次都去创建、销毁,节省资源
不需要每次都去创建,响应时间更快。

13. 设计模式?
经过前人无数次的实践,总结出的。可以反复使用、解决特定问题的设计方法。
常用的设计模式:单例模式、工厂模式、代理模式、包装模式、

工厂模式:Spring IOC
对象的创建交给了一个工厂。

代理模式: Spring AOP

单例模式(确保一个类中只有一个实例):饱汉模式、饥汉模式

1.构造方法私有化,除了自己的类能创建外,其他类不可以创建。(饱汉一出来就创建,饥汉需要时才创建)
2.类内部提供创建一个单实例。
3.提供一个方法获取该实例对象。(创建时需要方法同步)

饱汉--线程不安全

public class PersonalFactory{
 private PersonalFactory(){

 } 
 private static PersonalFactory instance = null;

 public synchronized static PersonalFactory getInstance(){
 if(instance = null){
 instance = new PersonalFactory();
 }
 return instance;
 }

 public static void main(String arg[]){
 PersonalFactory.getInstance.toString();
 }
 }




饥汉--线程安全

public class PersonalFactory{ 
 private PersonalFactory(){

 }
 private static final PersonalFactory instance = new PersonalFactory();//类加载是即被创建
 public static PersonalFactory getInstance(){
 return instance;
 }
}

双重锁模式,是饱汉模式的优化,进行双重判断,当已经创建过实例对象后就无需加锁,提高效率。也是一种推荐使用的方式。

public class PersonalFactory{
 private PersonalFactory(){

 } 
 private static PersonalFactory instance = null;

 public static PersonalFactory getInstance(){
 if(instance = null){
 synchronized(PersonalFactory.class){
 if(instance == null){
 instance = new PersonalFactory();
 }
 }
 return instance;
 }

 public static void main(String arg[]){
 PersonalFactory.getInstance.toString();
 }
 }





14.web:
get:获取和查询信息
post: 更新信息

相同点:都是http请求,通过不同的请求方式完成对url的不同操作,get、post、put、delete对应着资源的查、改、增、删。get一般用于获取和查询信息,post一般用于更新信息。

区别:
地址栏--get请求数据会在地址栏显示出来,post不会显示在地址栏 。get通过url传递,post放在requestbody中
数据长度--get传输数据有限,post没有。
安全性--post的安全性高于get。所以不能用来传输敏感信息。由于数据会在地址栏中呈现,所以可以通过历史记录找到密码等关键信息,不安全。


15. servlet: java编写的服务器端程序,这些servlet都要实现servlet接口。

主要功能:交互式的浏览和修改数据,生成动态web内容。动态网页语言。
servlet继承httpservlet重写doget dopost

客户端--服务器--服务器找到servlet,通过service方法/doget/dopost方法相应请求。

16. servlet的生命周期:
加载--实例化--初始化--处理请求--服务结束。

Servlet运行在Servlet容器中,其生命周期由容器来管理。
Servlet容器负责加载和实例化Servlet。
在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,
Servlet容器调用Servlet的service()方法对请求进行处理
容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久层


17. servlet的2种跳转方式:

转发 forward():
1【指服务器内部的重定向】 容器中控制权的转向
2 在客户端的地址栏中不会显示转向后的地址,还是原来的地址
3 1次请求完成
4 服务器端完成,效率较高

重定向 redirect():
1 【客户端的重定向】 是完全的跳转,即客户端浏览器会获取到跳转后的地址,然后重新发送请求
2 因此浏览器中显示跳转后的地址。
3 这种方式比forward方式多了一次网络请求
4 因此效率要低于forward方式。

forward()更加高效。但是如果需要跳转到其他服务器上的资源时,则需要使用sendRedirect()方法

18. jsp和servlet的区别:
相同点:jsp最终被翻译为servlet,再对外提供服务。
不同点: JSP(控制视图):java+HTML ————> jsp页面
servlet(控制逻辑)使用HtML的功能:必须使用getWriter的方式输出HTML页面

19. jsp的九大内置对象:
1. request对象:客户端请求被封装在request对象中 HttpServletRequest的实例
2.response对象: 包含了响应客户端请求的信息 是HTTPServletResponse的实例
3. session对象:客户端和服务器的一次会话
5 out 传送回应的输出
6 exception 错误网页
7 page jsp页面本身
8 application servlet正在执行的内容
9 config servlet的构架部件


jsp四大作用域:pagecontext application request session

jsp传值:

20 session和cookie的区别 :
都是会话跟踪技术。
cookie在客户端记录信息确定用户身份,session在服务器端记录信息确定用户身份
session的实现依赖于cookie session的唯一标识sessionId需存放在客户端

区别:
1.cookie在客户端记录信息确定用户身份,session在服务器端记录信息确定用户身份
2.cookie不安全 分析本地的cookie进行cookie欺骗
3.session占内存 一定时间保留在服务器上,当服务较多时会比较损耗服务器的性能
4.单个cookie保存的数据不会超过4K 很多浏览器限制一个站点最多保留20个cookie

个人建议:登录信息等重要信息保存再session中,其他信息,例如购物车,可以存放在cookie中
但是coolie是可以在客户端禁用的,这时要使用cookie+数据库的实现方式,当从cookie中不能取出数据时,要从数据库中获取。

21 MVC
Model JavaBean
View HTML jsp
Controller sevlet action
jsp+servlet+javabean

22.数据库的分类:
关系型:mysql oracle SQLserver
非关系型:Redis memcache mongodb hadoop

23 关系型数据库的三范式:
范式就是设计表时的规范:要满足第二范式,需要满足第一范式 要满足第三范式,需要满足第二范式
第一范式:1NF原子性 列数据的不可分割性 数据库表的每一列都是不可分割的原子数据项 ,一个字段只存储一项信息
第而范式:2NF 主键 表中的每行必须唯一可区分 当存在多个主键的时候,才会发生不符合第二范式的情况
第三范式:3NF 外键 要求一个数据库表中不包含已在其它表中已包含的非主键字段

24.事务:
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。
原子性 操作事务内的操作不可分割,要么都成功,要么都失败
一致性 事务执行失败时,要对先前的操作回滚,保证一致性
隔离性 一个事务开始后 不受其他的事务的干扰
持久性 事务开始了就不能终止了

25. 最大连接数:
特定服务器的数据库只能支持同时连接一定的数目,因此需要设置一个最大连接数。

26. mysql的分页:
limit offset,size 从多少索引多少位

oracle的分页:
使用三层嵌套查询:

SELECT * FROM 
( 
SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A 
WHERE ROWNUM <= 40 
) 
WHERE RN >= 21




27. 触发器:校内网、Facebook ,发帖时通知好友。
需要有出发条件,触发后完成什么操作。
增加日志时,触发器起作用,通知表中写入

28. 存储过程:存储过程其实就是能完成一定操作的一组SQL语句。复杂逻辑和安全性要求高的时候使用存储过程。
1.只在创建时编译一次,以后每次执行都不需要再次编译。提高数据库的执行速度
2.复杂业务逻辑需要多条SQL语句,客户机和服务器之间的网络传输会大大减少,降低网络负载。
3.减少工作量 存储过程可以重复使用,减少了数据库开发人员的工作量。
4.安全性高 可以设定只有某些用户才有对存储过程的使用权。

29. 定义存储过程:

30 jdbc的存储过程:
加载驱动
获取连接
设置参数
执行
释放连接

31.对JDBC的理解:
java只定义接口 数据路厂商自己实现接口,我们只需要导入对应的厂商实现的接口,然后调用。

32.写一个访问oracle数据库的jdbc:
贾琏欲执事
加载驱动 Class.forName("com.mysql.jdbc.Driver");
获取连接 Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
设置参数 statement preparestatement csmt.setXX(index,value)
执行 exxcute executeUpdate
释放连接 释放连接要从小到大

public class javaTest { 
 public static void main(String[] args) throws ClassNotFoundException, SQLException {
 String URL="jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&characterEncoding=utf-8";
 String USER="root";
 String PASSWORD="tiger";
 //1.加载驱动程序
 Class.forName("com.mysql.jdbc.Driver");
 //2.获得数据库链接
 Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
 //3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
 Statement st=conn.createStatement();
 ResultSet rs=st.executeQuery("select * from user");
 //4.处理数据库的返回结果(使用ResultSet类)
 while(rs.next()){
 System.out.println(rs.getString("user_name")+" "
 +rs.getString("user_password"));
 }

 //关闭资源
 rs.close();
 st.close();
 conn.close();
 }
}

33. PrepareStatement(设置参数)和statement(语句拼接)的比较:
1.PrepareStatement预编译比statement速度快
2.代码的可读性和可维护性好
3.安全性 PrepareStatement可以防止SQL注入攻击 使用预编译语句传入的任何内容不会和原来的语句发生任何的匹配关系
使用预编译语句不用对传入的任何内容做任何过滤

34.