虚拟机
是能够识别java源文件编译后的字节码文件,并将字节码文件形成机器码,让计算机识别,因为虚拟机知道计算机底层的一些特性,帮我们将字节码变成计算机所识别的编码,所以跟平台无关,我们只关心java源文件的编写就行了。
JDK,JRE
JDK包括了JRE 和 一些工具(编译器,调试器) 来使开发者开发、编译、和运行java程序, 而JRE中有重要的 JVM(Java虚拟机)、一些运行的类库 等东西。
static变量最先加载于内存中
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
自动装箱和拆箱
就是基本类型和引用类型之间的转换,如int--integer,前者是数据,后者为对象,有对象就有方法,而数据只能是数据,并且还会有其他的一些细节,如,int类型默认值0,integer则是null,这一点在项目的数据库中的应用很有必要留意。
重载和重写
重载,仅仅方法名相同,重写,也就是继承所需要做的事情,增强代码的维护性,简洁性,和其他很多用途
接口和抽象类
interface abstract,接口中全是方法的声明,没有方法体,抽象类中可以有方法体,也可以只申明方法,还可以有成员变量。
即,认为抽象类是不严谨的接口,如可以有不是public的方法,可以有不是final的变量,可以有main函数,可以被调用。
值传递和引用传递
值传递传递的是值,引用传递传递的是地址,前者是两个,后者相当于一个,也就是引用传递的话,则一个发生改变另一个也会改变
进程线程
进程是执行着的应用程序,而线程是进程内部的一个执行序列。
线程的使用
继承Thread类,重写run方法,在run方法中写该线程要执行的任务,然后再在要执行该线程时,new出对象来,对象.start(),启动该线程
实现Runnable接口,实现其中的run方法,new出该对象A来,Thread thread = new Thread(A); 这样,thread.start(),就能启动该线程。
使用executor框架来创建线程池
线程的阻塞
等待阻塞.wait();等待被调用
同步阻塞,调用了某个带锁的方法,等待其他线程使用完该方法。
其他阻塞,. sleep().join(),等其他线程执行完毕
同步方法和同步代码块
synchronized(),线程无法中断,必须执行完毕才可把cpu丢出去,同时自然也就只能也一个线程使用被 synchronized修饰的代码或者方法,区别仅仅是一个在方法上一个在某段代码上。
死锁
两个即以上的线程在执行的时候,都需要另外一个线程手中锁住的资源才可以继续运行。
脏读
事务读取到另一个事务还没有更新的数据,解决方法也就是乐观锁和悲观锁,一个是在数据库中增加一个版本属性,每次更新都得为版本数值加一,如果有两个事务同时对数据进行修改,则会发现拿回来的数据版本号和事务修改完成后发送出去的版本号不一致,则会重新执行事务操作。另一个就是一条数据只允许同时被一个事务进行写操作。
避免死锁
强制让所有线程获取锁的顺序保持一致。
集合类框架的基本接口
set接口:不可重复,无序,实现类有HashSet、linkedset,插入块,查询慢
list接口:可重复,有顺序,实现类有arrayList、linkedList,插入慢,查询快
map接口:以键值对的形式来存储数据,键不能重复,实现类有hashMap等,实用性最广最好。
Serializable
将对象转换为字节流后进行数据传输,然后再转化成对象。
Iterator
迭代器,不同的集合中数据的类型不一样,使用迭代器来对集合进行遍历将可以方便代码统一管理,使代码简化。并且迭代器的方式进行遍历比for(int i=0;i<n;i++)要快(具体内部原因尚不明确)。
hashcode
对key使用特定算法进行计算dedao特定的哈希值,然后根据值存储在特定的数组里,也就实现了list和set的互补,使查找更快
Iterator和ListIterator
listiterator继承了iterator接口,是专门针对于list集合的一个类,可以向后向前迭代,以及拥有如增加删除的方法
快速失败(fail-fast)和安全失败(fail-safe)
非线程安全情况下,被其他线程使用增删操作,导致迭代发生错误,后者则是线程安全的情况下...
Tomcat
Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.