个人总结Java基础知识
声明:个人总结,可能会比较乱,勿喷。
阿里JAVA面试知识点:http://blog.csdn.net/u014744118/article/details/50766157
Java中finally与return执行顺序详解:http://blog.csdn.net/qj19842011/article/details/45675057
JVM方法栈的栈帧、局部变量表、操作数栈详解:http://wangwengcn.iteye.com/blog/1622195
http://www.360doc.com/content/14/0925/13/1073512_412236522.shtml
接口:成员特点:
成员变量 只能是常量。默认修饰符 public static final
成员方法 只能是抽象方法。默认修饰符 public abstract
执行顺序:静态代码块 高于 构造代码块 高于 构造函数参见:http://www.jb51.net/article/36038.htm
float:单精度类型,4个字节;
double:双精度类型,8个字节;当你不声明的时候,默认小数都用double来表示,所以如果要用float的话,则应该在其后加上f。
例如:float a = 1.3;
则会提示不能将double转化为float。
catch异常顺序:一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要放在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到…异常的错误。
异或运算符一个数和0异或还是自己,一个数和自己异或是0。
静态方法只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
this、super区别:参见http://blog.sina.com.cn/s/blog_5e8392b10100nnb6.html
0JAVA数据类型
有8中基本数据类型,3中引用数据类型,区别:
基本数据类型:使用时需要赋具体值,判断时使用“==”号;
引用数据类型:使用时可以赋null,判断时使用equals方法;
基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上;
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
参见:http://www.cnblogs.com/bluestorm/archive/2012/07/30/2615034.html
1Collection和Map
1.1提到集合不得不讲数组(array),数组和集合的精彩的描述:http://www.cnblogs.com/liyiran/p/4607817.html。
对于集合的继承体系而言,都位于java.util包下,Collection接口包含Set(集合)和List(列表)。详见:http://android.blog.51cto.com/268543/400557/
其中Set是无序,不重复的,因此,如果set存储的是自定义的类型,现实生活中只要属性相同,我们就认为那是同一个对象。但计算机使用内存地址,即哈希码,于是,就需要重写equals方法和hashCode方法需要重写hascode和equal方法来判断是否重复,详见:http://blog.csdn.net/lb_383691051/article/details/47355265
,http://blog.csdn.net/shenshen123jun/article/details/9074097
List允许重复,具体实现类有Vector,ArrayList,LinkedList。其中Vector为线程安全的
Map接口包含HashTable、HashMap、TreeMap。其中HashTable为线程安全的。
关于线程安全:synchronized、ThreadLocal、Volatile
1.线程对象的创建有2中常见的,一种是继承Thread父类,另一种是实现Runnable接口,两种方式都是通过调用start方法来启动线程,执行线程的run方法。
线程有4中状态,New新生状态,只是在内存中为线程分配了内存空间。Runnable就绪状态,是调用了start方法后的状态,此时并没有获取CPU资源。Running运行状态,即被JVM选中,获取CPU资源run方法开始被执行,直到调用其他方法而终止,或者等待某种资源而阻塞,或正常执行完而死亡。Dead死亡状态,run方法执行完毕,或中断或异常退出。讲解:http://www.cnblogs.com/DreamSea/archive/2012/01/11/JavaThread.html
2.synchronized当被用来修饰某个方法或代码块时,该方法或代码块在同一时刻只能被一个线程来执行。
当有两个并发线程同时访问一个object对象的synchronized同步代码块时,一个时间内只能有一个线程得到执行,另一个线程只能等到当前线程执行完该同步代码块后才能执行;
当一个线程访问一个object对象的synchronize同步代码块时,另一个线程可以访问该object对象的非synchronize同步代码块;
当一个线程访问object对象的一个synchronize同步代码块时,其他线程对该对象的其他synchronize同步代码块的访问将被阻塞。
讲解:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
3.volidate是一种轻量级的同步机制,保证了volidate修饰的变量对于其他线程的可见性,但并没有保证原子性,因此它的使用范围是有限的,即对volidate修饰的变量的写的操作不能依赖于该变量的当前值。可参考:http://www.cnblogs.com/adm1989/archive/2013/08/31/3293189.html
4.callable可以返回线程结果,参见:http://blog.csdn.net/ro_wsy/article/details/44566589
5.线程池,注意参数配置(核心线程数、最大线程数、空闲线程存活时间、及3种缓存队列(直接提交队列、无界队列、有界队列)),参见:http://www.cnblogs.com/exe19/p/5359885.html 和 http://www.cnblogs.com/vhua/p/5297587.html
单例模式的四种实现方式:饱汉模式,线程安全,占用内存;饿汉模式,非线程安全,节省内存;饱汉模式–线程安全,已牺牲性能来保证线程同步;最优模式,volatile和synchronized同时修饰;参见:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html
ThreadLocal为每个使用该变量的线程提供一个独立的变量副本,每个线程修改变量副本时不影响其他线程对象的变量副本。
Yield暂停当前正在执行的线程,把CPU资源让给具有同等优先级的线程,但并不保证其他线程一定能够占用CPU资源,而且该线程可能暂停后马上又被执行。
CurrentDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行讲解:http://www.importnew.com/15731.html
sleep是线程类(Thread)的应用方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
更多关于多线程并发,参见:http://blog.csdn.net/geolo/article/details/8670900
JAVA乐观锁CAS及原子类Atomic的应用场景,乐观锁的ABA问题:http://blog.csdn.net/conquer0715/article/details/12365553
http://www.importnew.com/20472.html
- 关于JAVA关键字:String、StringBuffer、StringBuilder
1.String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。
2.String不可变是因为在JDK中String类被声明为一个final类。
3.StringBuffer是线程安全的,而StringBuilder是非线程安全的。
ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌
握,可用StringBuffer,在线程不安全处加上关键字Synchronize。 - 关于Servlet生命周期
分为3个阶段:
1.servlet类加载,初始化阶段,调用init()方法;
在以下情况进行servlet的类加载:
1.1servlet容器启动时,自动加载web.xml中配置了属性的servlet
1.2servlet容器启动后,客户首次向servlet发送请求
1.3servlet类文件被更新后,重新加载servlet
servlet被加载后,servlet容器创建一个servlet实例并调用servlet的init()初始化方法进行初始化,在servlet的整个生命周
期,init()方法只被调用一次。
2.处理客户端请求阶段,调用service()方法;
3.终止阶段,调用destroy()方法;
讲解:http://sunnylocus.iteye.com/blog/342996
http://www.cnblogs.com/cuiliang/archive/2011/10/21/2220671.html
类加载机制:
1.加载:通过类的全限定名来获取该类的二进制字节流,按照虚拟机所需的格式存储在方法区,并且在堆中创建该类的class对象,作为对方法区访问的入口。(加载是通过类加载器完成的)
2.连接
–验证:对字节流进行格式、语义规范的验证。
–准备:在方法区中为静态变量分配内存并赋零值。
–解析:将常量池中的符号引用转化为直接引用的过程。
3.初始化:执行类构造器()方法的过程,按照指定的主观计划去初始化类变量和其他资源
参考:http://blog.csdn.net/ns_code/article/details/17881581
被动引用:
1.通过子类引用父类的静态变量,不会导致子类初始化
2.通过数组定义来引用类,不会触发该类的初始化
3.常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始话
类加载器
1.启动类加载器Bootstrap ClassLoader,负责加载JAVA_HOME\lib目录中的类库,虚拟机按照名称来识别(或者参数配置的路径)
2.扩展类加载器Extension ClassLoader,负责加载JAVA_HOME\lib\ext目录中的类库,虚拟机按照名称来识别(或者参数配置的路径)
3.应用类加载器Application ClassLoader,负责加载用户类路径下的类库
类加载器遵循“双亲委派机制”来进行类的加载,即如果类加载器收到了加载类的请求,它首先不会自己尝试加载这个类,而是把这个请求为派给父类加载器去完成,每一层的类加载器都是如此,因此所有的请求最终都应传送到启动类加载器中,只有当父类加载器无法完成这个类的加载时,子类才尝试自己去加载。这样做的好处是防止恶意程序。
-Spring相关
1.spring上下文配置文件需要配置scan属性,以便对应包下的Java类的spring注解生效。
2.web.xml中需要配置spring上下文配置文件applicationContext.xml的地址,以及ContextLoaderListenter类监听器,在web容器启动后该监听器自动启动,加载spring配置文件,启动spring容器。配置DispatcherServlet类,处理所有客户端请求的分发。
-Junit4单元测试
1.需要添加junit-4.x.jar类库到工程类目录中
2.通过New->Other->JUnit Test Case来创建单元测试类
3.使用@RunWith(SpringJUnit4ClassRunner.class)注解,即使用基于Junit4的Spring测试框架。@ContextConfiguration(locations={"/applicationContext.xml"})注解,启动spring容器。@Test注解来表明这是个测试方法。
4.通过Run As->JUnit Test来运行测试方法。
快排案例http://www.jb51.net/article/45899.htm
数据库事物特性
1.原子性:事务包含的所有操作要么全部成功,要么全部失败回滚
2.一致性:保证数据库只能从一个一致性状态变成另一个一致性状态,比如A、B2人相互转账,2人共5K,中间不管相互转过多少次账,总金额都不会发生变化,都是5K
3.隔离性:当多个用户并发访问数据库时,数据库为每个用户开启的事物,不能被其他事物的操作所干扰,多个并发事物之间要相互隔离
4.持久性:当事物被提交,所做的操作就被永久记录在数据库中
关于事物的隔离性
1.脏读:事物T1读取了事物T2未提交的数据
2.不可重复读:数据库中的某个数据,在一个事物范围进行了多次查询,结果却不一致。比如事物T1在读取某一数据时,事物T2立马修改并进行了提交,导致多次查询结果不一致。(跟脏读的区别是,脏读读取的是未提交的数据,不可重复读读取的是已提交的数据)
3.幻读:当事物T1对表中所有行的某个数据从1改为2,此时事物T2提交了一行数据值为1的记录,当事物T1再次查询刚修改的记录时,发现有1条记录并未修改,跟发生了幻读一样。
MySQL提供的4中事物隔离级别
1.串行化:防止脏读、不可重复读、幻读,类似于对表加锁,效率最低
2.可重复度:防止脏读、不可重复读
3.读已提交:防止脏读
4.读未提交:什么情况都可能发生
参考:http://www.cnblogs.com/fjdingsd/p/5273008.html