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.深拷貝和淺拷貝區別是什麼?
淺拷貝只是複製了對象的引用,而深拷貝是把對象以及值都複製了,修改原有對象不會對該對象有影響。