Java基础部分
1、冒泡排序算法
int []arr = {43,12,56,90,3,100};
for(int i = 0;i<arr.length;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int a = arr[j];
arr[j] = arr[j+1];
arr[j+1] = a;
}
}
}
2、基本数据类型
byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。
3、GC
GC是Java中的垃圾回收,Java中垃圾收集器会自动进行管理。要请求垃圾收集,也可以通过System.gc() 或Runtime.getRuntime().gc()。
4、垃圾回收算法
标记--清除:在存活对象较多时,很高效,但是会造成内存碎片。
复制:控件存活的对象较少时很高效,但需要一块内存交换空间用于移动。
标记--整理:在回收不存活的对象占用空间后,将存活对象向空闲空间移动,成本较高,但没有内存碎片。
5、堆,栈
堆:new创建的对象,不随方法结束而消失。局部变量使用final修饰后放在堆中。
栈:存储方法内部局部变量,方法结束后栈会释放,变量也会释放。
6、Collection和Collections的区别
Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
7、List和Set
ArrayList:底层为数组实现,初始长度为10,扩容规则为:扩容后的大小= 原始大小+原始大小/2 + 1,查询效率较高,插入时必须创建空间并且将其所有引用向前移动,代价较高。
LinkedList:底层为双向链表结构,没有初始大小,也不需要扩容,插入时只需要链接新的元素,不需要改变其他元素,效率较高。
TreeSet:用于维持元素的排序状态,是有序的。
HashSet:在查询和添加元素都优于TreeSet。Set中不允许有重复元素。
8、Map
HashMap:综合了数组和链表,初始大小为16,扩容因子默认0.75(当容量达到默认大小的75%时进行扩容),扩容规则为扩大一倍。基于hashing原理,将键值对传给put方法,计算hashcode,找到bucket位置存储对象,获取对象时,通过equals找到键值对。若不通键对象的hashcode相同,则它们存储在同一个bucket位置的LinkedList中,通过equals找到键值对。
TreeMap:要求Map始终保持有序才使用。底层使用红黑树。
LinkedHashMap:插入稍慢,保持插入时的顺序。
HashTable:线程安全的,每个方法都有synchronized,不常用。
ConcurrentHashMap:线程安全的Map,把Map分成若干个Segment,在put和get时,根据key.hashCode()算出在哪个segment中。
源码分析:http://blog.csdn.net/jzhf2012/article/category/1314885/1
9、线程调度相关的方法
wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常。
notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关。
notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态。
10、synchronized 和java.util.concurrent.locks.Lock
Lock 能完成synchronized所实现的所有功能;
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且最好在finally 块中释放(这是释放外部资源的最好的地方)。
11、单例模式
饿汉式单利:在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。也会有内存浪费问题。
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
懒汉式单利:在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是直接返回之前创建的对象。懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例。
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
线程安全的单例:双重检查
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
JavaWeb
1、转发(forward)和重定向(redirect)
forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。
forward更加高效,所以在满足需要时尽量使用forward(通过调用RequestDispatcher对象的forward()方法,该对象可以通过ServletRequest对象的getRequestDispatcher()方法获得),并且这样也有助于隐藏实际的链接;在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect()方法实现)。
2、get和post
get请求用来从服务器上获得资源,而post是用来向服务器提交数据。
get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URLget将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL。
3、JSP和Servlet
Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。
JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。
JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。
数据库
1、分页
Oracle:select * from (select rownum r,* from t where r<=10) where r>5
MySql:select * from t order by id limit 30,10
2、Drop,Delete,Truncate
Drop:删除数据和表结构,不需要commit,删除速度最快。
Delete:删除数据,需要commit,可以回滚,效率较低。
Truncate:删除所有数据,保留表结构,不可回滚。
3、高级查询
where:先进行条件过滤,再分组。
having:先分组,再进行过滤。
where效率较高,应优先使用,但where中不能使用分组函数(AVG,SUM,MIN,MAX)。
group by:select后面的字段group by后面也一定要有,除非放在分组函数中。
左连接:查出左边表的所有字段和右边表符合条件的字段,右表无数据,则右表字段显示为null。
右连接:查出右边表所有字段和左边表符合条件的字段,左表无数据,则左表字段显示为null。
全连接:查出所有表的字段。
内连接:查出符合条件的字段。
4、union和unionAll
unionAll:直接将子查询结果求并,不去重。
union:去重且会排序。
5、索引
索引代价:需要占硬盘空间,这是空间方面的代价;一旦插入新的数据,就需要重新建索引,这是时间上的代价
索引失效情况:
如果条件中有or,即使其中有条件带索引也不会使用。
没有where语句,不会用到索引。
like查询是以%开头,不会用到索引。
当数字型字段遇到非等值操作符时,如果对索引字段进行了某种左值操作,那么无法用到索引。
如果对索引字段进行了函数操作,那么无法用到索引。
框架
1、Spring IOC与AOP
IOC:一种编程思想,即控制反转,将对象的控制权交给Spring容器,实现对象之间的解耦。其实现方法是DI,即依赖注入。注
入的方式有:构造器依赖注入,setter方法注入。用反射实现注入。
AOP:面向切面编程,系统中各个不相关的类的方法,在这些方法中加入某种系统功能的代码,如日志、权限判断、异常处理
等。AOP采用的代理技术。
2、Spring常用注解
@Controller 将该类标注为控制层,控制层是视图层和业务层的桥梁,负责接收前台的请求,并且将后台处理数据传送给前台。
@Service 将该类标注为业务层,开发人员可以在这一层编写业务逻辑,而不需要更多的关注如何与数据库进行交互。
@Component 将该类定义类DAO层,负责与数据库进行数据交互。
@RequestMapping 匹配前台请求路径,可以标注在类之上,也可以标注在方法上面,然后类与方法进行路径拼接。
@Resource 对象的注入,可以将容器创建的对象直接注入到需要的类中。@Autowired是按照类型注入,而@Resource的装配顺序是如果指定名
称或者没有指定时,按照名称装配;如果指定类型时,按照类型装配。
@ResponseBody 这个注解很好用,是将后台需要返回的Map、list、字符串或者对象自动封装成json格式,但是后台需要引入对应的jar
包,jackson-all.jar、jackson-mapping.jar等。
@Transactional 这个注解标注方法为事务,保持操作的原子性,如果成功就提交;如果抛出异常,就回滚。但是在容器的配置文件中需要配置事
务。
3、Struts
Struts是采用JavaServlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。采用Struts能开发出基于
MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能:一.包含一个controllerservlet,能将用户的请
求发送到相应的Action对象。二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。
三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。
4、MyBatis
定义Sql标签:<select>,<insert>,<update>,<delete>。
配置对象与查询结果集:<resultMap>。
动态拼接Sql:
<if>:if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句中用来判断是否插入某个字段的值。
<foreach>:foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。
<choose>:按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。
格式化输出:
<where>
<set>
<trim>:更灵活的去处多余关键字的标签,他可以实践where和set的效果。