JVM (java Virtual Machine)起到了主要作用。JVM是运行在平台之上的程序,它能够虚拟出一台目标机,所有字节码就是在虚拟出的目标机上运行。
Java虚拟机的主要任务是装载class文件并且解释执行其中的字节码
数组的定义和创建
数组名= new 数据元素类型[ 元素个数]
int a[] = new int[5];
在堆内存中开辟空间,只能通过内存分配操作符号new,凡是出现关键字new的地方必定分配了一个堆内存。
垃圾回收机制
Java的垃圾回收机制是自动的,它保证程序健壮的主要手段,避免了由于程序员忘记回收内存而引起的内存泄漏,同时也避免了回收内存带来的代码繁琐。
垃圾回收机制实际上是JVM内部运行的一个优先级比较低的后台线程,这种多线程的模式使得java 具有更好的性能,完全不用程序员参与。
垃圾回收机制仅仅作用于堆内存,于栈内存无关。
对于程序员来说,对象何时变成垃圾呢?
对象的引用被赋值为null;Person p = new Person( ); p= null;
一次性使用的匿名对象; new Person( ).sayHello();
超出生命周期的;如:
for( int I = 0; i< 100; i++){
Personp = new Person( );
}
这里,变量p 被实例化100次,每结束一次循环,变量p就超出生命周期,对象变为垃圾。
this关键字
代表对象自身的引用
一个引用
指向调用该方法的当前对象
通常在类的方法定义中使用
用this关键字的情况
方法中的变量与成员变量重名
在一个构造器中,调用其它重载的构造器
返回当前对象的引用
super和this关键字
super()
作用:调用父类的构造器
只能出现在子类的构造器中,且必须是第一行
super()中的参数,决定了调用父类哪个构造器
如果子类构造器中没有出现super,那么编译器会默认加上super(),即调用父类的空构造器,如果父类没有空构造器,编译器提示错误。
this()
作用:调用本类的构造器
只能写在构造器的第一行
在同一个构造器中super()和this()不能同时出现
如调用的是父类中无参的构造器,则可以不写super( )
如果子类中调用了父类无参的构造器,而父类中没有无参构造器则系统编译出错
单例模式(singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点
单例模式要点:
某个类只能有一个实例
它必须自行创建这个示例
必须自行向整个系统提供这个实例
final关键字
final可以修饰的元素:
类:不能被继承
变量(属性和局部变量):不能被重新赋值
在声明时赋值,或在构造器中赋值
系统不会对final属性默认的赋初始值
方法:不能在子类中被覆盖,即不能修改。
抽象类的规则
注意:
抽象类不能被实例化;
其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract;
抽象方法不能为static;
在下列情况下,一个类必须声明为抽象类:
当一个类的一个或多个方法是抽象方法时;
当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;
当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;
接口中只包含常量和抽象方法,而没有变量和方法的实现
接口对类来说是一套规范,是一套行为协议;
接口不是一个类,不能实例化
针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。
接口与抽象类的对比
接口不能含有任何非抽象方法,而抽象类可以。
类可以实现多个接口,但只能有一个父类。
接口和接口之间可以多继承
如:public interface A extends B,C
B,C也是接口.
抽象类可以理解为抽象方法和非抽象方法的混合体,而接口中的方法完全是抽象方法,是一套纯粹的规范。一般来说,有关系的类才能继承同一个抽象类,而无关的类不可能有同一个抽象父类,但是无关的类可以实现同一个接口。
内部类特性
内部类就是定义在另一个类内部的类。
内部类对于同一包中的其它类来说,内部类能够隐藏起来。
注意
内部类可以访问其外部类中所有的属性和方法
无需创建外部类的对象,即可从内部类访问外部类的变量和方法。
必须创建内部类的对象,否则无法从外部类访问内部类的变量和方法。
如果内部类中有和外部类同名的变量或方法,则内部类的变量和方法将获得比外部类的变量和方法更高的优先级。
不能定义static变量
Object 类的直接子类Throwable描述了所有被虚拟机抛出的非正常状况。一般情况下很少用Throwable,而是使用它的两个子类Error、Exception。
Error类特指应用程序在运行期间发生的严重错误。如:虚拟机内存用尽、堆栈溢出等等。一般情况下这种错误都是灾难性的,所以没有必要使用异常处理机制处理Error。
Exception类有几十个子类,描述了不同类型的异常,其中:
以RuntimeException为代表的一些类,称为非检查性异常(unchecked Exception),
以IOException为代表的一些类为检查性异常(checked Exception)。所谓的检查和非检查是指编译器在编译时是否检查。如果代码中存在检查性异常,必须进行异常处理,否则编译时不能通过;而非检查性异常编译时不进行检查,到运行时才会显现。
String的创建:有两种方式:
静态方式(常用)。像是给变量直接赋值一样来使用。如:String s1 = “abc”; String s2 = “abc”;
动态方式。动态的内存分配,使用new运算符。如:String s3= new String(“abc”); String s4= new String(“abc”);
StringBuilder类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。
StringBuffer和StringBuilder都是长度可变的字符串。
两者的操作基本相同。
两者的主要区别在于
StringBuffer类是线程安全的;
StringBuilder类是线程不安全的。
StringBuffer在JDK1.0中就有,而StringBuilder是
在JDK5.0后才出现的。
StringBuilder的一些方法实现要比StringBuffer快
些。
Calendar c = Calendar.getInstance();
c.get(Calendar.YEAR);
SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
将日期格式成指定的字符串
sdf.format(new Date());
将格式化的字符串转换成日期对象
sdf.parse(“2011-07-16”);
HashMap与TreeMap的比较
HashMap基于哈希表实现。
TreeMap基于树实现。
HashMap可以通过调优初始容量和负载因子,优化HashMap空间的使用。
TreeMap没有调优选项,因为该树总处于平衡状态
HashMap性能优于TreeMap。
HashMap与Hashtable的比较
Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
如何选择集合类
Set内存放的元素不允许重复,List存放的元素有一定的顺序。
Map的应用主要在利用键/值对进行快速查询。
ArrayList和LinkedList的区别在于随机查询性能上ArrayList要好,但LinkedList的中间元素的插入与删除性能好。
HashSet和TreeSet的区别在于集合内元素是否排序。
进程/线程区别
每个进程都有独立的代码和数据空间,进程的切换
会有很大的开销
同一类线程共享代码和数据空间,每个线程有独立
运行的栈和程序计数器,线程切换的开销小
多进程:在操作系统中能同时运行多个任务(程序)
多线程:在同一应用程序中有多个顺序流同时执行
多线程的实现
(1) 创建线程类
继承Thread类 或
实现Runnable接口
(2) 通过Thread类构造器来创建线程对象
Thread( )
Thread(Runnable target)
(3) 通过start()方法激活线程对象
Java线程的优先级用1~10的整数来表示,越小则优先级越低
当一个线程运行到需要同步的语句后,CPU不去执行其他线程中的、可能影响当前线程中的下一句代码的执行结果的代码块,必须等到下一句执行完后才能去执行其他线程中的相关代码块,这就是线程同步
实现同步的两种方式
synchronized方法
synchronized void methodA() { }
synchronized语句
synchronized (Object) {
//要同步的语句
}
网络编程
支持序列化的接口和类
Serializable接口、Externalizable接口
ObjectInputStream
ObjectOutputStream
只有一个实现Serializable接口的对象可以被序列化工具存储和恢复
Serializable接口没有定义任何属性或方法。它只用来表示一个类可以被序列化。如果一个类可以序列化,它的所有子类都可以序列化