1.String str="i"与 String str=new String("i")一样吗?
不一样,前一个是先去常量池中去找看看有没有“i”如果有的话,直接引用,否则就是在常量池中新建一个对象;
后一种,是直接在JVM的堆内存中去新建一个对象。
常量池,在JDK1.6之前是放在JVM的方法区中,JDK1.7后放到的堆内存中了
2.普通类和抽象类有什么区别?
普通类不能有抽象方法,抽象类可以有抽象方法。
普通类可以直接实例化,抽象类不能直接实例化。
3.抽象类能使用 final 修饰吗?
不能,如果用了final的话抽象类就不能被继承了,而这与抽象类的设计初衷相违背了。
final修饰在变量上说明该变量不能被修改,修饰在方法中说明该方法不能被覆写。
4.JAVA中容器有哪些?
5.HashMap 和 Hashtable 有什么区别?
HashMap是线程不安全的,而HashTable是线程安全,底层使用synchronized实现
HashMap性能比HashTable要好
6.ArrayList,linkedList,Vector
ArrayList:底层使用数组实现的,线程不安全,随机访问效率高,增删效率不高因为需要移动数据
LinkedList:底层使用双向链表实现,随机访问效率不高,需要一个节点一个节点的查找过去,增删效率高因为只需要修改前后相关节点的指针指向就行了
Vector:线程安全的数组型集合
7.sleep() 和 wait() 有什么区别?
sleep():Thread类的静态方法,不会释放锁,一定时间后自动唤醒
wait():Object的方法,会释放锁,需要notify(),notifyAll()唤醒
8.如何创建线程池?
1.ExecutorService newExecutorService = Executors.newCachedThreadPool();//可缓存线程池
2.Executors.newFixedThreadPool (3);//定长线程池
3.Executors.newScheduledThreadPool //定长线程池,支持周期性任务的执行
4.Executors.newSingleThreadExecutor //单线程线程池,池中就一个线程,保证任务的执行顺序是按指定优先级执行
以上线程池由于内部默认使用的是 无界队列,高并发的情况下可能出现OOM
推荐做法,使用有界队列来构造线程池。:ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor(4,10,5,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(10));
9.深拷贝和浅拷贝区别是什么?
浅拷贝只是复制了对象的引用,而深拷贝是把对象以及值都复制了,修改原有对象不会对该对象有影响。