1、类的初始化顺序
(父类--静态变量 或 父类--静态初始化块 )->(子类--静态变量 或 子类--静态初始化块)->(父类--变量 或 父类--初始化块)->
父类--构造器 ->(子类--变量 或 子类--初始化块) ->子类--构造器
静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
当然,可能和jvm 的底层实现也有点关系,不同jvm 可能有不同的结果。
具体原文:http://www.iteye.com/topic/208187
2、java编码
Java的class文件采用utf8的编码方式,JVM运行时采用utf16。 Java的字符串是unicode编码的。 总之,Java采用了unicode字符集,使之易于国际化。
具体原文:http://www.iteye.com/topic/311583
3、switch 的执行顺序和应用
class Test{
public static void main(String[] args){
int i=5;
switch (i) {
default:
System.out.print(5);
case 1:
System.out.print(1);
case 2:
System.out.print(2);break;
case 3:
System.out.print(3);
case 4:
System.out.print(4);
}
}
}
如以上代码:当i=5,输出512;当i=3,输出34
按这照这个规律可猜想switch 的执行顺序是:首先在查询case中有没匹配的(不执行case下的输出代码),找到时一直执行直到遇到break后停止(以下case中的代码都会执行),如果没有找到,则查找default,运行起里面的代码,也是一直遇到break后停止(如果后面还有case,也会执行其代码)。
关于default 的一些技巧可查看以下:http://www.iteye.com/topic/341970
4、final 和变量的初始化
final 有“无法改变的”、“终态的”的含义,强调是常量
static 有“全局”、“静态”的含义,强调多个实例共用一份
对于final类型成员变量的初始化方法有两种:
(1)声明变量时直接赋值;
(2)在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法都要完成对该final类型的成员变量赋值。
对于final+static声明的成员变量,必须在声明时赋值,不能在构造方法中赋值。
因为static类型的变量是在加载类的时候创建的,也就是说是在创建对象之前即执行构造方法之前执行的。
final 类(保证该类不被继承)中的所有方法(非成员变量) 都隐式指定是final
相关链接:http://www.iteye.com/topic/350201
final类型对于原生类型如int等来说,一旦声明了就不能改变了。
final类型对于引用类型来说,所谓的不能改变是指引用不能改变,即一旦指向某个对象了,就不能在指向其他对象了,但是引用的对象的内容是可以改变的。
相关链接:http://www.iteye.com/topic/350205
详细总结:http://lavasoft.blog.51cto.com/62575/18771
java类的成员变量是基本类型的话,如果没有初始化,java 也会确保它获得一个默认值,而如果该成员变量为fianl 修饰的话,那必须在类初始化时显示的初始化,比如:如果i 在类中没有任何显示的初始化操作,private int i 是正确的,而private fianl int i 会报没有初始化的错。(方法变量必须显示初始化 )
5、finally 和return 执行的顺序
finally里的code永远会执行,且在return之前执行 ,除非你使用了System.exit()或者执行到finally的时候因为断电什么的原因jvm停止了。
6、进程的五种状态之间的转换
7、java io
InputStream 和OutputStream 是面向字节(byte)形式的IO ,Reader 和Writer 是提供兼容 Unicode 与面向字符(char、String)的IO 功能。相关的 BufferedInputStream(BufferedOutputStream) 或者 BufferedReader(BufferedReaderWriter) 是相应的字节和字符的 带缓冲的操作。
一般的程序实现了,用字符操作包装字节操作,然后再用缓冲包装。
例如:new BufferedReader(new InputStreamReader(inputStream)); //inputStream 为InputSteam 字节
具体相关的IO 处理类的汇总,请参考:http://www.java2000.net/p1225
8、String 作为方法的参数传递问题
String 的底层对String的存储实际上通过char[]来实现的(传递String 参数和实际是是传递char[] ,而char 为基本类型,所以是不会改变的)。传递String 方法和传递基本数据类型一样不会改变原始的值,而除了String 以外的对象则会改变该对象的值。在 String 用作方法参数传递 相加的时候,是用StringBuffer 而不是用String 的原因。
9、String 的对象的生成
原来本来是理解了,不过久了没看又忘了,还是记录下好了。
http://www.iteye.com/topic/177812
http://www.iteye.com/topic/122206
10、List 中是否包含该对象的方法 contains(Object o)
在api 的定义是:如果列表包含指定的元素,则返回 true 。更确切地讲,当且仅当列表包含满足 (o==null ? e==null : o.equals(e)) 的元素 e 时才返回 true 。
由此可知,如果要对对象进行该操作,则应该覆盖他的hashcode 和equal 方法,使之正常运行。
11、内存溢出和内存泄露的区别
内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽)。
12 、Thread 的状态
有时项目中的一些应用程序出现假死状态,收不到数据报也发不出去,用jstack 看了下线程的状态,发现有些线程是waiting/timed_waiting 状态,在最近看TCP的协议的时候看到过相关TCP中的TIME_WAIT状态(关于TCP的协议,可以参考 http://zhxing.iteye.com/blog/934851),他们之间有什么联系呢,发现有些搞不清楚,在查了API后,记录下这些 基础的知识,这些都可以在Thread.State的API上找到。
线程状态可以处于下列状态之一:
NEW :至今尚未启动的线程处于这种状态。
RUNNABLE :正在 Java 虚拟机中执行的线程处于这种状态。
BLOCKED :受阻塞并且正在等待监视器锁的某一线程的线程状态。处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Object.wait 之后再次进入同步的块/方法。
WAITING :处于等待状态的线程正等待另一个线程,以执行特定操作。 例如,已经在某一对象上调用了 Object.wait() 的线程正等待另一个线程,以便在该对象上调用 Object.notify() 或 Object.notifyAll() 。已经调用了 Thread.join() 的线程正在等待指定线程终止。
TIMED_WAITING : 具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态: Thread.sleep;带有超时值的 Object.wait ;带有超时值的 Thread.join ;LockSupport.parkNanos ;LockSupport.parkUntil 。
TERMINATED :已退出的线程处于这种状态。
在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态 ,它们并没有反映所有操作系统线程状态 。