上海大学计算机研究生面试试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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类型模型规定所有的变量都存储在主内存中,而工作闪存会放到变量的副本拷贝,线程对所有变量的操作都在工作内存中进行,而且不同的线程不能访问对方工作内存中的变量,只能够通过主内存进行访问.