目录javascript
一. Java基础部分................................................................. 9css
一、一个".java"源文件中是否能够包括多个类(不是内部类)?有什么限制? 9html
二、说说&和&&的区别。........................................................... 9前端
三、在JAVA中如何跳出当前的多重嵌套循环?........................ 9html5
四、switch语句可否做用在byte上,可否做用在long上,可否做用在String上? 10java
六、用最有效率的方法算出2乘以8等於几?......................... 10node
七、请设计一个一百亿的计算器............................................. 10mysql
八、使用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变? 10jquery
九、"=="和equals方法究竟有什么区别?............................. 10git
十、静态变量和实例变量的区别?........................................ 11
十一、是否能够从一个static方法内部发出对非static方法的调用? 11
十二、Integer与int的区别................................................... 11
1三、Math.round(11.5)等于多少? Math.round(-11.5)等于多少? 11
1四、请说出做用域public,private,protected,以及不写时的区别 11
1五、Overload和Override的区别。Overloaded的方法是否能够改变返回值的类型?............................................................................................ 12
1七、写clone()方法时,一般都有一行代码(不是必须有),是什么? 12
1八、面向对象的特征有哪些方面........................................... 12
1九、java中实现多态的机制是什么?................................... 12
20、abstract class和interface有什么区别?................... 12
2一、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?..................................................................... 13
2二、什么是内部类?Static Nested Class和Inner Class的不一样。 13
2三、内部类能够引用它的包含类的成员吗?有没有什么限制? 13
2四、String是最基本的数据类型吗?..................................... 13
2七、String和StringBuffer的区别..................................... 14
2八、如何把一段逗号分割的字符串转换成一个数组?............. 14
30、final, finally, finalize的区别。............................ 14
3一、运行时异常(Runtime)与检查异常(Checked)有何异同?. 15
3二、error和exception有什么区别?................................... 15
3三、Java中的异常处理机制的简单原理和应用。.................. 15
3四、请写出你最多见到的5个RuntimeException。.............. 15
3五、Java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别表明什么意义?在try块中能够抛出异常吗?............................. 16
36,Java中有几种方法能够实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为什么不推荐使用?......................................... 16
3八、同步和异步有何异同,在什么状况下分别使用他们?举例说明。 17
39. 下面两个方法同步吗?(本身发明)............................. 17
40、多线程有几种实现方法?同步有几种实现方法?............... 18
4一、启动一个线程是用run()仍是start()?......................... 18
4二、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?......................................................................... 18
4三、线程的基本概念、线程的基本状态以及状态之间的关系. 18
4五、介绍Collection框架的结构......................................... 18
4六、ArrayList和Vector的区别.......................................... 19
4七、HashMap和Hashtable的区别........................................ 19
4八、List和 Map区别?......................................................... 19
4九、List, Set, Map是否继承自Collection接口?.............. 19
50、List、Map、Set三个接口,存取元素时,各有什么特色? 19
5一、说出ArrayList,Vector, LinkedList的存储性能和特性 19
5一、去掉一个Vector集合中重复的元素............................... 19
5三、Collection和 Collections的区别。........................... 20
5四、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==仍是equals()?它们有何区别?..................................................... 20
5五、你所知道的集合类都有哪些?主要方法?...................... 20
5六、两个对象值相同(x.equals(y) == true),但却可有不一样的hash code,这句话对不对?....................................................................................... 20
6八、说出一些经常使用的类,包,接口,请各举5个.................. 20
5九、Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?............................................................ 21
60、字节流与字符流的区别.................................................. 21
6一、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的做用。..................................................................................... 21
6二、描述一下JVM加载class文件的原理机制?.................... 21
6三、heap和stack有什么区别。.......................................... 21
6四、垃圾回收器的基本原理是什么?垃圾回收器能够立刻回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?.................................................. 21
6五、何时用assert。..................................................... 22
6六、能不能本身写个类,也叫java.lang.String?.............. 22
6七、SSH集成方式................................................................. 22
二.算法与编程..................................................................... 23
一、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 23
二、编写一个程序,将d:\java目录下的全部.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改成.jad。..................................... 24
三、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。 25
四、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。.............................................................................. 25
五、说明生活中遇到的二叉树,用java实现二叉树............... 26
八、递归算法题1................................................................... 27
九、递归算法题2................................................................... 28
十、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 28
十一、有数组a[n],用java代码将数组元素顺序颠倒............ 30
12 不使用递归遍历二叉树.................................................... 30
三.前端页面部分.................................................................. 32
3.当service有一个实例变量,doGet和doPost去调用这个变量,会出现什么问题,你是如何解决的。................................................................... 32
4.有三台服务器,若是在一台服务器上登录了这个用户,其余两台就不能再登录这个用户,使用session共享,你是怎么作的。............................. 32
5.写一个自定义标签要继承什么类....................................... 32
6.Jsp如何处理json............................................................ 32
7.Jsp的重定向和转发的流程有什么区别.............................. 32
8.Jsp和servlet的区别...................................................... 32
9.jsp能够操做窗口吗?...................................................... 32
10.session的主要几个方法的区别....................................... 33
11.jsp的三大指令,七大动做的具体功能............................ 33
12.获取页面的元素和值有几种方式,分别说一下................. 33
13.servlet和javaScript的区别,他们分别是什么做用..... 33
14.jsp的执行原理............................................................... 34
16.HTML和Servlet的异同................................................... 34
17.会话跟踪有哪些,他们的区别是什么............................... 34
18.session和application的做用....................................... 34
19.request ,response,session 和 application是怎么用的 34
20.有几种方式将页面的值传到后台...................................... 34
21.一个form表单的值如何获取........................................... 34
22.传递参数到后台有几种方式............................................. 35
23.Jsp中父页面中怎么拿到子页面的表单元素,不是拿值怎么拿 35
24.定义一个String类型的字符串,若是重定向以后还能不能得到这个数据 35
25.404和500是什么意思..................................................... 35
26.写出5种JSTL经常使用标签.................................................. 35
28.
页面把一个元素隐藏的方法.................................................. 35
29.Session,application,cookie的区别.......................... 35
30.咱们在web应用开发过程当中常常遇到输出某种编码的字符,如ISO-8859-1,如何输出一个某种编码的字符串..................................................... 35
32.怎么判断用户请求时是第一次,若是客户端和服务端断开怎么连到上一次操做 35
33.若是建立servlet实例不用构造方法,怎么建立一个servlet实例 35
34.Servlet是安全的吗?当service有一个实例变量,doGet和doPost去调用这个变量,会出现什么问题,你是如何解决的................................ 36
36.说明一下jsp中<jsp: include page..>和<%@ include file%>的区别 36
<jsp:include page=""/> 动态导入...................................... 36
37. pageContext有什么做用............................................... 36
39.Filter与拦截器怎么执行的............................................ 36
40.Jsp中如何进行分页,项目中如何进行分页?.................. 36
41,关于Ajax的技术组成与核心原理.................................. 37
43.Xhtml和html有什么区别。............................................ 38
44.css的引入方式有哪些?link和@import的区别是?....... 38
45.css选择符有哪些?哪些属性能够继承?优先级如何计算?内联和important哪一个优先级高?.............................................................................. 38
46.前端页面由哪三层构成,分别是什么?做用是什么?...... 38
47.你曾经在哪些浏览器测试过兼容?这些浏览器的内核分别是什么? 38
48.<img>标签上title与alt属性的区别是什么?............... 38
49.写出几种IE6 BUG的解决方法?...................................... 38
50.描述css reset的做用和用途。...................................... 39
51.你如何对网站的文件和资源进行优化?期待的解决方案包括: 39
52.什么是语义化的html?................................................... 39
53.清除浮动有几种方式?各自的优缺点是?........................ 39
54.解释下 CSS sprites,以及你要如何在页面或网站中使用它? 39
55,html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和HTML5??.......................................... 40
56.javascript的同源策略。............................................... 40
5七、HTML的 form提交以前如何验证数值文本框的内容所有为数字?不然的话提示用户并终止提交?............................................................................ 40
59. jsp有哪些内置对象?做用分别是什么?分别有什么方法? 40
60. jsp有哪些动做?做用分别是什么?................................. 41
6一、JSP的经常使用指令............................................................. 41
62. JSP中动态INCLUDE与静态INCLUDE的区别?................ 41
6三、页面间对象传递的方法.................................................. 42
三. Java web部分............................................................... 42
一、Tomcat的优化经验.......................................................... 42
二、HTTP请求的GET与POST方式的区别................................ 42
三、解释一下什么是servlet;............................................... 42
四、说一说Servlet的生命周期?........................................... 42
五、Servlet的基本架构........................................................ 42
六、Servlet API中forward()与redirect()的区别?........... 42
七、Request对象的主要方法:.............................................. 43
八、request.getAttribute()和 request.getParameter()有何区别? 43
九、MVC的各个部分都有那些技术来实现?如何实现?.............. 43
十、咱们在web应用开发过程当中常常遇到输出某种编码的字符,如iso-8859-1等,如何输出一个某种编码的字符串?.............................................. 44
四.数据库部分..................................................................... 44
一、用两种方式根据部门号从高到低,工资从低到高列出每一个员工的信息。 44
二、ORACLE和MySQL的区别。............................................... 44
三、存储过程和函数的区别。................................................ 45
四、Oracle导入和导出方式................................................... 45
五、Oracle分页方法............................................................. 45
六、mysql的分页方法............................................................ 45
七、解释什么是死锁,如何解决Oracle中的死锁?............... 46
八、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序............................................................................................ 46
九、存储过程与触发器必须讲,常常被面试到?...................... 46
十、数据库三范式是什么?.................................................... 48
十一、说出一些数据库优化方面的经验?.................................. 49
十二、union和union all有什么不一样?................................... 49
13.用一条SQL语句查询出每门课都大于80分的学生姓名.... 49
14.全部部门之间的比赛组合................................................ 50
15.显示文章标题,发帖人、最后回复时间........................... 50
16.删除除了id号不一样,其余都相同的学生冗余信息............. 50
18.求出发帖最多的人:....................................................... 50
1九、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每一年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?... 51
2一、注册Jdbc驱动程序的三种方式...................................... 51
2二、用JDBC如何调用存储过程............................................. 51
2三、JDBC中的PreparedStatement相比Statement的好处.... 51
2四、Class.forName的做用?为何要用?.............................. 51
2五、大数据量下的分页解决方法。....................................... 52
2六、用 JDBC查询学生成绩单,把主要代码写出来(考试几率极大). 52
2七、说出数据链接池的工做机制是什么?............................... 52
2八、为何要用 ORM? 和 JDBC有何不同?......................... 53
29. 数据库大数据处理......................................................... 53
30. 如何写出一个快排......................................................... 53
31. 什么是事务?什么是锁?.............................................. 54
32. 维护数据库的完整性和一致性,你喜欢用触发器仍是自写业务逻辑?为何?............................................................................................ 54
33. 什么是内存泄漏?......................................................... 54
34.触发器的做用?.............................................................. 54
触发器是一中特殊的存储过程,主要是经过事件来触发而被执行的。它能够强化约束,来维护数据的完整性和一致性,能够跟踪数据库内的操做从而不容许未经许可的更新和变化。能够联级运算。如,某表上的触发器上包含对另外一个表的数据操做,而该操做又会致使该表触发器被触发。.................................................. 54
35. 经常使用的oracle操做的命令............................................. 54
36, 索引的优缺点............................................................ 55
37.使用oracle伪列删除表中重复记录:?......................... 55
五. XML部分........................................................................ 55
一、xml有哪些解析技术?区别是什么?................................... 55
二、你在项目中用到了xml技术的哪些方面?如何实现的?...... 55
四、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?............................................................................................ 56
六.流行的框架与新技术....................................................... 56
一、.................................................. 谈谈你对Struts的理解。. 56
二、Struts优缺点................................................................. 56
三、STRUTS的应用(如STRUTS架构)....................................... 57
四、谈谈你对Hibernate的理解。......................................... 57
五、你对Spring的理解。..................................................... 58
6.Spring由哪些模块组成?................................................... 58
7. 核心容器模块。.............................................................. 58
九、写Hibernate的一对多和多对一双向关联的orm配置?.... 58
十、在DAO中如何体现DAO设计模式?.................................. 59
十一、spring+Hibernate中委托方案怎么配置?....................... 59
12. hibernate进行多表查询每一个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决;........................................... 59
13.介绍一下Hibernate的二级缓存...................................... 59
1四、Jdo是什么?................................................................... 60
16. IOC的优势是什么?................................................. 61
18. 什么是Spring的依赖注入?....................................... 61
19. 有哪些不一样类型的IOC(依赖注入)方式?.............. 61
20. 哪一种依赖注入方式你建议使用,构造器注入,仍是 Setter方法注入? 61
21. Spring对DAO的支持................................................... 61
22. 解释AOP................................................................... 61
23. Aspect 切面.............................................................. 61
24. 在Spring AOP 中,关注点和横切关注的区别是什么? 62
25. 链接点......................................................................... 62
26. 通知............................................................................ 62
29 SpringMvc怎么和AJAX相互调用的................................. 62
30当一个方法向AJAX返回特殊对象,譬如Object,List等,须要作什么处理 62
31 SpringMvc里面拦截器是怎么写的................................... 62
32讲下SpringMvc的执行流程.............................................. 63
33解释Spring支持的几种bean的做用域。......................... 63
34,Spring框架中的单例bean是线程安全的吗?.................. 63
35. 解释Spring框架中bean的生命周期。........................ 63
36.哪些是重要的bean生命周期方法? 你能重载它们吗?. 64
38. 什么是基于Java的Spring注解配置? 给一些注解的例子. 64
39. 什么是基于注解的容器配置?....................................... 64
40. 怎样开启注解装配?.................................................... 64
41. 使用Spring经过什么方式访问Hibernate?................... 64
42. Spring支持的ORM....................................................... 64
43.如何经过HibernateDaoSupport将Spring和Hibernate结合起来? 64
44. Spring支持的事务管理类型........................................ 65
45. Spring框架的事务管理有哪些优势?.......................... 65
49. 什么是Spring MVC框架的控制器?........................... 65
50. 讲下SpringMvc的核心入口类是什么,Struts1,Struts2的分别是什么 65
51. SpringMvc的控制器是否是单例模式,若是是,有什么问题,怎么解决 65
52. SpingMvc中的控制器的注解通常用那个,有没有别的注解能够替代 65
53. 若是在拦截请求中,我想拦截get方式提交的方法,怎么配置 65
54. 若是在拦截请求中,我想拦截提交参数中包含"type=test"字符串,怎么配置 65
55. SpringMvc中函数的返回值是什么................................. 66
56. SpringMVC怎么样设定重定向和转发的.......................... 66
57. SpringMvc用什么对象从后台向前台传递数据的............ 66
58. SpringMvc中有个类把视图和数据都合并的一块儿的,叫什么 66
59. 怎么样把ModelMap里面的数据放入Session里面.......... 66
61. 当一个方法向AJAX返回特殊对象,譬如Object,List等,须要作什么处理 66
63. 讲下SpringMvc的执行流程........................................... 66
64,Hibernate是如何延迟加载?.......................................... 66
66,如何优化Hibernate?................................................... 67
67,在数据库中条件查询速度很慢的时候,如何优化?........... 67
69,Hibernate的主键生成机制............................................ 68
69,Mybatis比IBatis比较大的几个改进是什么?.............. 68
70,什么是MyBatis的接口绑定,有什么好处........................ 69
71,接口绑定有几种实现方式,分别是怎么实现的?............... 69
72,什么状况下用注解绑定,什么状况下用xml绑定............. 69
73,MyBatis实现一对一有几种方式?具体怎么操做的........... 69
74,MyBatis实现一对多有几种方式,怎么操做的.................. 69
75,MyBatis里面的动态Sql是怎么设定的?用什么语法?..... 69
78,讲下MyBatis的缓存..................................................... 69
七.软件工程与设计模式....................................................... 70
一、j2ee经常使用的设计模式?说明工厂模式。.......................... 70
二、开发中都用到了那些设计模式?用在什么场合?................. 70
八. j2ee部分...................................................................... 71
二、应用服务器与WEB SERVER的区别?................................ 71
三、应用服务器有那些?....................................................... 71
四、J2EE是什么?................................................................. 71
五、J2EE是技术仍是平台仍是框架?什么是J2EE.................. 71
六、如何给weblogic指定大小的内存?.................................. 71
七、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 71
八、如何启动时不需输入用户名与密码?................................ 71
九、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或链接池等相关信息进行配置后,实际保存在什么文件中?........ 71
十、在weblogic中发布ejb需涉及到哪些配置文件............. 71
十一、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置?................................................................................ 72
九,项目功能实现技术问题(附带源码)............................. 72
1,java实现excel模板导出:http://www.cnblogs.com/Mr-kevin/p/5793276.html............................................................................................ 72
2,java中生成验证码:http://www.cnblogs.com/syscn/p/5794391.html 72
3,Java-->实现群聊功能(C/S模式--TCP协议):http://www.cnblogs.com/xmcx1995/p/5793879.html........... 72
4,Activiti工做流学习-----基于5.19.0版本(4):........... 72
5,Java关于IO流的介绍:................................................. 72
6,MVC权限管理的实现流程:.............................................. 72
7,批量数据上传的sql.xml:.............................................. 72
8, struts—文件的上传和下载:........................................... 72
十. 其余问题....................................................................... 72
1,svn的使用和搭建?........................................................ 72
2,git 命令总结?.............................................................. 74
3.tomcat给你你怎样去调优?............................................... 75
4,Tomcat有几种部署方式................................................... 76
第一种方法:....................................................................... 76
5,eclipse中server location灰色,如何修改?.............. 77
7,如何加大tomcat能够使用的内存?................................ 77
8,如何加大tomcat链接数?.............................................. 78
能够有多个类,但只能有一个public的类,而且public的类名必须与文件名相一致。
一个文件中能够只有非public类,若是只有一个非public类,此类能够跟文件名不一样
&和&&均可以用做逻辑与的运算符,&&为短路与,&不是短路与。
另外&能够作为整数的位运算符
例1:对于if(str != null&& !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,因此不会出现NullPointerException若是将&&改成&,则会抛出NullPointerException异常。
例2:If(x==33 &++y>0) y会增加,If(x==33 && ++y>0)不会增加
1. Break + 标签
2. 使用多个条件判断
3. 使用方法的return
在Java中,要想跳出多重循环,能够在外面的循环语句前定义一个标号,而后在里层循环体的代码中使用带有标号的break语句,便可跳出外层循环。例如,
ok: for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println("i=" + i + ",j=" + j);
if (j == 5)
break ok;
}
}
另外,我我的一般并不使用标号这种方式,而是让外层的循环条件表达式的结果能够受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。
int arr[][] ={{1,2,3},{4,5,6,7},{9}};
boolean found = false;
for(int i=0;i<arr.length&& !found;i++) {
for(int j=0;j<arr[i].length;j++){
System.out.println("i=" + i + ",j=" + j);
if(arr[i][j] ==5) {
found = true;
break;
}
}
}
第三种,使用方法的return
private static int test() {
int count = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
count++;
System.out.println("i=" + i + ",j=" + j);
if (j == 5) {
return count;
}
}
}
return 0;
}
做用在byte, short, char, int, enum
封装类对象,其它基本数据类型及引用数据类型都不能作为case的条件
2 << 3
由于将一个数左移n位,就至关于乘以了2的n次方,那么,一个数乘以8只要将其左移3位便可,而位运算cpu直接支持的,效率最高,因此,2乘以8等於几的最效率的方法是2 << 3。
若是只是大整数运算,使用BigInteger就能够
若是有浮点数据参与去处,须要使用BigDecimal进行运算
Java中基本类型的浮点数运算是不精确的,须要使用BigDecimal运算,尤为是金融、会计方向的软件
引用变量不能从新赋值,可是引用指向的对象的内容能够变化
例1:final StringBuffer a=new StringBuffer("immutable");
a=new StringBuffer("");
有编译错
例2:
final StringBuffer a=new StringBuffer("immutable");
a.append(“123”);
正确
他们的区别主要存在在引用数据类型上
==为比较两侧的对象是否同一对象,是用内存地址来比较的
equals是方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关
==能够两侧都为null,但equals左侧的引用指向的对象不能空,否则有NullPointerException
除非须要比较两个引用指向的对象是同一对象,通常都使用equals方法进行比较。尤为是String之类的值对象,另外,常量尽可能放在比较的左侧
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须建立了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,因此也称为类变量,只要程序加载了类的字节码,不用建立任何实例对象,静态变量就会被分配空间,静态变量就能够被使用了。
总之,实例变量必须建立对象后才能够经过这个对象来使用,静态变量则能够直接使用类名来引用。
不能够。由于非static方法(实例方法)是要与对象关联在一块儿的,必须建立一个对象后,才能够在该对象上进行方法调用,而static方法调用时不须要建立对象,能够直接调用。也就是说,当一个static方法被调用时,可能尚未建立任何实例对象,若是从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪一个对象上的呢?这个逻辑没法成立,因此,一个static方法内部发出对非static方法的调用。
int是java提供的8种原始数据类型之一,意思整型,占用4字节。
Integer是java为int提供的封装类,是引用数据类型。
int的默认值为0,而Integer的默认值为null,即Integer能够区分出未赋值和值为0的区别,int则没法表达出未赋值的状况。
例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer
在JSP开发中,Integer的默认为null,因此用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,因此用el表达式在文本框中显示时,结果为0,因此,int不适合做为web层的表单数据的类型。
在Hibernate中,若是将OID定义为Integer类型,那么Hibernate就能够根据其值是否为null而判断一个对象是不是临时的,若是将OID定义为了int类型,还须要在hbm映射文件中设置其unsaved-value属性为0。
另外,Integer提供了多个与整数相关的操做方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的做用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,因此,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
这四个做用域的可见范围以下表所示。
说明:若是在修饰的元素上面没有写任何访问修饰符,则表示friendly/default。
做用域 |
当前类 |
同package |
子孙类 |
其余package |
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
× |
friendly |
√ |
√ |
× |
× |
private |
√ |
× |
× |
× |
备注:只要记住了有4种访问权限,4个访问范围,而后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。
Overload是重载的意思,Override是覆盖的意思,也就是重写。
Overload和Override有共同之处,两个方法的方法名都必须相同,若是不一样,既不构成Overload,也不构成Override。
a) 参数列表彻底相同:个数相同、类型相同、顺序相同
b) 子类的返回值不能比父类的返回值范围大
c) 子类方法抛出的异常不能比父类方法抛出的异常范围大
d) 修饰符只能为public、protected、friendly,不能为private
e) 父子类方法不能使用static修饰
clone 有缺省行为,super.clone();由于首先要把父类中的成员复制到位,而后才是复制本身的成员。
1. 封装,隐藏内部实现,只暴露公共行为
2. 继承,提升代码的重用性
3. 多态,体现现实生活中类似对象的差别性
4. 抽象,抽取现实世界中类似对象的共同点
经过继承父类或实现接口。不一样子类或实现类对同一父类方法有不一样的实现。根据对象调用相应的实现方法。另外对于类似的方法,能够使用重载。
含有abstract修饰符的class即为抽象类,abstract类不能建立的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法没必要是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,因此,不能有抽象构造方法或抽象静态方法。若是的子类没有实现抽象父类中的全部抽象方法,那么子类也必须定义为abstract类型。
接口(interface)能够说成是抽象类的一种特例,接口中的全部方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下二者的语法区别:
1.抽象类能够有构造方法,接口中不能有构造方法。
2.抽象类中能够有普通成员变量,接口中没有普通成员变量
3.抽象类中能够包含非抽象的普通方法,接口中的全部方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型能够是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,而且默认即为public abstract类型。
5. 抽象类中能够包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中均可以包含静态成员变量,抽象类中的静态成员变量的访问类型能够任意,但接口中定义的变量只能是public static final类型,而且默认即为public static final类型。
7. 一个类能够实现多个接口,但只能继承一个抽象类。
下面接着再说说二者在应用上的区别:
接口更多的是在系统架构设计方法发挥做用,主要用于定义模块之间的通讯契约;
而抽象类在代码实现方面发挥做用,能够实现代码的重用。
abstract的method不能够是static的,由于抽象的方法是要被子类实现的,而static与子类扯不上关系!
native方法表示该方法要用另一种依赖平台的编程语言实现的,不存在着被子类实现的问题,因此,它也不能是抽象的,不能与abstract混用。
synchronized和abstract合用的问题不能共用,abstract方法只能存在于抽象类或接口中,它不能直接产生对象,而默认synchronized方法对当前对象加锁,没有对象是不能加锁。
另外synchronized不能被继承,子类继承时,须要另加修改符。
内部类就是在一个类的内部定义的类。内部能够定义在除参数位置上的任意位置。印象中有四种方式。
1. 静态内部类须要使用static修饰,而普通内部类不能使用static修饰
2. 静态内部类只能定义在和属性同级,普通内部类能够定义在除参数位置之外的任意位置
3. 静态内部类必需有名称,而普通内部类能够是匿名的
4. 静态内部类没有this引用,只此只能访问外部类的静态成员,而普通内部类能够访问外部类的所有成员
5. 静态内部类访问外部类的同名函数时,使用“外部类名.方法名”便可,而普通内部类须要使用“外部类名.this.外部方法”
6. 静态内部类能够定义静态方法,而普通内部类不能定义静态方法
1. 若是内部类为静态内部类,只能调用外部类的静态成员;若是有重名成员,须要用“外部类名.成员名”访问;不能调用外部类的对象成员。
2. 若是内部类为非静态内部类,则能够调用外部类的全部成员;若是有重名成员,须要使用“外部类名.this.外部方法”
基本数据类型包括byte、int、char、long、float、double、boolean和short。
String是引用数据类型。
java.lang.String类是final类型的,所以不能够继承这个类、不能修改这个类。为了提升效率节省空间,咱们应该用StringBuffer/StringBuilder类
这两个类都实现了CharSequence接口。
1. 类型不一样,由于不是一个类,也没有继承关系,作参数时不能共用
2. String对象是不可变对象,不能修改值。而StringBuffer是可变对象,能修改值。
3. 拼接字符串时,String会产生新对象,而StringBuffer只是增长新字符,不产生新对象,所以效率高。
4. String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,因此,将StringBuffer对象存储进Java集合类中时会出现问题。
若是不查jdk api,我很难写出来!我能够说说个人思路:
StringTokenizer tokener = new StringTokenizer(s, ",");
String[] result = new String[tokener.countTokens()];
Integer i = 0;
while (tokener.hasMoreTokens()) {
result[i++] = tokener.nextToken();
}
int index = -1;
int oldIndex = 0;
List<String> ss = new ArrayList<String>();
while ((index = s.indexOf(',', index + 1)) != -1) {
ss.add(s.substring(oldIndex, index));
oldIndex = index + 1;
}
if (s.charAt(s.length() - 1) == ',') {
ss.add("");
}
String[] array = ss.toArray(new String[ss.size()]);
System.out.println(Arrays.toString(array));
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型
final int[] number = { 20 };
new Thread() {
@Override
public void run() {
for (int k = 0; k < 20; k++) {
number[0]++;
}
}
}.start();
Thread.sleep(10);
System.out.println(number[0]);
finally是异常处理语句结构的一部分,表示老是执行,用来释放资源。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,能够覆盖此方法提供垃圾收集时的其余资源回收,例如关闭文件等。JVM不保证此方法总被调用
异常表示程序运行过程当中可能出现的非正常状态,运行时异常表示虚拟机的一般操做中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,可是并不要求必须声明抛出未被捕获的运行时异常。
error 表示恢复不是不可能但很困难的状况下的一种严重问题。好比说内存溢出,不可能期望程序能处理这样的状况。exception表示一种设计或实现问题,也就是说,它表示若是程序运行正常,从不会发生的状况。
异常是指java程序运行时(非编译)所发生的非正常状况或错误。
Java使用面向对象的方式来处理异常,它把程序中发生的每一个异常也都分别封装到一个对象中,该对象中包含有异常的信息。
Java能够自定义异常类,全部异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。
Java为运行时异常和检查异常提供了不一样的解决方案,编译器强制检查异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,因此检查异常也称为checked异常,而运行异常能够处理也能够不处理,因此编译器不强制用try..catch处理或用throws声明,因此运行异常也称为Runtime异常。
提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序能够死掉也能够不死掉的错误,程序不该该死掉的错误
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、IllegelArgumentException、SecurityException。
throw程序出错时,手工抛出异常
try尝试执行,里面的语句可能出现异常,如出现异常须要处理
catch处理try中出现的异常
finally在try后执行清理操做,用于释放资源
java5之前,有以下两种:
第一种:
new Thread(){}.start();这表示调用Thread子类对象的run方法,new Thread(){}表示一个Thread的匿名子类的实例对象,子类加上run方法后的代码以下:
new Thread() {
public void run() {
}
}.start();
第二种:
new Thread(new Runnable(){}).start();这表示调用Thread对象接受的Runnable对象的run方法,new Runnable(){}表示一个Runnable的匿名子类的实例对象,runnable的子类加上run方法后的代码以下:
new Thread(new Runnable() {
public void run() {
}
}).start();
从Java5开始,还有以下一些线程池建立多线程的方式:
ExecutorService pool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
pool.execute(new Runable() {
public void run() {
}
});
}
Executors.newCachedThreadPool().execute(new Runable() {
public void run() {
}
});
Executors.newSingleThreadExecutor().execute(new Runable() {
public void run() {
}
});
有两种实现方法,分别使用new Thread()和new Thread(runnable)形式,第一种直接调用thread的run方法,因此,咱们每每使用Thread子类,即new SubThread()。第二种调用runnable的run方法。
同步是指全部操做串行化执行,顺序不能改变,前一操做未完成,后个操做不执行。
异步是指全部操做能够并行执行,顺序无关。
例如寄信
同步:若是没有寄完,不能吃饭,邮递员10天后送到,发送人被饿死
异步:寄出后能够当即吃饭,邮递员送完后,通知发送人送信结果。
若是强调执行顺序的话,用同步。若是顺序无关,则能够用异步。
异步执行效率比同步高。
class Test {
synchronized static void sayHello3() {
}
synchronized void getX() {
}
}
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有五种,分别是synchronized、wait与notify、sleep、suspend、join
synchronized: 一直持有锁,直至执行结束
wait():使一个线程处于等待状态,而且释放所持有的对象的lock,需捕获异常。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,需捕获异常,不释放锁。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM肯定唤醒哪一个线程,并且不是按优先级。
notityAll():唤醒全部处入等待状态的线程,注意并非给全部唤醒线程一个对象的锁,而是让它们竞争。
启动一个线程是调用start()方法,使线程就绪状态,之后能够被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
若是其它方法中使用当前对象做为锁对象,则不能;
若是其它方法中没有使用当前对象做为锁对象,则能。
在多任务操做系统中,为了提升CPU的利用率,能够使用多进程编程。但对进程通讯比较困难,进程间数据不能共享,所以能够使用多线程编程。一个进程至少包含一个主入口线程。
单个CPU,在同一时间只能处理一个线程的数据,可是操做系统的任务调度很是快,人眼没法识别,感受上是多个线程同时执行。有的线程能够已经用完CPU,正在做磁盘操做,此时并不使用CPU,可让出CPU资源给其它线程使用,提升效率。
线程有生命周期及相关关系和对应方法以下图:
Iterable
->Collection
->List
->ArrayList
->LinkedList
->Vector
->Stack
->Set
->HashSet
->TreeSet
Map
->Hashtable
->HashMap
->LinkedHashMap
Collections,不属于集合,是集合类的工具类
Arrays,不属于集合类,是数据对象的工具类
1. 线程同步,Vector线程安全,ArrayList线程不安全
2. 效率问题,Vector效率低,ArrayList效率高
3. 增加数量,Vector以1.5倍增加,ArrayList以2倍增加
1. 线程同步,Hashtable线程安全,HashMap线程不安全
2. 效率问题,Hashtable效率低,HashMap效率高
3. HashMap能够使用null做为key,Hashtable不能够使用null为key
4. HashMap使用的是新实现,继承AbstractMap,而Hashtable是继承Dictionary类,实现比较老
5. Hash算不一样,HashMap的hash算法比Hashtable的hash算法效率高
6. HashMap把Hashtable的contains方法去掉了,改为containsValue和containsKey。由于contains方法容易让人引发误解。
7. 取值不一样,HashMap用的是Iterator接口,而Hashtable中还有使用Enumeration接口
一个是存储单列数据的集合,另外一个是存储键和值的双列数据的集合,List中存储的数据是有顺序,而且容许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是能够有重复的。
List,Set是,Map不是
List使用get(index)取值,也能够使用Iterator、toArray取值
Set只能经过Iterator、toArray取值
Map取值使用get(key)取值,也能够使用keySet取键值集合,也可以使用values取值集合,entrySet取所有映射。
1. ArrayList和Vector使用数组存储元素;LinkedList使用链表存储元素
2. ArrayList和Vector插入删除数据时,须要搬运数据,效率较差;LinkedList使用链表,不须要搬运数据,效率高
3. ArrayList和Vectory查询时,按数组下标查询,不须要遍历,效率高;LinkedList须要遍历,查询效率底
4. ArrayList和Vector的区别见59条
1. 自行遍历,用另一个Vector来判断是否有重复
2. 用Set(TreeSet或HashSet)来去重
3. 用Apache的CollectionUtil工具类去重
Vector newVector = new Vector();
for (int i = 0; i < vector.size(); i++) {
Object obj = vector.get(i);
if (!newVector.contains(obj))
newVector.add(obj);
}
还有一种简单的方式,HashSet set = new HashSet(vector);
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个工具类,他提供一系列静态方法实现对各类集合的搜索、排序、线程安全化等操做。
Set里的元素是不能重复的,元素重复与否视具体状况而定:
1. HashSet使用equals比较
2. TreeSet使用compareTo进行比较
最经常使用的集合类接口是List 和 Map。
List的具体实现包括ArrayList、Vector、LinkedList,它们是可变大小的列表,比较适合构建、存储和操做任何类型对象的元素列表。List适用于按数值索引访问元素的情形。
Set的具体实现包括HashSet和TreeSet,它们也是可变大小集合,但不适合用索引取值。
Map 提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称做"键"和"值"),其中每一个键映射到一个值。
ArrayList/Vector、LinkedList
HashSet/TreeSetàSet
Properties/HashTable/TreeMap/HashMap
List的主要方法有:
add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty
Set的主要方法有:
add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty
Map的主要方法有:
put、get、keySet、values、entrySet、clear、remove、isEmpty
1. equals等,hashCode同,所以重写equals方法必须重写hashCode
2. hashCode等,equals不必定同,但hashCode最好散列化
3. 任何对象equals null都得false
4. 没有继承关系的两个类,equals都得false
5. 重写equals方法的类最好是值类,即不可变
要让人家感受你对java ee开发很熟,因此,不能仅仅只列core java中的那些东西,要多列你在作ssh项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。
经常使用的类:BufferedReader,BufferedWriter,FileReader,FileWirter,String,Integer,
java.util.Date,System,Class,List,HashMap
经常使用的包:java.lang,java.io,java.util,java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate
经常使用的接口: List,Map,Document,NodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate) ,Session(Hibernate),HttpSession
字节流,字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在java.io包中还有许多其余的流,主要是为了提升性能和使用方便。
FileInputStream、FileReader、BufferedInputStream、BufferedReader、ZipInputStream、PrintStream、StringReader、ObjectInputStream、RandomAccessFile(不属于流,但像流)
字节流是按字节读取或写入设备,但字符流是以字符为单位读取或写入设备。
若是是二进制文件,须要用字节流读取。通常来讲,字符流只处理文本文件。在设备中,大多数状况是以字节形式存储数据的,所以字符流经过须要传入字节流当参数。
序列化是把内存Java对象保存到存储介质中,反序列化就是把存储介质中的数据转化为Java对象。Java经过ObjectInputStream和ObjectOutputStream实现序列化和反序列化。须要进行序列化的对象的类必须实现Serializable接口,一般状况下须要知足如下条件:
1. 强烈建议手动生成serialVersionUID常量
2. 若是须要加解密的话,须要实现两个方法readObject和writeObject方法
3. 若是使用Hibernate二级缓存或其它缓存服务器的话,对象必须是可序列化的
4. 若是须要远程调用对象或传值的话,则对像须要序列化
5. 序列化类的可序列化成员必须也是可序列化的,不须要序列化的属性用transient修饰
1. 查找当前ClassLoader中是否有此class的类对象,有则返回
2. 若没有的话,向上递归全部的父ClassLoader中有无此class类对象,有则返回
3. 若尚未,查找BootstrapClassLoader中有无此class类对象,有则返回
4. 若尚未的话,使用findClass或resolveClass加载类对象
a. 读取class二进制文件
b. 根据字节数组生成Class对象
c. 缓存到当前ClassLoader中
JVM加载class对象是懒加载,按需加载
Java的内存分为两类,一类是栈内存,一类是堆内存。
栈中存储的是当前线程的方法调用、基本数据类型和对象的引用,栈是有序的。
堆中存储的是对象的值,堆是无序的。
方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
对于GC来讲,当程序员建立对象时,GC就开始监控这个对象的地址、大小以及使用状况。一般,GC采用有向图的方式记录和管理堆(heap)中的全部对象。经过这种方式肯定哪些对象是"可达的",哪些对象是"不可达的"。当GC肯定一些对象为"不可达"时,GC就有责任回收这些内存空间。能够。程序员能够手动执行System.gc(),通知GC运行,可是Java语言规范并不保证GC必定会执行。
assertion(断言)在软件开发中是一种经常使用的调试方式,不少开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;若是该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。通常来讲,assertion用于保证程序最基本、关键的正确性。assertion检查一般在开发和测试时开启。为了提升性能,在软件发布后,assertion检查一般是关闭的。
能够,若是非要实现java.lang.String,须要自已写ClassLoader,否则JVM优先加载默认rt.jar中的java.lang.String。
能够,但在应用的时候,须要用本身的类加载器去加载,不然,系统的类加载器永远只是去加载rt.jar包中的那个java.lang.String。因为在tomcat的web应用程序中,都是由webapp本身的类加载器先本身加载WEB-INF/classess目录中的类,而后才委托上级的类加载器加载,若是咱们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是咱们本身写的java.lang.String,可是这么干就会出不少潜在的问题,原来全部用了java.lang.String类的都将出现问题。
虽然java提供了endorsed技术,能够覆盖jdk中的某些类,可是,可以被覆盖的类是有限制范围,反正不包括java.lang这样的包中的类。
(下面的例如主要是便于你们学习理解只用,不要做为答案的一部分,不然,人家怀疑是题目泄露了)例如,运行下面的程序:
package java.lang;
public class String {
public static void main(String[] args) {
System.out.println("string");
}
}
报告的错误以下:
java.lang.NoSuchMethodError:main
Exception inthread "main"
这是由于加载了jre自带的java.lang.String,而该类中没有main方法。
1. 在web.xml中配置struts的servlet或filter入口类,同时在web.xml中配置spring的listener和配置文件路径
2. 引用SSH所需的jar包放在WEB-INF/lib下,须要有struts-spring-plugin.jar
3. 在struts.xml配置中,把Struts的Action类交由Spring托管
4. 把Hibernate所需的DataSource, SessionFactory, Transcation, HibernateTemplate配置在Spring的配置文件中
5. Dao层的类有时须要继承HiberateDaoSupport类,若是有HibernateTemplate时,能够不继承
6. 把Action、Service、Dao等类注册到Spring中管理
答:
package com.bwie.interview;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.StringTokenizer;
public class AnswerB01 {
public static void main(String[] args) throws IOException {
StringTokenizer tokenizer1 = getTokenzer("/a.txt");
StringTokenizer tokenizer2 = getTokenzer("/b.txt");
PrintStream out = new PrintStream("C:/c.txt");
while (tokenizer1.hasMoreTokens() && tokenizer2.hasMoreTokens()) {
out.println(tokenizer1.nextToken());
out.println(tokenizer2.nextToken());
}
out.close();
}
private static StringTokenizer getTokenzer(String fileName) throws IOException {
InputStreamReader reader = new InputStreamReader(AnswerB01.class.getResourceAsStream(fileName));
StringBuilder builder = new StringBuilder(1000);
int length = -1;
char[] cs = new char[1024];
while ((length = reader.read(cs)) != -1) {
builder.append(cs, 0, length);
}
reader.close();
return new StringTokenizer(builder.toString());
}
}
(你们正在作上面这道题,网上迟到的朋友也请作作这道题,找工做必须能编写这些简单问题的代码!)
答:listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不一样的人提供不一样的FileFilter实现,即提供了不一样的过滤策略。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
public class AnswerB02 {
public static void main(String[] args) throws IOException {
File sourceFolder = new File("D:/java");
File[] files = sourceFolder.listFiles(new JavaFileFilter());
for (File file : files) {
String absolutePath = file.getName();
String targetFile = "D:/jad/" + absolutePath.substring(0, absolutePath.length() - 5) + ".jad";
copy(file, new File(targetFile));
}
}
private static void copy(File source, File target) throws IOException {
FileInputStream input = new FileInputStream(source);
FileOutputStream out = new FileOutputStream(target);
int length = -1;
byte[] bs = new byte[1024];
while ((length = input.read(bs)) != -1) {
out.write(bs, 0, length);
}
input.close();
out.close();
}
private static final class JavaFileFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
}
}
import java.io.IOException;
public class AnswerB03 {
public static void main(String[] args) throws IOException {
String s = "我ABC汉DEF";
System.out.println(substring(s, 6));
}
public static String substring(String s, int length) {
char[] cs = s.toCharArray();
StringBuilder builder = new StringBuilder();
int count = 0;
for (char c : cs) {
if (isAsc(c)) {
count++;
} else {
count += 2;
}
if (count > length) {
break;
}
builder.append(c);
}
return builder.toString();
}
public static boolean isAsc(char c) {
return c < 128;
}
}
答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的烟雾弹。
String content = "中国aadf的111萨bbb菲的zz萨菲";
HashMap map = new HashMap();
for (int i = 0; i < content.length; i++) {
char c = content.charAt(i);
Integer num = map.get(c);
if (num == null)
num = 1;
else
num = num + 1;
map.put(c, num);
}
for (Map.EntrySet entry : map) {
system.out.println(entry.getkey() + ":" + entry.getValue());
}
估计是当初面试的那个学员表述不清楚,问题极可能是:
若是一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符以外的其余特殊字符。
int engishCount;
int chineseCount;
int digitCount;
for (int i = 0; i < str.length; i++) {
char ch = str.charAt(i);
if (ch >= '0' && ch <= '9') {
digitCount++;
} else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
engishCount++;
} else {
chineseCount++;
}
}
这是组合设计模式。
我有不少个(假设10万个)数据要保存起来,之后还须要从保存的这些数据中检索是否存在某个数据,(我想说出二叉树的好处,该怎么说呢?那就是说别人的缺点),假如存在数组中,那么,碰巧要找的数字位于99999那个地方,那查找的速度将很慢,由于要从第1个依次日后取,取出来后进行比较。平衡二叉树(构建平衡二叉树须要先排序,咱们这里就不做考虑了)能够很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低不少,原理以下图:
代码以下:
public class AnswerB04 {
public static void main(String[] args) {
Node root = makeupTree();
traverse(root);
}
private static void traverse(Node node) {
if (node == null) {
return;
}
traverse(node.left);
System.out.println(node.value);
traverse(node.right);
}
private static Node makeupTree() {
Node root = new Node(0);
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node11 = new Node(11);
Node node12 = new Node(12);
Node node21 = new Node(21);
Node node22 = new Node(22);
root.left = node1;
root.right = node2;
node1.left = node11;
node1.right = node12;
node2.left = node21;
node2.right = node22;
return root;
}
public static class Node {
public Node left;
public Node right;
public int value;
public Node(int value) {
this.value = value;
}
}
}
一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。
例:n=1237
则输出为:
1237,
2474,
4948,
9896,
9896,
4948,
2474,
1237,
提示:写程序时,先致谢按递增方式的代码,写好递增的之后,再增长考虑递减部分。
public static void doubleNum(int n) {
System.out.println(n);
if (n <= 5000)
doubleNum(n * 2);
System.out.println(n);
}
Gaibaota(N) = Gaibaota(N-1) + n
第1我的10,第2个比第1我的大2岁,依次递推,请用递归方式计算出第8我的多大?
package cn.itcast;
import java.util.Date;
public class A1 {
public static void main(String[] args) {
System.out.println(computeAge(8));
}
public static int computeAge(int n) {
if (n == 1)
return 10;
return computeAge(n - 1) + 2;
}
}
public static void toBinary(int n, StringBuffer result) {
if (n / 2 != 0)
toBinary(n / 2, result);
result.append(n % 2);
}
本人只研究过冒泡排序、选择排序和快速排序,下面是快速排序的代码:
冒泡排序:
private static void bubbleSort(int[] array) {
for (int i = 1; i < array.length; i++) {
for (int j = 0; j < i; j++) {
if (array[i] < array[j]) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
快速排序:
public class QuickSort {
public void quickSort(String[] strDate, int left, int right) {
String middle, tempDate;
int i, j;
i = left;
j = right;
middle = strDate[(i + j) / 2];
do {
while (strDate[i].compareTo(middle) < 0 && i < right)
i++; // 找出左边比中间值大的数
while (strDate[j].compareTo(middle) > 0 && j > left)
j--; // 找出右边比中间值小的数
if (i <= j) { // 将左边大的数和右边小的数进行替换
tempDate = strDate[i];
strDate[i] = strDate[j];
strDate[j] = tempDate;
i++;
j--;
}
} while (i <= j); // 当二者交错时中止
if (i < right) {
quickSort(strDate, i, right);
}
if (j > left) {
quickSort(strDate, left, j);
}
}
public static void main(String[] args) {
String[] strVoid = new String[] { "11", "66", "22", "0", "55", "22", "0", "32" };
QuickSort sort = new QuickSort();
sort.quickSort(strVoid, 0, strVoid.length - 1);
for (int i = 0; i < strVoid.length; i++) {
System.out.println(strVoid[i] + " ");
}
}
}
public class AnswerB11 {
public static void main(String[] args) {
int[] array = { 2, 25, 21, 63, 234, 83 };
reverse(array);
System.out.println(Arrays.toString(array));
}
private static void reverse(int[] array) {
for (int i = 0; i < array.length / 2; i++) {
int temp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = temp;
}
}
}
import java.util.Stack;
public class AnswerB13 {
public static void main(String[] args) {
Node tree = makeupTree();
Stack<Node> stack = new Stack<Node>();
Node currentNode = tree;
while (currentNode != null) {
System.out.println(currentNode.value);
stack.push(currentNode);
currentNode = currentNode.left;
if (currentNode == null) {
Node parent = stack.pop();
currentNode = parent.right;
if (currentNode == null) {
if (stack.isEmpty()) {
break;
}
Node parentParent = stack.pop();
currentNode = parentParent.right;
}
}
}
}
private static Node makeupTree() {
Node root = new Node(0);
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node11 = new Node(11);
Node node12 = new Node(12);
Node node21 = new Node(21);
Node node22 = new Node(22);
root.left = node1;
root.right = node2;
node1.left = node11;
node1.right = node12;
node2.left = node21;
node2.right = node22;
return root;
}
public static class Node {
public Node left;
public Node right;
public int value;
public Node(int value) {
this.value = value;
}
}
}
会出现线程不安全问题。不管是doGet仍是doPost去调用,服务器端处理的过程都是同样的,那么咱们能够把处理过程单独写在另一个方法handle里,让两个方法都去调用handle,根据不一样请求去调用不一样的方法。
把全部的session的数据保存到Mysql服务器上,全部Web服务器都来这台Mysql服务器来获取Session数据。
SimpleTagSupport,通常调用doTag方法或者实现SimpleTag接口
在 jsp 中处理 JSON,一般须要配套使用 JQuery 控件,而且导入一些 Common jar 包。使用 JQuery 控件是由于它能有效的解析而且展现 JSON 数据,导入Common 则是由于 Java 中的对象并非纯粹的数据,须要经过这些 Jar 包的处理使之转化成真实数据。
重定向是客户端行为,转发是服务器端行为
重定向时服务器产生两次请求,转发产生一次请求,重定向时能够转发到项目之外的任何网址,转发只能在当前项目里转发
重定向会致使request对象信息丢失。转发则不会
转发的url不会变,request.getRequestDispatch()。forward()
重定向的url会改变,response.getRedirect();
jsp的可读性强,容易维护,而且jsp在最后会编译成servlet,servlet容易调试。
Jsp不可以直接调用窗口,只能先 生成打开窗口的js,再由js调用
Session不能经过new建立,须要经过调用getSession()或者getSession(true)方法建立,getSession()是自动建立session,getSession(true)是强制建立session,setAttribute()方法能够用于传值,getAttribute()能够用于取值
(第一次建立session的时候,就是访问第一次一个jsp页面<这个页面的page指令 没有设置session=false>)
销毁session调用invalidate方法
经过setMaxInactiveInterval()能够设定session的生存时间(web.xml能够设置session的生存时间)
Page :指令是针对当前页面的指令
Include :用于指定如何包含另外一个页面
Taglib :用于定义和指定自定义标签
Forward,执行页面跳转,将请求的处理转发到另外一个页面
Param :用于传递参数
Include :用于动态引入一个jsp页面
Plugin :用于下载javaBean或applet到客户端执行
useBean :使用javaBean
setProperty :修改javaBean实例的属性值
getProperty :获取javaBean实例的属性值
request.getParameter()返回客户端的请求参数与值
request.getParameterNames()返回全部可用属性名的枚举
request.getParameterValues()返回包含参数的全部值的数组
一个是服务端,一个是客户端
Servlet是独立于平台和协议的服务器端的java应用程序,能够动态生成web页面,并采用响应--请求的模式提供web服务
javaScript是一种解释性语言,用于向html页面提供交互行为,一般被直接嵌入在html页面中
servlet是java语言编写的web应用
js是基于html上的一种解释语言
客户端发出请求(request),jsp引擎将jsp页面翻译成servlet的java源文件,在Tomcat中将源文件编译成class文件,并加载到内存中执行,把结果返回(response)给客户端。
不一样:
Html是静态,servlet是动态
html页面由服务器直接返回,
servlet是用来处理客户请求,并返回html页面
//servlet须要服务器调用servlet方法生成动态html页面,且须要在web.xml中配置url路径
Cookie,session和application,
Cookie是http对象,客户端与服务端均可以操纵
cookie是在客户端保持状态,session是在服务器端保持状态,因为cookie是保存在客户端本地的,因此数据很容易被窃取,当访问量不少时,使用session则会下降服务器的性能,application的做用域是整个工程里只有一个,能够在不一样浏览器之间共享数据,全部人均可以共享,所以application也是不安全的
Session用于客户端与服务器之间保持状态的解决方案,数据保存在服务器内存中,底层是有cookie实现的
Application的做用域是整个工程里只有一个,能够在不一样浏览器之间共享数据,全部人均可以共享,所以application是不安全的。
Request是客户端向服务端发送请求
Response是服务端对客户端请求作出响应
Session在servlet中不能直接使用,须要经过getSession()建立,若是没有设定它的生命周期,或者经过invildate()方法销毁,关闭浏览器session就会消失
Application不能直接建立,存在于服务器的内存中,由服务器建立和销毁
可经过form表单的get或post将值传递到后台,也可经过setAttribute()方法将值传递到后台
在servlet中经过request.getParameter()方法能够获取表单的值
或者是request.getParameterValuse();
表单传参,url传参,jquery.ajax传参
经过设置属性setAttribute(),经过getAttribute()拿值,getParameter()方法能够作到
不能
404:找不到url请求的路径,通常是工程名不对或者拼写错误
500:服务器内部错误,通常是服务器内部代码编写错误,也有多是抛异常致使
<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>
经过使用属性hidden能够将元素隐藏
Session不能经过new建立,要经过调用getSession()方法建立,数据保存在服务器端,单个客户端session是共享的,底层是由cookie实现的,大小没有限制
Application的做用域是整个工程只有共享一个,生命周期比session大
Cookie须要经过new建立,数据保存在客户端中,cookie保存的数据不能超过4k,不安全
如将ISO-8859-1输出为GBK格式的字符, 经过new String(byte[] bytes,String charset) 构造器设置编码构造一个新的String(new String("ISO-8859-1","GBK"));
经过session中的isNew()能够判断是不是新用户
Web容器会自动为servlet写一个无参的构造器,它使用class.forName("").newInstance()反射来建立servlet实例的
是线程不安全的,由于servlet是单例模式,当多个客户端共同访问的时候线程不安全。
尽可能用局部变量,同步块,若是当前字段是不会改变的,用final修饰
是行为元素、是在请求处理阶段引入的,引入执行页面或servlet所生成的应答文本
先编译,后包含,就是将每一个jsp页面都单独转化成html页面,最后再将全部的html页面相加,若是有相同变量不会冲突
是指令元素
是编译时包含,引入静态文本(html,jsp),在JSP页面被转化成servlet以前和它融和到一块儿。先包含,后编译
就是将多个jsp一块儿解析,最后再一块儿生成html页面,若是有相同变量会冲突
能够使用pageContext对象来设定属性,并指定属性的做用范围,提供了对JSP页面内全部的对象及名字空间的访问
首先初始化过滤器,而后服务器组织过滤器链,全部的请求都必须须要先经过过滤器链,
过滤器链是一个栈,遵循先进后出的原则 ,全部的请求须要通过一个一个的过滤器,执行顺序要根据web.xml里配置的<filter-mapping>的位置先后执行,每一个过滤器之间经过chain.doFilter链接, 最后抵达真正请求的资源,执行完后再从过滤器链退出
须要上一页和下一页的超连接(至少须要这两个),经过计算当前页的页码获取下一页数据
的起始位置,而后在 MySql 中查询,若是使用 Oracle 则须要另外计算下一页数据的结
束位置。
使用hibernate框架,它能够针对不一样的数据库自动产生为你分页的代码。
一、Ajax特色:
局部刷新、提升用户的体验度,数据从服务器商加载。
二、AJax的技术组成:不是新技术,而是以前技术的整合
Ajax: Asynchronous Javascript And Xml;(异步的JavaScript和XML)
包括的技术:JavaScript、XML、CSS、XMLHttpRequest
异步:发送请求之后,不等结果,由回调函数处理。
JavaScript:向服务器发送请求,得到返回结果,更新页面
XML: 用来封装数据
三、Ajax核心原理
XMLHttpRequst对象:经过该对象向服务器发送请求。
它是异步请求的技术,全部现代浏览器都支持(Chrome、IE5+)
1)建立XMLHttpReuest对象
非IE浏览器(Mozilla/Safari):
var xhr=new XMLHttpRequest();
IE:
xhr=new ActiveXObject("Msxml2.XMLHTTP");
低版本IE:
xhr=new ActiveXObject("Microsfot.XMLHTTP");
2)XMLHttpRequest对象的属性与方法
a)方法:
open("GET/POST",URL,true/false):用来向服务器创建链接
有三个参数:
参数1:提交方式,post或get
参数2:请求的URL
参数3:表示同步或异步请求,true:表示异步请求
false: 表示同步请求
send(data):发送请求
参数:提交的内容。
POST方式:data就是提交的参数,send(username=root&password=abc123);
GET方式:send(null)
b)属性:
onreadystatechange:设置状态改变时的回调函数,回调函数用来获取服务器数据。
onreadystatechange=function(){
}
readyState:服务器状态响应
状态码:
0:未初始化
1:正在加载
2:加载完成
3:请求进行中
4:请求完成
responseText:服务器返回的数据(文本格式)
responseXML:服务器返回的数据(XML格式)
Html(超文本标记语言)是标准通用标记语言下的一个应用,也是一种规范,一种标准。
Xhtml(可扩展超文本标记语言)是一种置标语言,表现方式与html相似,不过语法上更加严格,主要不一样:
1,全部元素必须被正确嵌套,
2,全部标记必须闭合,
3,标签名,属性名必须小写字母,
4,全部的属性必须用“”括起来,
5,全部非标签一部分的><&都必须以编码形式,
6,全部属性必需要有值,
7,注释中不要有--
8,图片必需要有说明文字
四种:内联,内嵌,外链,导入
区别:
1,link属于xhtml标签,@import彻底是css提供的一种方式,link除了加载css还能够定义rss,定义rel属性等,@import只能加载css。
2,加载顺序差异:link引用的css是同时被加载的,@import引用的css会等到页面所有被下载完才会再被加载。
3,兼容性差异,@import是css2.1提出,ie5以上才支持,link没有兼容问题。
4,使用dom控制样式的差异,当用javascript去控制样式的时候,只能使用link,@import不是dom能控制的。
5,@import能够在css中再次引入其余样式表。
标签选择符,类选择符,id选择符,继承的不如指定的,id>class>Tagname
Important优先级高
结构层:html由html或者xhtml负责建立,运用标签对网页内容的含义做出描述。
表示层:css由css负责建立,对如何显示有关内容作出回答。
行为层:javascript由javascript负责建立,负责回答应该如何对事件做出反应。
Ie(ie内核),火狐(Gecko),谷歌(webkit),opera(presto)
Alt是在你的图片由于某种缘由不能加载的时候在页面显示的提示信息,它会直接输出在本来加载图片的地方,title是在鼠标悬停在图片上的显示的小提示,鼠标离开就没了,绝大数html标签都支持title。
Css reset重置浏览器的默认css样式,浏览器种类不一样,默认样式不同,经过使用css reset重置,让他们统一,方便开发。
1,尽量减小http请求数(文件合并)
2,使用CDN(内容分发网络)
3,添加Expire/Cache-Control头
4,启用Gzip压缩
5,css放在页面最上面
6,scrip放在页面最下面
7,避免在css中使用Expressions
8,把js和css放在外部文件中
9,减小dns查询
10,压缩javascript和css
11,避免重定向
12,移除重复脚本
13,配置实体标签
14,使用ajax缓存
根据内容的结构化(内容语义化),选择合式的标签(代码语义化),便于开发者的阅读和写出更加优雅的代码的同时让浏览器的爬虫和机器更好地解析。
1,父级定义height(优势:代码少,简单易掌握;缺点:只适合固定高度元素,没法高度自适应)
2,结尾处使用空标签清除浮动:Clear:both(优势:理论上能清除全部标签的浮动,简代码少浏览器支持好;缺点:增长了无心义的标签)
3,父级定义伪类after和zoom(优势:浏览器支持好;缺点:代码多,两句代码结合使用才能让主流浏览器都支持)
4,父级定义overflow:hidden(优势:代码少,简单,浏览器支持好;缺点:必须定义width或者zoom,同时不能定义height,不能和position配合使用)
5,父级定义overflow:auto(优势:代码少,简单,浏览器支持好;缺点:必须定义width或者zoom,同时不能定义height,内部元素高度超过父级会出现滚动条
还有,父级一块儿浮动,父级定义display:table,结尾加br的clear:both等
是一种网页图片应用处理方式。它容许你将一个页面涉及到的全部零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像之前那样一幅一幅地慢慢显示出来了。页面icon不少的状况下使用合适。
HTML5 如今已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增长。
绘画 canvas用于媒介回放的 video 和 audio 元素本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;sessionStorage 的数据在浏览器关闭后自动删除
语意化更好的内容元素,好比 article、footer、header、nav、section
表单控件,calendar、date、time、email、url、search
新的技术webworker, websockt, Geolocation
移除的元素
纯表现的元素:basefont,big,center,font, s,strike,tt,u;
对可用性产生负面影响的元素:frame,frameset,noframes;
支持HTML5新标签:
IE8/IE7/IE6支持经过document.createElement方法产生的标签,
能够利用这一特性让这些浏览器支持HTML5新标签,
浏览器支持新标签后,还须要添加标签默认的样式:
固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
如何区分: DOCTYPE声明\新增的结构元素\功能元素
一段脚本只能读取来自于同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合
<form onsubmit='chkForm(this)'>
<input type="text" name="d1" />
<input type="submit" />
</form>
<script type="text/javascript">
function chkForm(this){
var value1 = this.d1.value;
var len =value1.length;
for(var i=0;i<len;i++){
if(value1.charAt(i)>"9"|| value1.charAt(i)<"0"){
alert("含有非数字字符");
return false;
}
}
return true;
}
</script>
(这个问题彷佛不重要,不明白为什么有此题)
答:JSP共有如下6种基本动做
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)
<jsp:include page=included.jsp flush=true />它老是会检查所含文件中的变化,适合用于包含动态页面,而且能够带参数 静态INCLUDE用include伪码实现,不会检查所含文件的变化,适用于包含静态页面 <%@include file=included.htm %>
标签不一样
执行的时机不一样,动态include是在运行时把两个JSP合并,静态include是在编译期合并动态include在页面发生改变时,能及时更新,而静态页面,不会再次从新编译
1. request
2. session
3. application
4. cookie
5. URL地址
1. 内存优化-Xms
2. 增长线程数maxThreads="150"
3. 修正server.xml中的中文编码
4. BIO改NIO
答:
1. URL地址长度不一样, GET支持的字符少
2. GET的密码是明文,安全问题,容易受到黑客攻击
3. GET只传输文本,不支持文件传输
4. GET方式一般用来查询,不用来修改数据,是幂等操做,修改数据用POST
答: 一般Servlet特指HttpServlet,用来接受浏览器的访问请求,浏览器最经常使用的请求为GET和POST方式,还有其它五种,而HttpServlet分别有七个方法(PUT、DELETE、HEADER、TRACE、OPTION)处理这些类型的请求,另有一个是J2EE不支持的,是CONNECT。Servlet是J2EE规范中的重要成员,是构成WEB的重要组件
1. 加载Servlet类
2. 实例化
3. 初始化init
4. 处理请求 service à 进一步调用doGet/doPost方法
5. 销毁 destory
1. 定义一个Servlet类,继承HttpServlet抽象类
2. 在web.xml中定义一个servlet标签,配置类名和servlet名
3. 配置servlet处理的URL请求链接,能够用模糊匹配
4. 在J2EE生命周期中,一个Servlet只有一个实例
5. 一个Servlet能够为多个请求服务,每一个请求在独立的线程中执行
Forward: 服务器端内部跳转,URL地址不变,属于单次请求
Redirect: 服务器通知浏览器中转,URL地址发生改变,是两次跳转
Forward不能跨域跳转
Redirect能够跨域跳转
Forward在两个页面传值能够经过parameter,也能够经过attribute,能传递Java对象
Redirect在两个页面传值只能经过parameter,在URL中传参
setAttribute(String name,Object):设置名字为name的request的参数值
getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象全部属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的全部Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的Body的长度
getHeader(String name):得到HTTP协议定义的文件头信息
getHeaders(String name):返回指定名字的request Header的全部值,结果是一个枚举的实例
getHeaderNames():返回因此request Header的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于得到请求中的数据
getMethod():得到客户端向服务器端传送数据的方法
getParameter(String name):得到客户端传送给服务器端的有name指定的参数值
getParameterNames():得到客户端传送给服务器端的全部参数的名字,结果是一个枚举的实例
getParametervalues(String name):得到有name指定的参数的全部值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():得到查询字符串
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关Session
getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性
1. getParameter是表单数据或URL参数,不能在server端修改
getAttribute是两个页面或servlet之间内部跳转传递对象参数,能够修改
2. getParameter的类型只能是String
getAttribute的类型能够是任意Java对象
3. forward跳转时才有attribute,redirect时,attribute所有为null
MVC是Model-View-Controller的简写。
Model表明的是应用的业务逻辑(经过JavaBean,EJB组件实现),一般是数据访问层。
View是应用的表示层(由JSP页面产生)或模板框架,如freemarker、velocity
Controller是提供应用的处理过程控制(通常是一个Servlet),负责页面间跳转
经过这种设计模型把应用逻辑,处理过程和显示逻辑分红不一样的组件实现。这些组件能够进行交互和重用。
Model:JDBC、Hibernate、MyBatis
View:JSP、FreeMarker、Struts
Controller:Spring MVC、Struts、Servlet
SpringSide集成Spring、Struts、Hibernate、WebService、View展现框架,做者江南白衣
public String translate(String str) {
try {
return new String(str.getBytes("ISO-8859-1"), "GBK").trim();
} catch (Exception e) {
System.err.println(e.getMessage());
throw new RuntimeException(e);
}
}
employee: eid, ename, salary, dept_id
select * from employee order by dept_id desc, salary;
1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格很是高Oracle。
2. Oracle支持大并发,大访问量,是OLTP最好的工具。(OLTP[联机事务处理])(OLAP[数据仓库处理 有了基础大数据后 根据数据分析 市场定位])。
3. 安装所用的空间差异也是很大的,Mysql安装完后才几百M而Oracle有几G左右,且使用的时候Oracle占用特别大的内存空间和其余机器性能。
4.Oracle和Mysql操做上的一些区别【开发人员接触的】
①主键Mysql通常使用自动增加类型,在建立表时只要指定表的主键为auto_increment,插入记录时,不须要再指定该记录的主键值,Mysql将自动增加;Oracle没有自动增加类型,主键通常使用的序列,插入记录时将序列号的下一个值付给该字段便可;只是ORM框架是只要是native主键生成策略便可。
②单引号的处理MYSQL里能够用双引号包起字符串,ORACLE里只能够用单引号包起字符串。在插入和修改字符串前必须作单引号的替换:把全部出现的一个单引号替换成两个单引号。
③翻页的SQL语句的处理MYSQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每一个结果集只有一个ROWNUM字段标明它的位置,而且只能用ROWNUM<100,不能用ROWNUM>80
④ 长字符串的处理长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操做的字符串长度小于等于4000个单字节,若是要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前必定要作进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操做。
⑤空字符的处理MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不允许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构,导数据的时候会产生错误。所以导数据时要对空字符进行判断,若是为NULL或空字符,须要把它改为一个空格的字符串。
⑥字符串的模糊比较MYSQL里用 字段名 like '%字符串%',ORACLE里也能够用 字段名like '%字符串%'但这种方法不能使用索引,速度不快。【like ‘%’开头 没法使用索引 不使用开头 能够使用索引】
⑦Oracle实现了ANSII SQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面仍是比较的弱
1). 能够理解函数是存储过程的一种 ,都是预编译的 【块语句每次运行都会编译 存储过程块 一次编译屡次运行 效率更高】
Plsql块语句
Begin
End
存储过程块
Create procedure prg_add()
As
Begin
End;
2). 函数能够没有参数,可是必定须要一个返回值,存储过程能够没有参数,不须要返回值
3). 函数return返回值没有返回参数模式,存储过程经过out参数返回值,若是须要返回多个参数则建议使用存储过程 【函数oracle 在函数能够使用in和out mysql不能使用out】
4). 在sql数据操纵(DML)语句中只能调用函数而不能调用存储过程
使用oracle工具exp/imp
使用plsql相关工具
1. 导入/导出的是二进制的数据,
2.plsql导入/导出的是sql语句的文本文件
Oracle中使用rownum来进行分页,这个是效率最好的分页方法,hibernate也是使用rownum来进行oralce分页的select * from
( select rownum r,a from tabName where rownum <= 20 )where r > 10
select * from content order by id desc limit 0, 10
在中小数据量的状况下,这样的SQL足够用了,惟一须要注意的问题就是确保使用了索引。随着数据量的增长,页数会愈来愈多,查看后几页的SQL就可能相似:
select * from content order by id desc limit 10000, 10
一言以蔽之,就是越日后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。
此时,咱们能够经过2种方式:
一,子查询的分页方式来提升分页效率,飘易用的SQL语句以下:
SELECT * FROM `content` WHERE id (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT $pagesize
为何会这样呢?由于子查询是在索引上完成的,而普通的查询时在数据文件上完成的,一般来讲,索引文件要比数据文件小得多,因此操做起来也会更有效率。(via)经过explain SQL语句发现:子查询使用了索引!
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY content range PRIMARY PRIMARY 4 NULL 6264 Using where
2 SUBQUERY content index NULL PRIMARY 4 NULL 27085 Using index
简言之就是存在加了锁而没有解锁,多是使用锁没有提交或者回滚事务,若是是表级锁则不能操做表,客户端处于等在状态,若是是行级锁则不能操做锁定行
解决办法:
1). 查找出被锁的表
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
2). 杀进程中的会话
alter system kill session "sid,serial#";
employee: eid, ename, salary, dept_id
select count(*), a.dept_id
from employee a
where
a.salary > (select avg(b.salary) from employee b where b.dept_id = '本部门')
group by a.dept_id
order by a.dept_id
create or replace procedure insert_Student (_name varchar, _age int , out_id int)
declear
a varchar
begin
insert into studentvalue(null,_name,_age);
select max(stuId)into _id from student;
end;
call insert_Student('wfz',23,@id);
select @id;
mysql> create trigger update_Student BEFORE update on student FOR EACH ROW
-> select * from student;
触发器不容许返回结果
create trigger update_StudentBEFORE update on student FOR EACH ROW
insert into student value(null,'zxx',28);
mysql的触发器目前不能对当前表进行操做
create trigger update_StudentBEFORE update on student FOR EACH ROW
delete from articles where id=8;
这个例子不是很好,最好是用删除一个用户时,顺带删除该用户的全部帖子
这里要注意使用OLD.id
触发器用处仍是不少的,好比校内网、开心网、Facebook,你发一个日志,自动通知好友,其实就是在增长日志时作一个后触发,再向通知表中写入条目。由于触发器效率高。而UCH没有用触发器,效率和数据处理能力都很低。
存储过程的实验步骤:
mysql> delimiter |
mysql> create procedure insertArticle_Procedure (pTitle varchar(50),pBid int,out
pId int)
-> begin
-> insert into article1value(null,pTitle,pBid);
-> select max(id) into pId fromarticle1;
-> end;
-> |
Query OK, 0 rows affected (0.05sec)
mysql> callinsertArticle_Procedure('传智播客',1,@pid);
-> |
Query OK, 0 rows affected (0.00sec)
mysql> delimiter ;
mysql> select @pid;
@pid |
3 |
1 row in set (0.00 sec)
mysql> select * fromarticle1;
id |
Title |
bid |
1 |
Test |
1 |
2 |
chuanzhiboke |
1 |
3 |
传智播客 |
1 |
3 rows in set (0.00 sec)
触发器的实验步骤:
create table board1(id intprimary key auto_increment,name varchar(50),ar
ticleCount int);
create table article1(id intprimary key auto_increment,title varchar(50)
,bid int referencesboard1(id));
delimiter |
create triggerinsertArticle_Trigger after insert on article1 for each ro
w begin
-> update board1 setarticleCount=articleCount+1 where id= NEW.bid;
-> end;
-> |
delimiter ;
insert into board1 value(null,'test',0);
insert into article1value(null,'test',1);
还有,每插入一个帖子,都但愿将版面表中的最后发帖时间,帖子总数字段进行同步更新,用触发器作效率就很高。下次课设计这样一个案例,写触发器时,对于最后发帖时间可能须要用declare方式声明一个变量,或者是用NEW.posttime来生成。
第一范式(1NF):字段具备原子性,不可再分。全部关系型数据库系统都知足第一范式。
数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须做为一个总体,没法区分哪部分是姓,哪部分是名,若是要区分出姓和名,必须设计成两个独立的字段。
第二范式(2NF):在第一范式(1NF)的基础上创建起来的,即知足第二范式(2NF)必须先知足第一范式(1NF)。
要求数据库表中的每一个实例或行必须能够被惟一地区分。一般须要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键。
第二范式(2NF)要求实体的属性彻底依赖于主关键字。所谓彻底依赖是指不能存在仅依赖主关键字一部分的属性,若是存在,那么这个属性和主关键字的这一部分应该分离出来造成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分一般须要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
第三范式的要求以下:
知足第三范式(3NF)必须先知足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
因此第三范式具备以下特征:
1,每一列只有一个值
2,每一行都能区分。
3,每个表都不包含其余表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的id,而不能出现发帖人的id,还同时出现发帖人姓名,不然,只要出现同一发帖人id的全部记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。
1. 程序优化,用PrepareedStatement进行增删改查
2. 程序优化,尽可能批量处理,避免逐条处理,减少IO数
3. 查询结果不要用*来查询全部字段,要明确指明结果字段
4. 减小多表链接数,尽可能少的表进行链接
5. 表链接时,尽可能用主键进行链接或用惟一索引
6. 表的查询多时,必定创建索引
7. 根据查询条件,创建索引,若是查询条件不止一个时,使用组合索引
8. 在查询条件表达式的左侧尽可能不要使用函数,不然索引失效
9. 若是不得不用函数,则创建函数索引
10. 使用合适的索引,例如时间索引、哈希索引、聚簇索引
11. 若是有like话,尽可能避免%xxx%两侧都有%的条件,单侧%能够使用索引,多侧不能够
12. 尽可能不用数据库,使用缓存
13. 能够考虑用nosql数据库提升效率
14. SQL的条件表达式,在Oracle中,是按倒序使用索引的
15. 若是用DDL改动了数据库表字段,须要重建索引,否则索引失效
16. SQL尽可能不要有多余的空格和换行
17.使用分布式数据库
18. 合理建立表分区表空间
19.创建索引时字段不能有null值
20.使用数据库链接池
union和union all都是合并结果集
区别是:
1. union去除两个结果集的重复记录,union all不去除重复记录,是两个结果集的加和
2. union效率低,union all效率高
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
答案:
A:select distinct name from score where name not in (select distinct name from score where fenshu <=80)
B:select distinct name t1 from score where 80< all (select fenshu from score where name=t1);
一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,如今四个球对进行比赛,用一条sql语句显示全部可能的比赛组合.
select a.name, b.name
from team a, team b
where a.name > b.name
文章表:article_id, title, post_user, post_date
回复表:reply_id, article_id, reply_time, content
select
a.title, a.post_user, r.reply_time
from reply r
left join article a on a.article_id = r.article_id
where
r.reply_id =
(
select max(re.reply_id)
from reply re
where
re.article_id = r.article_id
)
学生表(student)以下:
id号 学号 姓名 课程编号 课程名称 分数
id sid name cno cname score
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
A: delete from student where id not in(select min(id) from student group by sid, name, cno, cname, score)
select max(post_count), b.post_user_id, u.name
from
(
select count(*) as post_count, a.post_user_id
from article a
group by a.post_user_id
) b
left join user u on u.user_id = b.post_user_id。
方案一:update user set score=0;
方案二:假设上面的代码要执行好长时间,超出咱们的容忍范围,使用alter table:
drop columnscore;alter table user add column score int。
在Oracle中,动了表结构,索引失效
方案三:使用Java程序,for循环,效率最差
方案四:使用存储过程loop循环,效率其次差
1. Class.forName(driver)
2. ClassLoader.loadClass(driver)
3. new XXXDriver();
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///test";
Connection cn = DriverManager.getConnection(url, "root", "root");
String sql = "{call insert_student(?,?,?)}";
CallableStatement cstmt = cn.prepareCall(sql);
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.setString(1, "wangwu");
cstmt.setInt(2, 25);
cstmt.execute();
// get第几个,不一样的数据库不同,建议不写
System.out.println(cstmt.getString(3));
一个sql命令在数据库执行的步骤为:语法检查,语义分析,编译成内部指令,缓存指令,执行指令等过程。
1. PrepareStatement第一次执行某SQL时能够把最终结果缓存到数据中,之后再执行同一格式的SQL时,再也不进行优化,直接使用缓存中的优化结果,效率比较高。
2.参数传值,能够防止SQL注入
答:按参数中指定的字符串形式的类名去搜索并加载相应的类,若是该类字节码已经被加载过,则返回表明该字节码的Class实例对象,不然,按类加载器的委托机制去搜索和加载该类,若是全部的类加载器都没法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就能够使用Class字节码的newInstance方法去建立该类的实例对象了。
有时候,咱们程序中全部使用的具体类名在设计时(即开发时)没法肯定,只有程序运行时才能肯定,这时候就须要使用Class.forName去动态加载该类,这个类名一般是在配置文件中配置的,例如,spring的ioc中每次依赖注入的具体类就是这样配置的,jdbc的驱动类名一般也是经过配置文件来配置的,以便在产品交付使用后不用修改源程序就能够更换驱动类名。
查询结果集若是记录数比较多时,服务器内存和浏览器内存均可能溢出,另外,数据量太大客户端的性能会下降,滚动条较小,操做也不方便,须要数据库分页查询。
SQL Server分页:
select top #pageSize# * from students where id not in
(select top #pageSize# * (#pageNumber#-1) id from students order by id) order by id
My SQL分页:
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#
) as t
where t.rid>#pageSize#*(#pageNumber#-1)
J2EE服务器启动时会创建必定数量的池链接,并一直维持很多于此数目的池链接。客户端程序须要链接时,池驱动程序会返回一个未使用的池链接并将其表记为忙。若是当前没有空闲链接,池驱动程序就新建必定数量的链接,新建链接的数量有配置参数决定。当使用的池链接调用完成后,池驱动程序将此链接标记为空闲,其余调用就能够使用这个链接。
实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关链接,而是把它代理的Connection对象还回到链接池中。
ORM是对象和关系型数据库映射,是把Java中的JavaBean对象和数据库表进行映射,使数据库表中的记录和JavaBean对象一一对应,从而大大简化原来直接使用JDBC时,手工拼写SQL带来的不便。
ORM经过配置文件,使数据库表和JavaBean类对应起来,提供简便的操做方法,增、删、改、查记录,再也不拼写字符串生成SQL,编程效率大大提升,同时减小程序出错机率,加强数据库的移植性,方便测试。可是原生的JDBC具备更强的灵活性,适合复杂多变的SQL应用。
经常使用的ORM框架有:Hibernate、MyBatis、TopLink、OJB
1. 大数据能够采用分布式数据库和创建分区表(PARTITION)
2. 创建有效索引:主键索引、联合索引、倒序索引、函数索引(INDEX)
3. 使用物化视图(MATERIALIZED VIEW)
4. 使用存储过程(PROCDUDER)
5. 读写分离(golden gate软件实现)
6. 归档旧数据(新旧数据查询,保证新数据的效率提升),程序作调整,旧数据和新数据查询页面分离
答:事务就是被绑定在一块儿做为一个逻辑工做单元的SQL语句分组,若是任何一个语句操做失败那么整个操做就被失败,之后操做就会回滚到操做前状态,或者是上有个节点。为了确保要么执行,要么不执行,就能够使用事务。要将有组语句做为事务考虑,就须要经过ACID测试,即原子性,一致性,隔离性和持久性。
锁:在因此的DBMS中,锁是实现事务的关键,锁能够保证事务的完整性和并发性。与现实生活中锁同样,它能够使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。固然锁还分级别的。
我是这样作的,尽量使用约束,如check,主键,外键,非空字段等来约束,这样作效率最高,也最方便。其次是使用触发器,这种方法能够保证,不管什么业务系统访问数据库均可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样作麻烦,编程复杂,效率低下。
答:通常咱们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等建立对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,不然就说该内存就不能被使用,咱们就说该内存被泄漏了。
操做的命令:
Sqlplus 登录用户
Conn 链接数据库
Disconn 断开数据库链接
Exit或quit退出sql*plus
Pass 修改用户口令
Show user 查看当前用户
List 列出sql缓冲区的内容
Run或/ 执行缓冲区中的全部内容
Save 文件名 把缓冲区的内容保存到sql脚本文件
Get 文件名 将sql脚本文件中的内容加载到缓冲区
Start或@文件名 将指定sql脚本文件加载到缓冲区并执行
Edit 编辑缓冲区或sql脚本文件的内容
Spool 文件名 把sql*plus中的输入结果复制到指定文件中
Spool off 中止sql*plus中的输出结果复制,并关闭文件
Help 命令名 查看某个命令的详细帮助信息。
36, 索引的优缺点
优势:
1 经过建立惟一性索引,能够保证数据库表中每一行数据的惟一性
2 能够大大加快数据的检索速度,这也是建立索引的最主要的缘由
3 能够加速表和表之间的链接,
4 在使用分组和排序子句进行数据检索时,一样能够减小查询中分组和排序的时间。
缺点:
1 下降了dml操做的速度
2 建立索引和维护索引要耗费时间,这种时间随着数据量的增长而增长
3 索引须要占据物理空间,建立索引会加大储存空间
37.使用oracle伪列删除表中重复记录:?
Delete table t where t.rowid!=(select max(t1.rowid) from table t1 where t1.name=t.name)
答:有DOM,SAX,STAX等
DOM:处理大型文件时其性能降低的很是厉害。这个问题是由DOM的树结构所形成的,这种结构占用的内存较多,并且DOM必须在解析文件以前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不须要一次所有装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户经过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX:Streaming API for XML (StAX)
讲解这些区别是不须要特别去比较,就像说传智播客与其余培训机构的区别时,咱们只需说清楚传智播客有什么特色和优势就好了,这就已经间接回答了彼此的区别。
答:用到了数据存贮,信息配置两方面。在作数据交换平台时,将不能数据源的数据组装成XML文件,而后将XML文件压缩打包加密后经过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在作软件配置时,利用XML能够很方便的进行,软件的各类配置参数都存贮在XML文件中。
a: 两种形式 dtd schema,b:本质区别:schema自己是xml的,能够被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等
DOM:处理大型文件时其性能降低的很是厉害。这个问题是由DOM的树结构所形成的,这种结构占用的内存较多,并且DOM必须在解析文件以前把整个文档装入内存,适合对XML的随机访问
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不须要一次所有装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户经过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX:Streaming API forXML (StAX)
1. struts是一个按MVC模式设计的Web层框架,实质是一个强大的Servlet。负责处理请求转发和路由。
2. struts的基本配置文件为struts-config.xml,里面配置了不少Action、ActionForm及中转规则,这个文件经过web.xml中的ActionServlet进行加载和初始化。
3. 当用户请求发送到服务器端时,ActionServlet会接收到此请求,而后根据struts.xml中的配置找到相应的Action,同时根据ActionForm的配置,建立ActionForm的实例并进行赋值,当作参数交给Action进行业务处理,返回ActionMapping对象。
4. ActionServlet根据struts.xml中action的配置,forward到指定的页面,把结果以JSP处理过的HTML返回给客户的浏览器。
5.能够继续谈一谈struts1和struts2的区别
二、Struts优缺点
优势:
1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
2.有丰富的tag能够用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提升开发效率
3. 页面导航
使系统的脉络更加清晰。经过一个配置文件,便可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤为是当另外一批开发者接手这个项目时,这种优点体现得更加明显。
4. 提供Exception处理机制 .
5. 数据库连接池管理
6. 支持I18N
缺点
1、转到展现层时,须要配置forward,若是有十个展现层的jsp,须要配置十次struts,并且还不包括有时候目录、文件变动,须要从新修改forward,注意,每次修改配置以后,要求从新部署整个项目,而tomcate这样的服务器,还必须从新启动服务器
2、Struts的Action必需是thread-safe方式,它仅仅容许一个实例去处理全部的请求。因此action用到的全部的资源都必需统一同步,这个就引发了线程安全的问题。
3、测试不方便. Struts的每一个Action都同Web层耦合在一块儿,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具Struts TestCase能够实现它的单元测试。
4、类型的转换. Struts的FormBean把全部的数据都做为String类型,它能够使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,并且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是很是困难的。
5、对Servlet的依赖性过强. Struts处理Action时必须要依赖ServletRequest和ServletResponse,全部它摆脱不了Servlet容器。
6、前端表达式语言方面.Struts集成了JSTL,因此它主要使用JSTL的表达式语言来获取数据。但是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。
7、对Action执行的控制困难. Struts建立一个Action,若是想控制它的执行顺序将会很是困难。甚至你要从新去写Servlet来实现你的这个功能需求。
8、对Action执行前和后的处理. Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操做。
9、对事件支持不够.在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件。
Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有以下的主要功能:一.包含一个controller servlet,能将用户的请求发送到相应的Action对象。二.JSP自由tag库,而且在controller servlet中提供关联支持,帮助开发员建立交互式表单应用。三.提供了一系列实用对象:XML处理、经过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息
它是ORM思想的一个实现,对JDBC进行了很好的封装,它经过配置使JavaBean对象和数据库表之间进行映射,并提供对增、删、改、查便利的操做方法,同时支持事务处理,它对数据库记录还提供了缓存机制,提升效率,它能够使程序员不用书写SQL,也不用关心数据库SQL之间的差别,它经过方言对数据库进行了很好的适配。
1. Hiberante的主配置文件为hibernate.cfg.xml,其中定义了数据源、链接池、缓存、事务、表生成策略等配置
2. 经过*.hbm.xml映射配置文件,定义了JavaBean对象和数据库表之间的映射关系,还定了对象和对象之间的映射关系,包括:一对1、多对1、一对多、多对多
3. 对于复杂查询和修改,Hiberante提供了Query对象进行支持,它能够使用HQL语句处理查询、修改、删除和分页。若是须要处理针对数据库相关的SQL,能够SQLQuery对象处理。
4. Hibernate能够集成到Spring中,经过Spring进行事务处理,事务的配置一般分两类,一种是AOP方式,一种是注释方式的声明式事务。
5. Hiberante从3版本后,支持JPA规范,能够不使用映射文件配置,而所有采用JPA注解方式进行对象和数据库表的映射,Hibernate还扩容了JPA规范。
6. Hibernate对经常使用的缓存技术作了封装,能够轻松的调用各类缓存框架
Spring实质上讲就是一个Bean工厂,主要用来管理Bean的生命周期和框架集成。
Spring分为两个部分:
1. IOC控制反转(也叫DI依赖注入,此名由Mardin Fowler给出)。Spring的顶层容器为BeanFactory,经常使用的ApplicationContext为它的子接口,实现了工厂模式。Spring须要加载它的配置文件,一般配置文件名为applicationContext.xml或spring-config.xml,其中Bean的定义为<bean id=”beanId” class=”xxx.class” />
2. Spring容器负责根据配置文件建立Bean对象并进行对其的装载。Bean有懒加载,属性配置,自动装载,parent Bean,abstract Bean,FactoryBean(一般用于框架集成,须要了解BeanFactory和FactoryBean的区别),scope(singleton单例,prototype多例)。
3. Spring 2.5后提供了对注释的支持,更加方便,在重构时做用巨大。
4. Spring的IOC解除了模块间的耦合,能够使项目多模块并行开发。
5. Spring还提供了AOP的支持,方便在切面级开发,例如事务控制、日志、性能、安全等。Spring的AOP有两种配置方式,都是经过动态代理技术实现的,一种是JDK自带的Proxy类的实现,一种是CGLIB动态代理实现,经过<aop:aspect target-class-proxy=”true” />开关进行设置。
6. Spring的重要作用是集成其它框架。Spring官方提供了许多类库对其它框架进行了封装,例如经过的事务模块、JMS框架的调用模块、Email支持、调试器Scheduler、JNDI等,同时其它框架也提供了针对Spring的集成包,例如Hibernate、MyBatis、Struts等
。
如下是Spring 框架的基本模块:
这是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是任何以spring为基础的应用的核心。Spring 框架创建在此模块之上,它使Spring成为一个容器。
hibernate的inverse属性的做用?
解决方案一,按照Object[]数据取出数据,而后本身组bean
解决方案二,对每一个表的bean写构造函数,好比表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2
field2) ,而后在hql里面就能够直接生成这个bean了。
解决方案一,按照Object[]数据取出数据,而后本身组bean
解决方案二,对每一个表的bean写构造函数,好比表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2
field2) ,而后在hql里面就能够直接生成这个bean了。
解决方案一,按照Object[]数据取出数据,而后本身组bean
解决方案二,对每一个表的bean写构造函数,好比表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2
field2) ,而后在hql里面就能够直接生成这个bean了。
解决方案一,按照Object[]数据取出数据,而后本身组bean
解决方案二,对每一个表的bean写构造函数,好比表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2
field2) ,而后在hql里面就能够直接生成这个bean了。
按照如下思路来回答:(1)首先说清楚什么是缓存,(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为何还要有二级缓存,(3)最后再说如何配置Hibernate的二级缓存。
(1)缓存就是把之前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构一般是或相似Hashmap,当之后要使用某个对象时,先查询缓存中是否有这个对象,若是有则使用缓存中的对象,若是没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:
引出hibernate的第二级缓存,用下面的伪代码分析了Cache的实现原理
Dao
{
hashmap map = newmap();
User getUser(integerid)
{
User user =map.get(id)
if(user ==null)
{
user =session.get(id);
map.put(id,user);
}
return user;
}
}
Dao
{
Cache cache = null
setCache(Cachecache)
{
this.cache =cache
}
User getUser(int id)
{
if(cache!=null)
{
Useruser = cache.get(id);
if(user==null)
{
user= session.get(id);
cache.put(id,user);
}
returnuser;
}
returnsession.get(id);
}
}
(2)Hibernate的Session就是一种缓存,咱们一般将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从本身内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在本身内部。因为Session表明一次会话过程,一个Session与一个数据库链接相关连,因此Session最好不要长时间保持打开,一般仅用于一个事务当中,在事务结束时就应关闭。而且Session是线程不安全的,被多个线程共享时容易出现问题。一般只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,所以,Hibernate的Session这一级缓存的缓存做用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务均可以共享这个缓存。咱们但愿的是一我的使用过,其余人也能够使用,session没有这种效果。
(3)二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一个厂家的缓存产品,接着须要配置该缓存产品本身的配置文件,最后要配置Hibernate中的哪些实体对象要归入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。扩展知识:一个SessionFactory能够关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate的二级缓存后,注意不要有其余的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。
JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,所以对开发人员来讲,存储数据对象彻底不须要额外的代码(如JDBC API的使用)。这些繁琐的例行工做已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,由于它能够在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,好比关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试再也不须要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。
依赖注入,是IOC的一个方面,是个一般的概念,它有多种解释。这概念是说你不用建立对象,而只须要描述它如何被建立。你不在代码里直接组装你的组件和服务,可是要在配置文件里描述哪些组件须要哪些服务,以后一个容器(IOC容器)负责把他们组装起来。
你两种依赖方式均可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。
Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,Hibernate or JDO 结合使用。这使咱们能够方便切换持久层。编码时也不用担忧会捕获每种技术特有的异常。
面向切面的编程,或AOP, 是一种编程技术,容许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。
AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。好比,一个日志模块能够被称做日志的AOP切面。根据需求的不一样,一个应用程序能够有若干切面。在Spring AOP中,切面经过带有@Aspect注解的类实现。
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个咱们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,好比日志,安全和数据传输,几乎应用的每一个模块都须要的功能。所以这些都属于横切关注点。
链接点表明一个应用程序的某个位置,在这个位置咱们能够插入一个AOP切面,它其实是个应用程序执行Spring AOP的位置。
通知是个在方法执行前或执行后要作的动做,其实是程序执行时要经过SpringAOP框架触发的代码段。
Spring切面能够应用五种类型的通知:
经过Jackson框架就能够把Java里面的对象直接转化成Js能够识别的Json对象
具体步骤以下
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面能够直接返回Object,List等,但方法前面要加上@ResponseBody注解
要加上@ResponseBody注解
有两种写法,一种是实现接口,另一种是继承适配器类,而后在SpringMvc的配置文件中配置拦截器便可:
<!--配置SpringMvc的拦截器 -->
<mvc:interceptors>
<!--配置一个拦截器的Bean就能够了 默认是对全部请求都拦截 -->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>
<!--只针对部分请求拦截 -->
<mvc:interceptor>
<mvc:mapping path="/modelMap.do" />
<bean class="com.et.action.MyHandlerInterceptorAdapter" />
</mvc:interceptor>
</mvc:interceptors>
系统启动的时候根据配置文件建立spring的容器, 首先是发送http请求到核心控制器disPatherServlet,spring容器经过映射器去寻找业务控制器,
使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,数据放在model中,用map传递数据进行页面显示。
Spring框架支持如下五种bean的做用域:
缺省的Spring bean 的做用域是Singleton.
不,Spring框架中的单例bean不是线程安全的。
有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。
The bean 标签有两个重要的属性(init-method和destroy-method)。用它们你能够本身定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。
基于Java的配置,容许你在少许的Java注解的帮助下,进行你的大部分Spring配置而非经过XML文件。
以@Configuration 注解为例,它用来标记类能够当作一个bean的定义,被Spring IOC容器使用。另外一个例子是@Bean注解,它表示此方法将要返回一个对象,做为一个bean注册进Spring应用上下文。
相对于XML文件,注解型的配置依赖于经过字节码元数据装配组件,而非尖括号的声明。
开发者经过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。
注解装配在默认状况下是不开启的,为了使用注解装配,咱们必须在Spring配置文件中配置 <context:annotation-config/>元素。
在Spring中有两种方式访问Hibernate:
Spring支持如下ORM:
用Spring的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:
Spring支持两种类型的事务管理:
控制器提供一个访问应用程序的行为,此行为一般经过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个很是抽象的方式实现了一个控制层,容许用户建立多种用途的控制器。
SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter
是单例模式,因此在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段
通常用@Conntroller注解,表示是表现层,不能用别的注解代替.
能够在@RequestMapping注解里面加上method=RequestMethod.GET
能够在@RequestMapping注解里面加上params="type=test"
返回值能够有不少类型,有String, ModelAndView,当通常用String比较好
在返回值前面加"forward:"就可让结果转发,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可让返回值重定向,譬如"redirect:http://www.baidu.com"
经过ModelMap对象,能够在这个对象里面用put方法,把对象加到里面,前台就能够经过el表达式拿到
叫ModelAndView
能够在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
要加上@ResponseBody注解
系统启动的时候根据配置文件建立spring的容器, 首先是发送http请求到核心控制器disPatherServlet,spring容器经过映射器去寻找业务控制器,
使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,数据放在model中,用map传递数据进行页面显示。
* Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
* Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并无存在与内存中,当程序真正对数据的操做时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提升了服务器的性能。
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体如今表与表之间的关系进行操做,它们都市对对象进行操做,咱们程序中把全部的表与类都映射在一块儿,它们经过配置文件中的many-to-one、one-to-many、many-to-many、
说下Hibernate的缓存机制
* 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
* 二级缓存:
a)应用及缓存
b)分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据
c) 第三方缓存的实现
Hibernate的查询方式
Sql、Criteria,object comptosition
Hql:
* 属性查询
* 参数查询、命名参数查询
* 关联查询
* 分页查询
* 统计函数
* 使用双向一对多关联,不使用单向一对多
* 灵活使用单向一对多关联
* 不用一对一,用多对一取代
* 配置对象缓存,不使用集合缓存
* 一对多集合使用Bag,多对多集合使用Set
* 继承类使用显式多态
* 表字段要少,表关联不要怕多,有二级缓存撑腰
1.建索引
2.减小表之间的关联
3.优化sql,尽可能让sql很快定位数据,不要让sql作全表查询,应该走索引,把数据量大的表排在前面
4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽可能返回少许数据
1) assigned
主键由外部程序负责生成,无需Hibernate参与。
2) hilo
经过hi/lo 算法实现的主键生成机制,须要额外的数据库表保存主键生成历史状态。
3) seqhilo
与hilo 相似,经过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,以后每次须要生成主键的时候将此值加1做为主键。这种方式可能产生的问题是:若是当前有多个实例访问同一个数据库,那么因为各个实例各自维护主键状态,不一样实例可能生成一样的主键,从而形成主键重复异常。所以,若是同一数据库有多个实例访问,此方式必须避免使用。
5) identity
采用数据库提供的主键生成机制。如DB二、SQL Server、MySQL中的主键生成机制。
6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。
7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种做为主键生成方式。
8) uuid.hex
由Hibernate基于128 位惟一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)做为主键。
9) uuid.string
与uuid.hex 相似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
10) foreign
使用外部表的字段做为主键。通常而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。
a.有接口绑定,包括注解绑定sql和xml绑定Sql ,b.动态sql由原来的节点配置变成OGNL表达式,c. 在一对一,一对多的时候引进了association,在一对多的时候引入了collection节点,不过都是在resultMap里面配置
接口映射就是在IBatis中任意定义接口,而后把接口里面的方法和SQL语句绑定,咱们直接调用接口方法就能够,这样比起原来了SqlSession提供的方法咱们能够有更加灵活的选择和设置.
接口绑定有两种实现方式,一种是经过注解绑定,就是在接口的方法上面加上@Select @Update等注解里面包含Sql语句来绑定,另一种就是经过xml里面写SQL来绑定,在这种状况下,要指定xml映射文件里面的namespace必须为接口的全路径名.
当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定,通常用xml绑定的比较多
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,经过在resultMap里面配置association节点配置一对一的类就能够完成;嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另一个表里面查询数据,也是经过association配置,但另一个表的查询经过select属性配置
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,经过在resultMap里面配置collection节点配置一对多的类就能够完成;嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另一个表里面查询数据,也是经过配置collection,但另一个表的查询经过select节点配置
MyBatis里面的动态Sql通常是经过if节点来实现,经过OGNL语法来实现,可是若是要写的完整,必须配合where,trim节点,where节点是判断包含节点有内容就插入where,不然不插入,trim节点是用来判断若是动态语句是以and 或or开始,那么会自动把这个and或者or取掉
MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的,使用二级缓存属性类须要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>
总共23种,分为三大类:建立型,结构型,行为型
我只记得其中经常使用的六、7种,分别是:
建立型(工厂、工厂方法、抽象工厂、单例)
结构型(包装、适配器,组合,代理)
行为(观察者,模版,策略)
而后再针对你熟悉的模式谈谈你的理解便可。
Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
每一个模式都描述了一个在咱们的环境中不断出现的问题,而后描述了该问题的解决方案的核心。经过这种方式,你能够无数次地使用那些已有的解决方案,无需在重复相同的工做。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。
setAttribute("name",Object obj):设置名字为name的request参数的值,该值是由Object类型的obj指定
getAttribute("name"):返回name属性值
getAttributeNames():返回全部可用属性名的枚举
invalidate():使当前会话失效
setMaxInactiveInterval():指定在Servlet容器使此会话失效以前客户端请求之间的时间间隔,以秒为单位。负数时间指示会话永远不会超时
getMaxInactivelnterval():返回servlet 容器在客户端访问之间将使此会话保持打开状态的最大时间间隔,以秒为单位。在此间隔以后,servlet 容器将使会话无效
print():打印信息
println():换行打印信息
getInitParameter(String paramNarne):从web.xml中获取指定名称的值
getInitParameterNames():从web.xml中获取全部的名称
Exception:针对错误网页,未捕捉的例外
getMessage():返回异常的详细信息
getClass():返回异常的名称
应用服务器:Weblogic、Tomcat、Jboss
WEB SERVER:IIS、 Apache
BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i ApplicationServer,jBoss,Tomcat
答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese applicationmodel).在这样的一个应用系统中,可按照功能划分为不一样的组件,这些组件又可在不一样计算机上,而且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。
一个另类的回答:j2ee就是增删改查。
(这个问题不做具体回答,列出来只是告诉读者可能会遇到什么问题,你不须要面面俱到,什么都精通。)
在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增长set MEM_ARGS=-Xms32m-Xmx200m,能够调整最小内存为32M,最大200M
能够在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增长setPRODUCTION_MODE=true。
修改服务启动文件,增长 WLS_USER和WLS_PW项。也能够在boot.properties文件中增长加密过的用户名和密码.
保存在此Domain的config.xml文件中,它是服务器的核心配置文件。
不一样类型的EJB涉及的配置文件不一样,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean通常还须要weblogic-cmp-rdbms-jar.xml
缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,须要配置服务器使用Enable SSL,配置其端口,在产品模式下须要从CA获取私有密钥和数字证书,建立identity和trust keystore,装载得到的密钥和数字证书。能够配置此SSL链接是单向仍是双向的。
4,Activiti工做流学习-----基于5.19.0版本(4):http://www.cnblogs.com/liujie037/p/5790698.html
5,Java关于IO流的介绍:http://www.cnblogs.com/crshuai/p/5789648.html
6,MVC权限管理的实现流程:http://www.cnblogs.com/xinxiaoai/p/5801995.html
7,批量数据上传的sql.xml:http://www.cnblogs.com/Asions/p/5801200.html
8, struts—文件的上传和下载: http://www.cnblogs.com/xiangkejin/p/5801032.html
9, Shiro系统权限管理、及原理剖析:http://blog.csdn.net/helloworldwt/article/details/51759224
10, Shiro学习--与SpringMVC整合(数据库,Shiro注解和Shiro标签): http://blog.csdn.net/frankcheng5143/article/details/50836619
http://blog.csdn.net/defonds/article/details/48716161
软件下载
服务器和客户端安装
创建版本库(Repository)
配置用户和权限
运行独立服务器
初始化导入
基本客户端操做
1,软件下载
下载Subversion服务器程序。
到官方网站的下载二进制安装文件,来到二进制包下载部分,找到 Windows NT, 2000, XP and 2003部分,而后选择" this directory ",这样咱们能够看到许多下载的内容,目前能够下载 svn-1.4.0-setup.exe 。
下载Subversion的Windows客户端TortoiseSVN。
TortoiseSVN是扩展Windows Shell的一套工具,能够看做Windows资源管理器的插件,安装以后Windows就能够识别Subversion的工做目录。
官方网站是TortoiseSVN ,下载方式和前面的svn服务器相似,在Download页面的咱们能够选择下载的版本,目前的最高稳定版本的安装文件为TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi。
2,服务器和客户端安装
服务器安装,直接运行svn-1.4.0-setup.exe ,根据提示安装便可,这样咱们就有了一套服务器能够运行的环境。
安装TortoiseSVN,一样直接运行TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi按照提示安装便可,不过最后完成后会提示是否重启,其实重启只是使svn工做拷贝在windows中的特殊样式生效,与全部的实际功能无关,这里为了马上看到好的效果,仍是从新启动机器。
3,创建版本库(Repository)
运行Subversion服务器须要首先要创建一个版本库(Repository),能够看做服务器上存放数据的数据库,在安装了Subversion服务器以后,能够直接运行,如:
svnadmin create E:/svndemo/repository
就会在目录E:/svndemo/repository下建立一个版本库。
咱们也能够使用TortoiseSVN图形化的完成这一步:
在目录E:/svndemo/repository下"右键->TortoiseSVN->Create Repository here...“, 而后能够选择版本库模式, 这里使用默认便可, 而后就建立了一系列目录和文件。
4,配置用户和权限
来到E:/svndemo/repository/conf目录,修改svnserve.conf:
# [general]
# password-db = passwd
改成:
[general]
password-db = passwd 而后修改同目录的passwd文件,去掉下面三行的注释:
# [users]
# harry = harryssecret
# sally = sallyssecret
最后变成:
[users]
harry = harryssecret
sally = sallyssecret
在这里,由于通常来讲,项目的svn的用户名和密码是统一认证的,而为了避免每次都输入密码,因此在使用TortoiseSVN的时候,直接都记住了密码,这里的用户名和密码最好和项目的一致,以避免出现意外状况。
5,运行独立服务器
在任意目录下运行:
svnserve -d -r E:/svndemo/repository 咱们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve中止。
在使用中发现,即便关闭了此窗口,svn同样好使~~不知道为啥~
6,初始化导入
来到咱们想要导入的项目根目录,在这个例子里是E:/svndemo/initproject,目录下有一个readme.txt文件:
右键->TortoiseSVN->Import...
URL of repository输入“svn://localhost/”
ok
完成以后目录没有任何变化,若是没有报错,数据就已经所有导入到了咱们刚才定义的版本库中。
须要注意的是,这一步操做能够彻底在另外一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/”。
在这里,不知道为何,使用svn://localhost/ 一直都搞不定,最后灵机一动使用了file:///E:/svndemo/repository/ 反而搞定了~~
7,基本客户端操做
取出版本库到一个工做拷贝:
来到任意空目录下,在本例中是E:/svndemo/wc1,运行右键->Checkout,在URL of repository中输入svn://localhost/,这样咱们就获得了一份工做拷贝。
在工做拷贝中做出修改并提交:
打开readme.txt,做出修改,而后右键->Commit...,这样咱们就把修改提交到了版本库,咱们能够运行。
察看所做的修改:
readme.txt上右键->TortoiseSVN->Show Log,这样咱们就能够看到咱们对这个文件全部的提交。在版本1上右键->Compare with working copy,咱们能够比较工做拷贝的文件和版本1的区别。
pwd命令:显示当前的目录
git init:把当前目录变成git能够管理的仓库
git diff 文件名:查看修改了什么内容
git log:查看commit历史,包括时间、做者、版本号、commit备注
git log --pretty=oneline:查看commit历史,只显示时间和commit备注
git reset --hard 版本号:指定往前或日后穿越到任意一个版本,版本号经过git reflog查看
git reflog:查看版本操做历史,显示缩略版本号、commit备注
git checkout ./-- 不带引号的文件名:撤销工做区修改。若是存在add但没有commit的内容,则回到add后的状态,删除没有add的修改;若是没有add的内容,则回到最近一次commit完的状态
git checkout -- 文件名:在commit以前执行,可恢复删除的文件
cat 文件名:查看文件内容
git branch:查看当前全部分支,当前所在的分支前面加*
git branch 分支名:建立新分支,但不切换过去,若是当前已存在该分支则报错
git checkout 分支名:切换到指定分支,若是该分支不存在则报错
git checkout -b 分支名:建立新分支并切换到该分支,至关于上面两条命令前后执行,若是分支已存在则报错,并不会切换过去
git branch -d 分支名:删除指定分支,必须在本分支上删除当前所在的分支,必须在其余分支上删除
git merge 分支名:使当前所在分支内容和merge后面指定的分支内容一致,也就是修改当前所在的分支,接着删除merge后指定的分支也能够
git remote (-v):查看远程库信息,加上-v查看详细信息
命令退不出来,按ctrl+C
输入前面输过的命令,按PgUp/PgDn
http://www.cnblogs.com/tugenhua0707/p/4050072.html git使用教程详解
1. JVM参数调优:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。这两个值的大小通常根据须要进行设置。当应用程序须要的内存超出堆的最大值时虚拟机就会提示内存溢出,而且致使应用服务崩溃。所以通常建议堆的最大值设置为可用内存的最大值的80%。在catalina.bat中,设置JAVA_OPTS='-Xms256m -Xmx512m',表示初始化内存为256MB,能够使用的最大内存为512MB。
2. 禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者经过域名服务器查找机器名转换为IP地址。DNS查询须要占用网络,而且包括可能从不少很远的服务器或者不起做用的服务器上去获取对应的IP的过程,这样会消耗必定的时间。为了消除DNS查询对性能的影响咱们能够关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值:
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" />
Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
3. 调整线程数
经过应用程序的链接器(Connector)进行性能控制的的参数是建立的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、可以独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。
Tomcat4中能够经过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值而且是足够使用的,可是随着站点的扩容而改大这些值。minProcessors服务器启动时建立的处理请求的线程数应该足够处理一个小量的负载。也就是说,若是一天内每秒仅发生5次单击事件,而且每一个请求任务处理须要1秒钟,那么预先设置线程数为5就足够了。但在你的站点访问量较大时就须要设置更大的线程数,指定为参数maxProcessors的值。maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而致使超出了虚拟机使用内存的大小。若是要加大并发链接数,应同时加大这两个参数。web server容许的最大链接数还受制于操做系统的内核参数设置,一般Windows是2000个左右,Linux是1000个左右。
在Tomcat5对这些参数进行了调整,请看下面属性:
maxThreads Tomcat使用线程来处理接收的每一个请求。这个值表示Tomcat可建立的最大的线程数。
acceptCount 指定当全部能够使用的处理请求的线程数都被使用时,能够放处处理队列中的请求数,超过这个数的请求将不予处理。
connnectionTimeout 网络链接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。一般可设置为30000毫秒。
minSpareThreads Tomcat初始化时建立的线程数。
maxSpareThreads 一旦建立的线程超过这个值,Tomcat就会关闭再也不须要的socket线程。
最好的方式是多设置几回而且进行测试,观察响应时间和内存使用状况。在不一样的机器、操做系统或虚拟机组合的状况下可能会不一样,并且并非全部人的web站点的流量都是同样的,所以没有一刀切的方案来肯定线程数的值。
在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加:<Context path="/hello" docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot" debug="0" privileged="true">
</Context> 至于Context 节点属性,可详细见相关文档。
将web项目文件件拷贝到webapps 目录中。
很灵活,在conf目录中,新建 Catalina(注意大小写)\localhost目录,在该目录中新建一个xml文件,名字能够随意取,只要和当前文件中的文件名不重复就好了,该xml文件的内容为: <Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true">
</Context>
第3个方法有个优势,能够定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,很是有效。
第二、3还有优势,能够定义一些个性配置,如数据源的配置等。
能够用tomcat在线后台管理器,通常tomcat都打开了,直接上传war就能够。
Eclipse中tomcat service设置
选择window ----show view---services能够看到服务的面板
双击tomcat进入配置界面Service Locations(Specify the server path (i.e. catalina.base) and deploy path. Server must be published with no modules present to make changes.)选项变灰色没法更改配置。
若要更改,则先把tomcat下的全部項目移除。并右击,clean...以后方可设置。。。启动后将又变为黑色。
默认选项为:
Use workspace metadata(dose not modify Tomcat installation)
修改选项为:
Use Tomcat installation(takes control of Tomcat installation)
这样在Eclipse启动了tomcat服务器,我們也能夠访问到tomcat本地管理首页。
不然只能在DOS下使用Tomcat的启动命令才能访问Tomcat本地管理首页。
注意:Deploy path由:wtpwebapps改成webapps
tomcat默承认以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,须要调大。
Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增长以下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【能够使用的最大内存】'
须要把这个两个参数值调大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为256MB,能够使用的最大内存为512MB。
8,如何加大tomcat链接数?在tomcat配置文件server.xml中的<Connector />配置中,和链接数相关的参数有: minProcessors:最小空闲链接线程数,用于提升系统处理性能,默认值为10 maxProcessors:最大链接线程数,即:并发处理的最大请求数,默认值为75 acceptCount:容许的最大链接数,应大于等于maxProcessors,默认值为100 enableLookups:是否反查域名,取值为:true或false。为了提升处理能力,应设置为false connectionTimeout:网络链接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。一般可设置为30000毫秒。 其中和最大链接数相关的参数为maxProcessors和acceptCount。若是要加大并发链接数,应同时加大这两个参数。 web server容许的最大链接数还受制于操做系统的内核参数设置,一般Windows是2000个左右,Linux是1000个左右。tomcat5中的配置示例: <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> 对于其余端口的侦听配置,以此类推。