JVM
JVM使用Unicode字符表示
ClassLoader知识
Java程序并不是一个可执行文件,而是由许多独立的类文件组成,每个文件对应一个Java类。这些类文件不是全部装入内存,程序根据需要载入。
- 基本概念
- JVM实现的一部分
- 包括bootstrap classloader(启动类加载器)
- 在JVM运行时加载Java核心API,其中包括用户定义ClassLoader(用户定义,指通过java程序实现的ClassLoader,ExtClassLoader和AppClassLoader)
- 加载流程(父类委托模式)
- JVM启动,运行bootstrap classloader,加载Java核心API(ExtClassLoader和AppClassLoader也被加载)
- 调用ExtClassLoader加载扩展API
- AppClassLoader加载CLASSPATH目录下定义的Class
i++
i++;先赋值在自加;++i;先自加在赋值
java中间变量缓存机制
public static void main(String[] args){
int j = 0;
for(int i = 0; i < 100; i++)
j = j++;
System.out.println(j);
}
以上代码的输出结果是? 0!!!
因为java的中间缓存变量机制使j=j++语句看以分解成如下操作:
temp = j;
j = j + 1;
j = temp;
类型转换
java的数据类型转换
三大类,布尔型、字符型、数值型,数值型分为整型和浮点型
- 简单数据类型之间的转换、字符串与其他数据类型的转换、其他实用数据类型的转换
- 简单数据类型之间的转换
- 低级->高级
- (byte、short、char)- int - long - float - double
- 可分为三种
- 自动类型转换
e.g. char->int 转换为对应ASCII码值 - 强制类型转换 (溢出或精读下降)
- 包装类过渡类型转换
6个包装类: Boolean Character Integer Long Float Double
- 自动类型转换
位运算
&&,|| 短路运算符,符合前面,后面就不做了
&,|非短路
异常
Java中的异常
所有抛出的异常必须从Throwable派生而来,Error,死循环、内存泄漏等,不处理;Exception分为RuntimeException(不处理)和非运行时异常(捕获、声明)
final、finally、finalize的区别
- final关键字
- 修饰类,不能派生新子类,不能被继承,类不能同时被abstract和final修饰
- 修饰变量或方法,保证在使用中不被改变。变量只能在定义或构造函数赋值,方法不能重写(override)
- finally
- 异常处理时
- finalize
- 方法名 在垃圾收集器将对象从内存中清除出去之前做必要的清理工作
传递与引用
传值与传引用
- 基本类型变量,传值的副本;引用类型变量,传引用的副本
静态修饰符 static
- 静态变量(类变量) 静态成员属于整个类
- 静态方法(类方法) 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员
输入/输出流
内存管理
垃圾回收
Java在对象创建时自动分配内存,当对象引用不存在时释放内存。
Java实用垃圾回收技术监视程序运行,当对象不再使用时自动释放内存。使用软指针跟踪对象的各个引用,并用对象表将软指针映射为对象的引用。使用软指针,垃圾回收器能以单独的线程在后台运行,依次检查每个对象。通过改变对象表项,可标记、移除、移动、检查对象。
clone
clone方法是object的方法,所以任何一个类都会自动拥有这个方法。但这并不说明就可以调用clone了,需要显示指明可以调用clone,需要写上字符串“implements Cloneable"。该字符串只是起指示作用。
面向对象
集合类
HashMap和Hashtable的区别
- HashMap允许null值,null键
- Hashtable不允许null值和null键
- Hashtable方法是同步的