java面试题
1.java中的八大基本类型
int 4字节
short 2字节
long 8字节
float 4字节
double 8字节
boolean 1字节
byte 1字节
char 2字节
2.hashmap:线程不安全的,其中是已键值对的形式存储
hashmap遍历:
import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public final class TestClass { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("a", 12); map.put("b", 22); map.put("c", 32); map.put("d", 42); map.put("e", 52); //1.key-value 键值对遍历 //第一步:entrySet()方法调用迭代器方法iterator(), //第二步:用hasNext()方法遍历迭代器, //第三步:(Map.Entry)iterator.next(); Iterator iterator = map.entrySet().iterator(); while(iterator.hasNext()){ Map.Entry entry = (Map.Entry)iterator.next(); System.out.println(entry.getKey()+" key值"); System.out.println(entry.getValue()+" value值"); } //2. 遍历map的值 //第一步:values()方法调用迭代器方法iterator(), //第二步:用hasNext()方法遍历迭代器, //第三步:iterator.next(); // Iterator iterator = map.values().iterator(); // //Iterator iterator = c.iterator(); // while (iterator.hasNext()) { // System.out.println(iterator.next()); // // } } }
3.Linkedhashmap:相比较hashmap 多了两个方法,有afer和behind 。想要输入的顺序和输出的顺序相同,向这个方法,
Concurrenthashmap:线程安全hashmap
Weakhashmap:弱型的,自动会都外部不引用的key。而hashmap只有在移除的时候才会删除key 的值
4.线程安全的集合:
Vector stack hashtable ConCurrentHashmap
5.reentrantlock的实现和Synchronied的区别:
1.nchronized:Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。
2.ReentrantLock:由于ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能,主要有以下3项:
a.等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。
b.公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。
c.锁绑定多个条件,一个ReentrantLock对象可以同时绑定对个对象。
6.CAS原理及问题:是乐观锁,比较并且交换 CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。
①.CAS容易造成ABA问题。一个线程a将数值改成了b,接着又改成了a,此时CAS认为是没有变化,其实是已经变化过了,而这个问题的解决方案可以使用版本号标识,每操作一次version加1。在java5中,已经提供了AtomicStampedReference来解决问题。
②.CAS造成CPU利用率增加。之前说过了CAS里面是一个循环判断的过程,如果线程一直没有获取到状态,cpu资源会一直被占用。