唯智笔试心经

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.

 1import java.util.ArrayList;
 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
3 .JAVA如何实现字符串的颠倒
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());
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关于线程安全性的使用方法类似。
原文地址:https://www.cnblogs.com/redcoatjk/p/3562413.html