Java面试题知识点(一):

时间在慢慢流逝,我们在这流失的时间中学习,发现学的越多,不会的还有很多,学完后面的前面的又忘了,所以要常常复习,在此,我总结了一点知识点,哪些地方写的不好的,望大家多多关照,和大家一起进步!

01.面试的整体流程
自我介绍以及项目简短的介绍,用到的技能等。

02.java的垮平台原理
java通过不同的系统,不同版本,不同位数的java虚拟机jvm,来屏蔽不同的系统指令集差异,而提供外体统一的接口javaAPI,对于我们普通的java开发者而言,只需要按照接口开发即可,如果我们的系统需要部署到不同的环境时,只需要在系统上面安装对应版本虚拟机即可。

03.搭建一个java的开发环境需要什么?
1.适用于我们的开发环境的JDK;
2.对应的开发环境eclipse;
3.web服务器tomcat
所以我们要:
1.下载对应的组件;
2.安装jdk,eclipse,tomcat集成到eclipse中;
注意:jdk安装要配置 JAVA_HOME 及path的bin路径;
eclipse要设置workspace的默认编码等

04.java中int占几个字节?
java的8种基本数据类型及包装类型,int占4个字节,32位;

05.java面向对象的特征?
封装:把高度自治的数据操作包围起来,形成一个整体,以getset方法实现;
继承:子类继承父类,比如遗产继承
多态:多种形态,也就是父类变量引用子类对象,内加载
抽象:把共有的,共性的东西抽取出来

06.装箱和拆箱?
java提供了8中原始基本数据类型及他们的包装类
装箱:就是把基本数据类型转化成 包装类型【int-integer】
eg:Integer i=1;编译时会调用integer.valueof;
拆箱:就是把 包装类型 拆成 基本数据类型 【integer-int】
eg: integer i = 1; int j =i,编译时会调用 i.intValue;

07.==和equals的区别?
==用来判断两个变量之间的值是否相等;
变量分为基本数据类型,引用数据类型;
== 是基本数据类型时,判断值是否相等;是引用数据类型时,看地址值是否相同;
equals判断两个对象是否一致,比如两个人长得是否相同,实际上就是用对象的equals方法;

08.String的面试题(具体请看我的csdn)
String是final型的,不可继承,每创建一个String都会生成一个新的对象,为了避免这种空间的浪费,出现了StringBuffer和Stringbuilder。
String是内容不可变的字符串,适用于少量的字符数据;

private final char value[];

StringBuffer是内容可以改变的字符串,是线程安全的,适用于在多线程的大量缓冲区;
StringBuilder是内容可以改变的字符串,是线程不安全的,效率较高,适用于单线程的大量缓冲区;
char[] value;
运行效率:StringBuilder >StringBuffer> String;
eg:拼接字符串

String c="a"+"b";  
StringBuffer和StringBuilder:
StringBuilder sb = new StringBuilder(); 
sb.apend("a").apend("b");

09.讲一下java中的集合?
java中的集合分为值(Conllection) 和 key-value(map)两种;
存值的collection下有list和 set
list: arraylist vector linkedlist
set: hashset treeset
List:是有序的,可以重复的
Set:无序的,不可以重复的,根据equals和hashcode判断,如果一个对象要存储在set中,必须重写equals和hashcode方法;
map: hashMap TreeMap hashTable

10.ArrayList 和LinkedList的区别?
ArrayList 使用在查询上较多和LinkedList 插入和删除比较多,都属于 list,他们的区别:
1.arraylist 和 LinkedList 都是线程不安全的,不是同步的,
2.arraylist 的底层是数组,查询快,插入,删除,修改慢(数组在内存中是一块连续的内存,如果要插入或者删除数据需要移动内存);
3.LinkedList 的底层是 双向链表结构,插入,删除,修改 快,查询慢,不要求内存连续,在当前元素中存放下一个或上一个元素的地址,查询需要从头部开始,一个一个的找,所以查询慢;插入时不需要移动内存,只需要改变引用指向;
4.LinkedList提供了一些方法,可以当做堆栈和队列来使用;

11.HashMap和HashTable的区别?
hashMap 和HashTable 都属于map 集合中的,它们的区别是:
1.历史性:
hashTable 他是旧的dictionnary类的,hashMap是java在1.2以后引进的map接口的实现
2.同步性:hashTable是线程安全的,同步的,hashmap不是同步的;
3.差异性:HashMap他可以让你将一个空值作为一个表的条目的ket或value;
4.改:hashmap把hashTable的contains方法去掉了,改成了containskey和containsvalue;
注意:我想线程安全又想效率高?
可以用ConcurrentHashMap 和 hashTable,把整个map分为N个(类似于hashTable),线程安全,效率提升N倍,默认16倍;

12.实现一个拷贝文件的工具类要使用字节流还是字符串?
拷贝的文件不确定是只包含字符流,有可能有字节流(图片、声音、图像等),为考虑通用性,要使用字节流;

13.线程的的实现方式?怎么启动线程?怎么区分线程?
线程的实现方式有两种:继承Thred类和实现runnable接口
继承扩展性不强,java总支持单继承,如果一个类继承了Thread就不能继承其他类了;
用start方法启动线程,启动了以后执行的是run方法;

eg: Thread thread = new Thread(继承Thread的对象or实现runnable的对象);
      thread.start();

怎样区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是哪个进程打印怎么办?
这是一种规范,在线程创建完成后,都要设置名称;
thread.setName(“设置一个线程名称”);

14.线程并发库和线程池的作用?
线程并发库是在java1.5中引进了一个util.current包,提供了对线程优化,管理的各项操作。
java如何创建线程池?
java通过Executors提供了4个静态方法创建4种线程池:
newCanchedThreadPool 可以缓存的线程池
newFixedThreadPool 固定大小的线程池,可控制线程最大并发数,超 出的线程会在队列中等待
newScheduledThreadPool 定长线程池 支持定时及周期性任务执行
newSingleThreadPool 单线程的线程池
线程池的作用:
限定线程的个数,不会导致由于线程过多导致系统运行缓慢或者崩溃;
线程池不需要每次都去创建或销毁,节约了资源;
线程池不需要每次都去创建,响应时间更快;

15.设计模式和常用的设计模式?
设计模式是经过前人无数次的实践总结出来的,是可以反复套用的模板的设计方法。
常见的设计模式:
单例 :饿汉式和懒汉式
具体步骤:
1.构造方法私有化,让除了自己类中能创建外其他地方都不能创建;
2.在自己的类中创建一个单实例(懒汉式是一出现就创建单实例/饿汉式是需要的时候才创建);
3.提供一个方法获取该实例对象(创建时需要进行方法同步 synchronize)
工厂模式 :SpringIOC就是使用的工厂模式;
代理模式 :Springaop就是使用的动态代理模式;
观察者模式和包装模式等。

16.http的get post请求的区别?
相同点:
get和post请求都是http的请求方式,用户通过不同的http请求方式完成对资源url的操作,get/post/put/delete对应的是资源的查改增删,具体来说,get一般用于获取/查询资源信息,而post一般用于更新资源信息;
不同点:
get:请求提交的数据会在地址栏上显示出来,传输数据的大小,浏览器对地址长度有限制,有安全问题,可以在历史记录中查找信息,eg:密码
post:地址栏上不显示,请求浏览器的时候没有长度限制,安全性高;

17.说说你对Servlet的理解?
Servlet(servlet applet),全称是java servlet,使用java编写的服务器端程序,而这些servlet都要事先servlet这个接口,主要功能是用于交互式浏览和修改数据,生成动态web内容。
HttpServlet 重写doget和doPost方法或者你可以重写service方法完成对get和post请求的响应;

18.Servlet的生命周期?
servlet有良好的生命周期,包括加载和实例化,初始化,服务(处理请求),销毁;
这个生命周期由javax.servlet.servlet接口的init,service,destroy方法表示。
加载servlet.class—>实例化Servlet---->调用Servlet的init完成初始化—>响应请求(servlet的Service方法)—>Servlet的容器关闭时(Select的destroy方法)。

19.Servlet中forward和redirect的区别?
forward是服务器端的跳转,redirect是客户端的转向;
forward浏览器的地址不会发生改变,redirect会发生改变;
forward是一次请求中完成,而redirect是重新发起请求;
forward是在服务器端完成,不用客户端重新发起请求,效率较高,

20.jsp和Servlet的相同点和不同点?
相同点:
jsp是Servlet的扩展,所有的jsp文件都会被翻译为一个继承HttpServlet的类,也就是jsp最终也是一个Servlet,这个Servlet对外提供服务。
不同点:
jsp侧重于视图,Servlet主要用于控制逻辑;
Servlet如果要实现HTML的功能,必须使用Writer输出对应的HTML,比较麻烦,而jsp的情况 是java和HTML组合成的一个扩展名为.jsp的文件,做页面展示比较方便而嵌入逻辑比较复杂。

21.内置对象和四大作用域和页面传值?
九大内置对象:
Config servlet的架构部件
request 用户端请求,包含来自get/post请求的参数
Session 与请求有关的会话期
Application servlet 正在执行的内容
out 用来传送回应的输出
exception 针对错误网页,未捕捉的例外
pageContext 网页的属性是这里管理的
response 网页传回用户端的回应
page jsp网页本身
四大作用域:pageContext request session application
可以通过 jstl从四大作用域中取值;
jsp传值:request session application cookie;

22.Session和Cookie的区别和使用场景?
相同点:
Session 和Cookie 都是会话(Session)跟踪技术。
cookie通过在客户端记录信息确定用户身份信息,session通过在服务器端记录信息确定用户身份。但是Session的实现依赖于cookie,sessionId(session的唯一标识需要存放在客户端)。
区别:
cookie数据存放在客户的浏览器上,Session数据存放在服务器上;
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全问题应该用session;
session会在一定时间内保存在服务器上,当访问增多时,会比较占用你服务器的性能,考虑到减轻服务器性能,应使用cookie;
单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie;
个人建议:将登陆信息的重要信息存放在session中;其他信息如果需要保留,可放在cookie中,eg:购物车;
购物车最好使用cookie,但是cookie是可以在客户端禁用的,这时我们要使用cookie+数据库的方式实现,当从cookie中不能取出数据时,就从数据库中获取;

23.mvc模式和mvc各部分的实现?
model 模型 javabean
view 视图 jsp html freemaker
control 控制器 servlet action
jsp+servlet+javabean 最经典的mvc模式,实际上就是model2的实现方式,就是把试图和逻辑隔离开来;
model1:jsp+service+dao
model2:jsp+servlet+service+dao
使用struts2和springmvc这样的mvc框架后,jsp+核心控制器coreControl+action+Javabean。

24.数据库分类和常用数据库?
数据库的分类:关系型数据库和非关系型数据库
常见的数据库:
关系型数据库: mysql oracle sqlserver等
非关系型数据库:redis memcache mogodb hadoop等

25.关系型数据库的三范式?
范式就是规范,关系型数据库在设计表时,要遵循的三个规范,要满足第二范式和第三范式必须满足前期的范式。
第一范式 :数据库中的列数据不可分割,同一列中不能有多个值;
第二范式:要求数据库表中每个行必须可以被唯一的分区,为实现分区通常要加一列,已存储各个实例的唯一标识,也就是主键;
第三范式:要求数据库表中不包含已在其他表中已包含的非主关键字信息(外键);
反三范式:有时候为了提高效率,可以设置重复或者可以推导出的字段;eg:订单的总价和订单项的单价相加;

26.事务的四大特征?
事务是并发控制的单位,指的是一组操作,是包含许多单一的逻辑,只要有一个逻辑没有执行成功,那么都算失败。所有的数据都回归到最初的状态(回滚),比如转账 A扣钱 B收钱
ACID原则:
原子性 :表示事务内操作不可分割,要么全都成功,要么全都失败;
一致性 :失败了的事务要对前面的操作进行回滚,数据执行前后要一致;
隔离性 :一个事务开启后,不受其他事务的影响;
持久性 :事务开始了,就不能终止,执行成功后,那么数据应持久保存到磁盘上;

27.mysql数据库最大连接数?
100,在数据库的my.ini里面找maxinmum找到默认连接数是100,一般需要自己设置;

28.mysql和oracle的分页语句?

select * from 表名 limit offset,size;//表示从多少索引去多少位;
select * from students order by id limit "+pagesize*(pagenumber-1)+","+pageSize;

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

"select * from "+{select*,rownum rid from{select * from students order by postime desc}where rid<="+pageSize*pagenumber+"}ast"+"where t>"+pageSize"{pageNumber-1};

29.触发器的使用场景?
触发器,需要有触发条件,当条件满足以后做什么操作;
其实就是在增加日志时做一个后触发器,再向通知表中写入条目,每插入一个帖子,都将最后的发帖时间和帖子总数字段进行同步更新,触发率效率高;

30.存储过程的优点?
数据库存储过程的优点:
1.存储过程只在创建时进行编译,以后每次执行存储过程都不需要再重新翻译,而一般的sql语句没执行一次就编译一次,使用存储过程,提高了数据库的执行速度;
2.复杂的业务需要多条SQL语句,将这些从客户端发到服务器的操作放到一个存储过程中,传输减少,降低了网络的负载;
3.存储过程创建一次便可重复使用,减少开发人员的工作量;
4.安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用execute权限调用存储过程;
数据库的存储过程:

create porcedure procedureName()
begin    
select name from user;       
end;
调用过程:call porcedureName();

31.jdbc调用存储过程?
加载驱动 获取连接 设置参数 执行 释放连接;

32.简单说一下你对jdbc的理解?
java database connection 数据库连接。数据库管理系统是很多的,他们的命令也不相同,java只定义接口,让数据库厂商自己实现接口,对于我们来说只需要导入对应厂商开发的实现就好,然后以接口的方式进行调用mysql驱动(实现)+jdbc;

33.写一个jdbc的访问oracle的列子?
加载驱动(com.mysql.jdbc.Driver oracle.jdbc.driver.OracleDriver)

		Class.forName("mysql/oracle");

获取连接

conn=DriverMapper.getConnertion("jdbc:mysql://localhost/库名","用户名","密码");

设置参数

cstmt.setxxx(index,value);

执行
executeQuery 和 executeUpdate
释放资源(必须在final中,从小到大)

if(rs!=null){rs.closse();}

34.jdbc中preparedStatement比Statement的好处?
1.preparedStatement是预编译,比statement速度快;
2.代码的可读性和可维护性高;
3.安全性好,preparedStatement可以防止SQL注入攻击,而statement不能。

35.数据库连接池的作用
1.限定数据库的个数,不会导致由于数据库连接过多导致系统运行缓慢或者崩溃;
2.数据库不需要每次都去创建或销毁,节约了资源;
3.数据库不需要每次都去创建,响应时间更快。

36.HTML?
HTML 超文本标记语言 定义网页的结构
CSS 层叠样式表 用来美化界面
javaScript 主要用来验证表单 做动态的交互

37.简单介绍了一下Ajax?
什么是ajax?
ajax他是异步的JavaScript 和 xml;
作用是?
通过ajax与服务器进行数据交换,ajax可以使用网页实现布局更新,这意味着可以在不重新加载整个网页的情况下对网页的某部分进行更新;
如何实现?
XmlHttpRequest对象,使用这个对象可以异步向服务器发送请求,获取响应,完成局部更新;
open send responseText/responseXML 局部响应
使用场景?
登录失败时不跳转页面,注册时提示用户名是否存在,二级联动等等;

38.js和JQuery的关系?
jquery是一个js框架,封装了js的属性和方法,让用户使用起来更方便,增强了js功能;
eg:原生的js要处理很多兼容性问题(注册事件等),有jquery封装了底层,就不用处理兼容性问题,原生的js的dom和事件绑定和ajax等操作很麻烦,jq封装后更方便;

39.jQuery中的常用选择器?
ID选择器 通过ID获取元素
class选择器 通过类获取元素
标签选择器 通过标签获取元素
通用选择器(*) 获取所有的元素
层次选择器: 儿子选择器>获取下面的子元素
后代选择器: 空格 ,获取下面的后代,包括儿子,孙子等后代
属性选择器:获取属性名为xxx并且属性的值是test的所有xxx标签等;

40.jQuery中页面加载完毕事件?
一般获取元素做操作都要在页面加载完毕后操作,有两种:
一是$(document).ready(function(){});
( d o c u m e n t ) 把 原 生 的 d o c u m e n t 这 个 d o m 对 象 转 化 为 j Q u e r y 对 象 , 转 换 完 调 用 r e a d y 方 法 ; 后 面 表 示 的 是 页 面 结 构 被 加 载 完 毕 后 执 行 传 入 函 数 f n 。 二 是 (document)把原生的document这个dom对象转化为jQuery对象,转换完调用ready方法; 后面表示的是页面结构被加载完毕后执行传入函数fn。 二是 (document)documentdomjQueryreadyfn(function(){});
当页面加载完毕后执行里面的函数,这一种用的多,简单;
window.onload的区别:
1.jQuery中的页面加载完毕事件,表示的是页面结构被加载完毕
2.window.onload表示的是页面被加载完毕
onload 必须等页面中的图片、声音、图像等远程资源被加载完毕后才调用,而jQuery中只需要页面结构被加载完毕。

41.jQuery中Ajax和原生js实现Ajax的关系?
jQuery中的ajax也是通过原生的js封装的,封装完成后使用起来比较方便,不用考虑底层实现或兼容性问题的处理;原生的js实现ajax比较麻烦,并且场景都一样,我们不使用jQuery,也要封装ajax对象的方法和属性,而jQuery已经封装完成了,比较可靠,直接使用成熟的框架即可。

42.简单说一下html5?
HTML5增加了一些像画板、声音、视频、web存储等高级功能,不过太强调语义了,在卡法中不知道要选择哪个标签;

43.简单说一下css3?
css3是对原来css2的增强,比如盒子圆角边框,盒子和文字的阴影,渐变转换移动缩放旋转等; 过渡、动画都可以使用动画
使用媒体查询实现响应式网站;
缺点:浏览器的兼容问题。

44.bootstrap的是什么?
bootstrap是一个移动设备优先的UI框架,能实现有交互性的界面;
常用的有:模态框,表单,表单项,布局,栅格系统

45.什么是框架?
框架就是指为解决一个开放性问题而设计的具有一定约束性的支撑结构,可以根据具体问题扩展,安装更多的组成部分,提供了很多实用性工具,更高效的解决问题;

46.简单介绍一下MVC模式?
mvc全名是model view controller,是一种设计典范;
最经典的就是jsp(view)+servlet(controller)+javabean(model);
mvc流程:
1.当控制器收到来自用户的请求
2.控制器来调用javabean完成业务
3.完成业务后通过控制器跳转jsp页面的方式给用户反馈信息
4.jsp个用户做出反应 控制器都是核心

47.简单说一下对mvc框架的理解?
传统的mvc模式:jsp+servlet+javabean,
有缺陷eg:跳转单一,编码问题,不能实现模块化管理,实现跳转时修改代码等问题;

48.struts2的执行流程或者struts2的原理?
1.客户端浏览器发送请求,经过一系列的过滤器后,到达核心过滤器strutsPrepareAndExecuteFileter;
2.strutsPrepareAndExecuteFileter通过actionMapper判断当前请求是否需要某个action处理,如果不需要,走原来的流程,如果需要则把请求交给ActionProxy来处理;
3.ActionProxy通过configuration Manager询问框架的配置文件struts.xml,找到需要调用的action类;
4.创建一个ActionInvocation实例来调用Action的对应方法来获取结果集的name,在调用前后会执行相关拦截器;
5.通过结果集的name知道对应的结果集来对浏览器进行响应;
拦截 判断 寻找 执行 响应

49.Struts2的拦截器是什么?
通过动态配置方式,可以在执行action的方法前后,加入相关逻辑完成业务,Struts2中的功能(参数处理,文件上传,字符编码等)都是通过系统拦截器实现的,如果系统需要,我们也可以自定义拦截器,进行可插拔配置,在action的方法前后加入相关逻辑完成业务;
使用场景:用户登录判断,在执行action前面判断是否已经登录,没登跳转到登录界面;
用户权限的判断,没有权限给出提示;操作日志。

50.Spring MVC的执行流程?
1.用户向服务器发送请求,请求被Spring前端控制器servletDispatcherServlet捕获;
2.DispatcherServlet 对请求URL进行解析,得到请求资源标识符URL,然后根据该URL调用HandlerMapping获取该Handler配置的所有相关的对象,最后以HandlerExecutionChain对象的形式返回;
3.DispationServlet 根据获取的Handler,选择一个合适的HandlerAdapter,提取request中的模型数据,填充Handler入参,开始执行Handler(Controller),handler执行完成后,向dispatchServlet返回一个ModerandViwe对象;
4.DispatcherServlet 根据返回的moderandviwe,选择一个合适的ViewResolver(这个必须注册到spring中);
5.通过ViewResolver 结合Moder 和 view来渲染视图,dispatcherServlet将渲染结果返回给客户端;
快速记忆:核心控制器捕获请求,查找Handler,执行Handler,选择ViewResolver,通过viewResolver渲染视图并返回;

51.SpringMVC和Struts2的不同?
1.SpringMVC的核心处理器是 前端控制器servlet,Struts2的是 核心过滤器filter;
2.SpringMVC是基于方法设计,是单例的,而Struts2是基于对象设计的,是多例的;
3.SpringMVC可以用注解的方式进行管理,而Struts2主要是采用xml的配置参数来管理的;
4.最主要的不同就是Struts2里面有值栈;
5.学习难度:Springmvc比较简单,Struts2里面有值栈,拦截器,ognl表达式,相比起来学习成本较高;
6.SpringMVC用的是独立的AOP方式,Struts2有自己的interceptor 机制;
7.SpringMVC处理ajax请求,直接通过返回数据,方法中使用注解@ResponseBody;SpringMVC自动帮我们对象转化为json数据;而Struts2是通过插件的方式进行处理;

52.简单介绍一下Spring或者Spring的两大核心?
什么是spring?
spring是J2EE的应用程序框架,是一个轻量级的IOC和aop的容器框架(相对于重量级的EJB),主要是针对javabean的生命周期进行管理的轻量级容器;原来我们的service要调用dao层,需要去创建dao。
IOC 控制反转 也就是说把对象的创建权交给spring
DI:依赖注入,前提必须是IOC的环境,spring管理这个类的时候将类的依赖的属性注入进来;
IOC的核心原理:配置文件+反射+工厂模式
AOP 面向切面,他是对oop的一种延续和扩展,在不改变这个程序的情况下增强;
AOP的原理就是动态代理,jdk动态代理和cglib动态代理;
使用它来做:权限校验 日志记录 性能监控 事务控制…

53.AOP是什么?都用它做什么?
AOP是面向切面编程,核心原理是:动态代理的设计模式在执行方法前后或出现异常做加入相关的逻辑,主要用aop来做:
权限的校验 在执行方法前,判断是否具有权限
事务的控制 执行方法前开启事务,执行完后关闭事务,出现异常回滚事务
日志记录 在执行前进行日志处理

54.Spring事务的传播特性和隔离级别?
spring事务的传播特性:propagation传播

1.required 需要 :如果存在一个事务,则支持当前事务,如果没有事务则开启;
2.supports 支持:如果存在一个事务,支持当前事务,如果没有事务,则非事务的执行
3.mandatory 必须的:如果已经存在一个事务,支持当前事务,如果没有一个活动的事务,则抛出异常;
4.requires_new:总是开启一个新事务,如果一个事务已经存在,则将这个存在的事务挂起;
5.not_supported:总是非事务的执行并挂起任何存在的事务;
6.never:总是非事务的执行,如果存在一个活动事务,则抛出异常;
7.nested:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动的事务,则按TransactionDefinition.propagation_required属性执行;

隔离级别:
1.事务并发引起的安全隐患:读:脏读 幻读 不可重复读 写:丢失更新
2.读未提交

引发问题: 脏读
3.读已提交
解决: 脏读 , 引发: 不可重复读
4.可重复读
解决: 脏读 、 不可重复读 , 未解决: 幻读
5.可串行化
解决: 脏读、 不可重复读 、 幻读。
mySql 默认的隔离级别是 可重复读
Oracle 默认的隔离级别是 读已提交

55.ORM是什么?ORM框架是什么?
orm是对象关系映射 java的对象和关系型数据库的一个映射关系,将程序中的对象自动持久化到关系型数据库中;
如何实现持久化?
(硬编码的方式)用jdbc和SQL方式操作,有缺陷,所以采用orm框架;
经典的orm框架是:hibernate,ibatis,speedframework;
orm的方法论基于三个核心原则:
简单:以最基本的形式建模数据,传达性:数据库结构被任何人都能理解的语言文档化,
精确性:基于数据模型创建正确标准化了的结构;
orm框架:为了解决面对对象和关系型数据库存在的互不匹配的现象的框架;

56.ibatis(mybatis)和hibernate有什么不同?
相同点:
mybatis和hibernate都是java中的orm框架和持久化层框架,屏蔽jdbc api的底层访问细节;
mybatis的好处:屏蔽jdbc api 的底层访问细节:将SQL语句和Java代码进行分离,提供了将结果集自动封装成为实体对象和对象的集合的功能;
hibernate的好处:是一个全自动的orm映射工具,他可以自动生成SQL语句并执行返回java的结果;
不同点:
1.hibernate比mybatis的功能强大,因为hibernate自动生成SQL语句;
2.mybatis需要我们自己在xml配置文件中写SQL语句,hibernate不能,如果SQL语句复杂,hibernate很难适应;
3.mybatis是面向SQL的,不考虑对象间的一些复杂的映射关系;

57.hibernate对象状态及其转换?
hibernate对象的状态:
瞬时态:没有唯一标识OID,没有被session管理
持久态 :有唯一标识OID,已经被session管理
托管态:有唯一标识OID,没有被session管理
可以相互转换

58:hibernate的缓存?
一级缓存 Session级别缓存,也叫优化手段,快照区,一级缓存中持久化类的每个实例都具有唯一的oid;
Session缓存内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务);
二级缓存SessionFactory的缓存,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,所以要采用适当地并发访问策略,提供了事物的隔离级别;第二缓存默认是不支持分布式缓存的是一个可选的可配置的插件,默认没有二级缓存,需手动开启;
什么样的数据适合存放在二级缓存中?
1.很少被修改的数据
2.不是很重要的数据,允许出现偶尔并发的数据;
3.不会被并发访问的数据
4.常量数据
5.经常被查询的数据

59.webservice的使用场景?
webService是一个SOA(面向服务的编程)的架构,他是不依赖于语言,不依赖与平台的,可以实现不同语言间的相互调用,通过Internet进行基于http协议的网络应用间的交互;
1.异构系统(不同语言)的整合;
2.不同客户端的整合 eg浏览器 手机端 微信端 pc端等终端来访问
3.常见的例子:
天气预报:可以通过实现webService客户端调用远程天气预报实现;
单点登录:一个服务是所有系统的登录;

60.activiti的简单介绍?
Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。
其核心是超快速稳定的bpmn2流程引擎,它易于和spring集成使用;
主要用于OA中,把线下流程放到线上,把现实生活中的一些流程固话语义到系统中,然后通过输入表单数据完成业务;
eg:OA系统的流程管理中:
请假流程:小于三天找主管审批,大于三天老板审批,
报销流程:1000 2000 3000…

61.linux的使用场景?
Linux是一个长时间运行比较稳定的操作系统,所以我们一般会拿他作为服务器(web,db,app等)
linux本身具有c的编译环境,我们的一些软件是没有软件包的(redis,nginx等),需要在Linux的c编译环境编译得到软件包。

62.linux常用命令?
常用的命令:
Pwd:获取当前路径 cd:跳转到目录 Su-u 切换到管理员
ls ls:列举目录
文件操作命令:
文件:tail:查看 rm -rf vi
文件夹:mkdir rm -rf

63:怎么操作linux服务器?
需要依赖于Linux服务器安装的ssh服务端,一般这个ssh服务的端口号是22;
需要依赖于Linux服务器安装的sftp服务端,一般这个sftp服务的端口号是25;
使用xshell,putty等ssh客户端来连接服务器,使用xftp、winscp等sftp客户端来上传和下载文件,Linux需要启动这两个服务。

64:有没有使用过云主机?
云主机就是一些云服务运营商(阿里、华为、西部数码等),提供的远程服务器功能,我们可以租用他们。

65:数据库优化方面的事情?
定位:查找和定位慢查询
优化手段:
1.创建索引:创建合适的索引,可以在索引中查询,查询到以后直接找到对应的记录;
2.分表:当表的数据比较多或一张表的某些字段比较多并且很少使用时,可用水平分表和垂直分表来进行优化;
3.读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群;
4.缓存:redis进行缓存;
5.一些优化技巧

66:如果查询和定位慢查询?
在项目自验 项目转测试之前,再启动mysql数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一定的时间后,通过查看日志找到慢查询语句;
要找出项目中的慢查询时:
1.关闭数据库服务器(关闭服务);
2.把慢查询记录到日志中;
3.设置慢查询的时间;
4.找出日志中的慢查询SQL;使用explain慢查询语句来详细分析语句的问题。

67:数据库优化之数据库表设计遵循范式?
遵循三范式和反三范式。

68:选择合适的数据库引擎?
在开发中,我们常用的存储引擎有 MyISAM 、innodb、memory;
MyISAM存储引擎:对事物要求不高,同时以查询和添加为主,比如BBS中的发帖表,回复表;
INNODB存储引擎: 对事物要求过高,保存的数据都是重要数据,比如订单表,账号表;
memory存储引擎:数据变化频繁,不需要入库,速度快,同时又频繁的查询和修改;
myisam和innodb的区别:
1.事务安全 MyISAM不支持事务,innodb对事务要求过高
2.查询和添加速度 myisam不支持事务不用考虑同步锁,查询添加速度快
3.支持全文索引 myiasm支持全文索引,innodb不支持
4.锁机制 myisam支持表锁,innodb支持行锁(事务)
5.外键 myisam不支持外键,innodb支持外键(通常不设置外键,在程序中保证数据的一致)

69:选择合适的索引?
索引index 是帮助DBMS高效获取数据的数据结构
分类:普通索引/唯一索引/主键索引/全文索引
普通索引:允许重复的值出现
唯一索引:除了不能有重复的记录外,其他和普通索引一样eg:用户名,用户身份证,Tel
主键索引:随着设定主键而创建,就是把某个列设为主键的时候,数据库就会给该列创建索引,这就是主键的索引,唯一且没有null值;
全局索引:用来对表中的文本域(char,varchar,text)进行索引,全文索引针对myisam存储引擎。

70:使用索引的一些技巧
索引的弊端:
1.占用磁盘空间;
2.对插入修改删除有影响,效率降低;
使用场景:
总结:满足以下条件才能创建索引:
1.在where条件下经常使用如果不做查询就没意义;
2.该字段的内容不是唯一的几个值sex;
3.字段内容不是频繁变化

具体技巧:
1.对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引;
2.对于使用like的查询,查询如果是"%aaa"不会使用到索引而"aaa%"会使用到索引;
3.如果条件中有or,有条件没有使用索引,就要求使用的所有字段都必须单独使用时能使用索引
4.如果列类型是字符串,那一定要在条件中用引号将数据 引起来;
5.mysql使用全表扫描比索引快。

71:数据库优化之分表?
分表查询:水平(按行)分表 和垂直(按列)分表
水平分表策略:
1.按时间分表 有较强的时效性,eg消息发送记录;
2.按区间范围分表 一般有严格的自增ID需求;
3.hash分表
通过一个原始目标的ID或者名称通过一定的hash算法计算出数据存储表的表名,然后访问相应的表。

72:数据库的读写分离?
一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了要求就可以集权处理。mysql的集群处理技术是最常用的就是读写分离;
主从同步:
数据库最终会把数据持久化到磁盘,如果集权必须确保每个数据库服务器的数据是一致的,能改变数据库的操作都是主数据库去写,而其他的数据库从主数据库上同步数据;

读写分离:使用负载均衡来实现写的操作都往主数据去,而读的操作往从服务器上。

73:数据库优化之缓存?
在持久层dao和数据库db之间添加一个缓存层,如果用户访问的数据已经缓存起来时,在用户访问时直接从缓存中获取,不用访问数据库,而缓存是在操作内存级,访问速度快;
作用:减少数据库服务器压力,减少访问时间;
java中常用的缓存有:
1.hibernate的二级缓存,该缓存不能完成分布式缓存;
2.可以使用redis(memcahe)来作为中央缓存,对缓存的数据进行集中处理。

74:sql语句优化小技巧?
1.DDL优化:
通过禁用索引来提供导入数据性能 关闭唯一校验 修改事务提交方式(导入,变多次提交为一次)
2.DML优化:合并多条为一条
3.DQL优化:
order by优化:多使用索引排序 普通结果排序
group by优化:子查询优化
or优化;
limit优化;

75:jdbc批量插入几百万条数据?
1.变多次提交为一次
2.使用批量操作

76:有没有使用过redis?
Redis是一个key-value的非关系型数据库,先存到内存中,会根据一定的策略持久化到磁盘,即使断电也不会丢失数据,支持的数据类型比较多;
主要是用来 做缓存数据库的数据和web集权时当做中央缓存存放session;

77:redis的使用场景?
缓存:
把经常需要查找的,很少修改的数据放到内存中,以便下次访问减少时间,减轻压力;
计数器:redis的计数器是原子性的内存操作吗,可以解决库存溢出问题eg进销存系统库存溢出;
session缓存服务器:
web集群时作为session缓存器eg缓存队列等。

78:redis存储对象的方式?
json字符串和字节
json字符串:
需要把对象转化成json字符串,当做字符串处理,直接使用getset来设置完成;
优点:设置和获取比较简单
缺点:没有提供专门的方法,需要把对象转化为json,jsonlib;
字节:
需要做序列号,就是把对象序列化为字节保存;

79:redis数据淘汰机制?
内存大小有限,需要保存有效的数据;
redis有6种数据淘汰策略:
常用的是volatile-lru,从已经过期的数据集中选择最少使用的数据淘汰;
volatile-ttl:已经过期的淘汰;volatile-random:已经过期的数据集中任意选择数据淘汰;
常用的是allkeys-lru:从数据集中选最少使用的数据淘汰;
allkeys-random:从数据集中任意选择数据淘汰;
no-enviction:禁止驱逐数据

80:java访问redis级redis集群?
java访问redis:
1.使用jedis java客户端来访问redis服务器,有点类似通过 jdbc访问mysql一样;
2.当然如果是spring 进行集成时,可以使用spring data来访问redis,spring data只是对jedis的二次封装,jdbcTemplate jdbc关系一样;
java访问redis集群:
当一台数据无法满足要求时,可以使用redis集群来处理,类似于mysql的读写分离。

81:微信公众号分类和微信开发原理?
微信公众号分类:
公众号 :个人企业
服务号:企业
企业号
开发原理:微信公众平台开发者通过接入认证关注的方式,让我们的服务器能处理来自微信服务器转发的微信用户的请求,处理完成后返回给微信服务器,有微信服务器对用户响应;

82:怎么把微信和业务平台进行绑定?
微信用户和注册用户的绑定,让微信用户也能完成注册用户的功能;
用户注册实体中包含一个微信号的字段,当我进行绑定时就是修改用户的微信号字段,当然我们在进行菜单跳转页面后,是无法直接获取到微信号的,要通过微信网页授权来获取微信号的。

83:项目的分类和项目参与者?
市场分析–》接项目—》产品经理—》架构师–等;
UI:负责界面设计,静态代码的编写
开发团队:开始代码可完成业务需求
测试团队:测试功能
资料:负责界面的文字描述
开发、UI、资料协同设计和开发,开发完成后占测试(测试策略)交给测试团队进行测试,出个测试报告;

84:项目流程和业务注意事项?
可行性分析和立项开工会
需求分析
需求设计
项目开发:迭代开工会 迭代设计 迭代开发 迭代测试 迭代发布 总结
项目验收
项目总结


希望大家学以致用,,,欢乐多多

更多推荐

Java面试题知识点(一)