1.自我介绍:
我是 *** 工做了**年
前后在**公司和**公司工做
前后作过**和**项目
2.简单介绍一下**项目
为了解决**问题,开发了**系统,该系统主要由**部分组成
我参与了**模块的开发--简单说一下该模块的业务及设计
简单介绍一下项目的总体架构,根据所在模块进行解释 java
3.java的专业技能 mysql
4.你还有什么须要问个人?
暂时没有。/ 公司项目是什么以及项目用到的技术。git
5.多轮面试后,自我介绍和项目经验面试官不关心。说一下你最擅长什么?
简单说一下。。本身最擅长的web
6.最终技术面试完后,回家等消息/等hr谈薪资和福利 面试
1. java的跨平台原理:
java经过不一样的系统,不一样版本、不一样位数的jVM,来屏蔽不一样的系统指令集差别,而对外提供统一的接口(java api)
普通java开发人员只须要按照接口开发便可
若是系统须要部署到不一样的环境时,只须要在系统上安装对应版本的虚拟机便可 sql
2.搭建java开发环境的步骤:
开发环境须要什么:
适用于开发环境的jdk
对应开发环境的idea
须要web服务器(Tomcat)
1.下载对应的组件
2.安装 按照正常流程便可
配置java_home (idea和Tomcat会依赖于这个变量 )
安装idea,设置workspace的默认编码
安装Tomcat
将Tomcat集成到idea中
...
SVN git mongodb
3.java中的int数据占几个字节:4字节
java中有几种数据类型: byte short int(4-32) long
float double char boolean(1字节) 数据库
4. 封装、继承、抽象、多态--抽象问题举例说明
封装:张三姓名等属性,要相对封闭。
name(set get)让其余类进行访问设计模式
抽象:将显示生活中的对象抽象成类
eg 张三api
继承:父类和子类
设计和定义一个类,可使用已经存在的内容,也能够新定义新的内容
多态: 同一个行为具备多个不一样表现形式或形态的能力。
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.