上海大学计算机研究生面试试题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上海大学计算机研究生面试试题

hashMap、hashtable、ConcurrentHashMap、hashset的区别

hashMap

1)允许空值和空健

2)线程不安全,效率高于hashtable

3)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey 3)HashMap中hash数组的默认大小是16,而且一定是2的指数。

4)JDK1.2出现的

hashtable

1)不允许空健和空值

2)线程安全,效率低于hashMap

3)HashTable中hash数组默认大小是11,增加的方式是 old*2+1

3)JDK1.0出现的

ConcurrentHashMap

1)一个ConcurrentHashMap由多个segment组成,每一个segment都包含了一个HashEntry 数组的hashtable

2)每一个segment包含了对自己的hashtable的操作,比如get,put,replace等操作,这些操作发生的时候,对自己的hashtable进行锁定。由于每一个segment写操作只锁定自己的hashtable,所以可能存在多个线程同时写的情况,性能无疑好于只有一个hashtable锁定的情况,高并发

hashset

1)只能放入单独的对象

2)放入的元素无序

3)放入的元素不能够重复

4)HashSet 底层采用HashMap 来保存所有元素所有放入HashSet 中的集合元素实际上由HashMap 的key 来保存,而HashMap 的value 则存储了一个PRESENT,它是一个静态的Object 对象。

将一个字符串反转:

System.out.println(new StringBuilder("i love you ").reverse().toString());

String str="i Love you";

List list = new ArrayList();

String splitStr []=str.split(" ");

list=Arrays.asList(splitStr);

Collections.reverse(list);

for(String word:list){

System.out.print(word+" ");

volatile、synchronized、final、wait、notify的含义

Volatile:

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

volatile是变量修饰符,用在多线程,同步变量。线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A)

在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。

一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中。

public class StoppableTask extends Thread {

private volatile boolean pleaseStop;

public void run() {

while (!pleaseStop) {

// do some stuff...

}

}

public void tellMeToStop() {

pleaseStop = true;

}

}

假如pleaseStop没有被声明为volatile,线程执行run的时候检查的是自己的副本,就不能及时得知其他线程已经调用tellMeToStop()修改了pleaseStop的值。

S ynchronized:

synchronized获得并释放监视器,如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行

因此volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。

显然synchronized要比volatile消耗更多资源。

F inal:

用于修饰变量属性、方法和类

修饰变量属性: 如果变量为基本数据类型表示为常量不能修改其值;如果为引用类型表示变量的引用不能指向新的对象

修饰方法表示改方法不可重写

修饰类表示改类不可继承

Wait:

wait是Object 类中的方法且不能够被重写

wait方法只能放在同步的方法货同步块中,表示资源同步时线程需要等待

wait会自动释放对象锁

wait方法需要等待线程唤醒后,线程才会继续执行,靠别人来唤醒

Notify:

线程的通信,用于唤醒线程;这里wait和notify方法必须要与sysnchronized一起使用,也就是wait与notify只针对已经获得对象锁进行操作,从语法角度wait与notify必须在sysnchronized(Obj){}语句块中,从功能上讲wait就是说线程在获取对象后,主动释放对象锁,同时本地线程休眠。直到有其他线程调用对象的notify方法对对象锁进行唤醒操作,notify调用后并不是马上释放对象锁,而是在相应的sysnchronized语句块执行结束,自动释放后,jvm会在wait对象锁的线程中随机选取一段线程赋予对象锁,唤醒线程继续执行,这样提供了在线程间同步、唤醒的操作.

java内存模型并做简要说明。

JVM具有一个堆,堆是运行时数据区域,所有的实例和数组的内存均从这里进行分配,内存中又分为栈、堆、数据段等的概念.

内存模型中有主内存和工作内存,类似于电脑中的闪存和高速缓存样,线程使用的数据库在主内存中,然后对数据库的操作,为了获得更快的速度,会放到寄存器和高速缓存中,java类型模型规定所有的变量都存储在主内存中,而工作闪存会放到变量的副本拷贝,线程对所有变量的操作都在工作内存中进行,而且不同的线程不能访问对方工作内存中的变量,只能够通过主内存进行访问.

相关文档
最新文档