(1)string a = 「1」;與string b = new string(「1」)
由於new是在堆上新建了乙個區域,兩個a。b的指向位址不同,所以,==為false,而equal為true
(2)堆、棧和堆疊的區別
速度:cpu-棧-堆
棧: int b; 棧
char s = 「abc」; 棧
char *p2; 棧
堆: new
全域性:
static int c =0; 全域性(靜態)初始化區
堆疊:stack 一種儲存的資料結構,為先進後出,與之對應為queue佇列。
(3)arraylist和linklist的區別
1.arraylist是基於動態陣列,linkedlist基於鍊錶。
2.對於隨機訪問get和set,arraylist優於linkedlist,因為arraylist可以隨機定位,而linkedlist要移動指標
一步一步的移動到節點處,但是linklist的增刪快,而arraylist對於刪除則需要對陣列進行維護:
刪除元素會造成底層陣列重排,重新複製。
當我們用下標方式去刪除元素時,如果刪除的是最後乙個元素,不會觸發陣列底層的複製,時間複雜度為o(1)。
如果刪除第i的元素,會觸發底層陣列複製n-i次,根據最壞情況,時間複雜度為o(n)。
當我們用查詢元素的方式去刪除元素時,假設這個元素在第i個位置,我們要先查詢i次,找到元素後,
會觸發底層陣列n-i次複製,兩個值相加i+(n-i) = n,時間複雜度為o(n)。而linkedlist刪除則是通過修改指標,複雜度只有o(1)。
3.arraylist的動態擴容實際上是每次超出最大後擴容1.5倍:
//源**
int newcapacity = oldcapacity + (oldcapacity >> 1);
每次擴容都是通過拷貝舊list到新的list中:
這個擴容方法為native,是用其他語言寫的,如c/c++,原始碼如下:
先判斷大小,然後grow:
進行擴容:
最後拷貝:
(4)string,stringbuffer與stringbuilder的區別
string 字串常量
stringbuffer 字串變數(執行緒安全)
stringbuilder 字串變數(非執行緒安全)
string 型別和 stringbuffer 型別的主要效能區別其實在於 string 是不可變的物件, 因此在每次對 string 型別
進行改變的時候其實都等同於生成了乙個新的 string 物件,然後將指標指向新的 string 物件,所以經常改變內容的字串最好不要用 string ,因為每次生成物件都會對系統效能產生影響
(5)執行緒的問題:
(6)hashmap和hashtable有什麼區別:
hashmap和hashtable都實現了map介面,因此很多特性非常相似。但是,他們有以下不同點:
hashmap允許鍵和值是null,而hashtable不允許鍵或者值是null。
hashmap的最底層是陣列來實現的,陣列裡的元素可能為null,也有可能是單個物件,還有可能是單向鍊錶或是紅黑樹,在jdk1.7及以前的版本中,hashmap裡是沒有紅黑樹的實現的,在jdk1.8中加入了紅黑樹是為了防止雜湊表碰撞攻擊,當鍊錶鏈長度為8時,及時轉成紅黑樹,提高map的效率。
hashtable是同步的,而hashmap不是。因此,hashmap更適合於單執行緒環境,而hashtable適合於多執行緒環境。
hashmap提供了可**用迭代的鍵的集合,因此,hashmap是快速失敗的。另一方面,hashtable提供了對鍵的列舉(enumeration)。
concurrenthashmap也是執行緒安全的,但效能比hashtable好很多,hashtable是鎖整個map物件,而concurrenthashmap是鎖map的部分結構。
一般認為hashtable是乙個遺留的類。
(7)hashset和treeset有什麼區別
hashset是由乙個hash表來實現的,因此,它的元素是無序的。add(),remove(),contains()方法的時間複雜度是o(1)。
另一方面,treeset是由乙個樹形的結構來實現的,它裡面的元素是有序的。因此,add(),remove(),contains()方法的時間複雜度是o(logn)
java集合面試題整理
可能會導致死迴圈和更新丟失問題。死迴圈的成因涉及到四個方法,最初的起因是呼叫put 方法,跟著方法走一遍 put 方法原始碼 只給出核心部分 public v put k key,v value modcount 該key不存在,需要增加乙個結點 addentry hash,key,value,i ...
java面試題整理(1)
一 請你談談對mq的理解?以及你們在專案中是怎麼用的?答 mq 訊息佇列 是一種應用程式對應用程式的通訊方法,由於在高併發環境下,由於來不及同步處理,請求往往發生堵塞,通過訊息佇列,我們可以非同步處理請求,緩解系統壓力 mq message queue 即訊息佇列是在訊息的傳輸過程中儲存訊息的容器。...
java面試題整理(2)
一 註冊中心你了解了哪些?答 consul eureka zookeeper 二 jdk 中有哪幾個執行緒池?答 juc提供了排程器物件executors來建立執行緒池,可建立的執行緒池有四種 1 newfixedthreadpool建立乙個指定工作執行緒數量的執行緒池。每當提交乙個任務就建立乙個工...