1. final,finally,finalize都是Java语言的关键字,长得还挺像,意义可大不一样。这三者的区别也是再经典不过的面试题了。
先谈谈final,它是一个修饰符,可以用于以下4个地方。
1. 定义变量,包括静态变量,非静态变量。
2. 定义方法的参数。
3. 定义方法。
4. 定义类。
当用final定义一个变量时,表示该变量是不可改变的,即常量。被final修饰的变量必须初始化,可以在变量定义时或者类的初始化块或者构造器中进行初始化工作。
当用final定义一个方法时,表示这个方法不能被子类修改,但不影响子类继承它。
当用final定义一个类时,表示这个类不能被继承,即没有子类。我们常用的String类就是fianl型的。final定义的类中的所有方法不能被重写,但不代表final类中的属性值是不能改变的。
接着来看finally语句。它其实很简单,它只能用在try/catch语句中,附带一个语句块,表示该语句块中的内容最终总是被执行,无论捕获异常成功与否。
最后说说finalize,它是一个方法,是GC(garbage collection)运行机制的一部分。该方法可以告诉GC在清理对象时要完成的一些任务。
综上所述,三个关键字看起来很像,使用却千差万别。实际上,finally和finalize还是很简单的,用起来也只有各自那种单一的情况。final是一个很灵活而且不小心就会出错的东西,要留心了。
2.
2
3
4public class tlist {
5
6
7 public static void main(String[] args) {
8 ArrayList s1=new ArrayList();
9 s1.add("1a");
10 s1.add("2b");
11 s1.add("3c");
12 System.out.println(s1.size());
13 System.out.println(s1.get(0));
14 System.out.println(s1.get(1));
15 System.out.println(s1.get(2));
16 System.out.println("---华丽的分割线---");
17 s1.add(2,"sdfs");
18 System.out.println(s1.get(2));
19 }
20
21}
22
1)
public class MyReverse {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "asdf";
char c[] = str.toCharArray();
char t[] = new char[c.length];
for(int i=0,j=c.length-1;i<c.length;i++,j--){
t[i]=c[j];
}
System.out.println(String.valueOf(t));
}
}
2)String a= "1000 ";StringBuffer b=new StringBuffer(a);
System.out.println(b.reverse());
4 ArrayList.Synchronized方法
IsSynchronized属性指示当前的ArrayList实例是否支持线程同步,而ArrayList.Synchronized静态方法则会返回一个ArrayList的线程同步的封装。
如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步,例如:
ArrayList list = new ArrayList();
//...
lock( list.SyncRoot ) //当ArrayList为非线程包装的时候,SyncRoot属性其实就是它自己,但是为了满足ICollection的SyncRoot定义,这里还是使用SyncRoot来保持源代码的规范性
{
list.Add( “Add a Item” );
}
如果使用ArrayList.Synchronized方法返回的实例,那么就不用考虑线程同步的问题,这个实例本身就是线程安全的,实际上ArrayList内部实现了一个保证线程同步的内部类,ArrayList.Synchronized返回的就是这个类的实例,它里面的每个属性都是用了lock关键字来保证线程同步。
****
但是,使用这个方法(ArrayList.Synchronized)并不能保证枚举的同步,例如,一个线程正在删除或添加集合项,而另一个线程同时进行枚举,这时枚举将会抛出异常。所以,在枚举的时候,你必须明确使用 SyncRoot 锁定这个集合。
Hashtable与ArrayList关于线程安全性的使用方法类似。