ArrayList和LinkedList的用法區(qū)別:

1.ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu)砂缩,LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。2.對于隨機(jī)訪問get和set三娩,ArrayList覺得優(yōu)于LinkedList庵芭,因?yàn)長inkedList要移動(dòng)指針。3.對于新增和刪除操作add和remove雀监,LinedList比較占優(yōu)勢双吆,因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)。 這一點(diǎn)要看實(shí)際情況的会前。若只對單條數(shù)據(jù)插入或刪除好乐,ArrayList的速度反而優(yōu)于LinkedList。但若是批量隨機(jī)的插入刪除數(shù)據(jù)回官,LinkedList的速度大大優(yōu)于ArrayList. 因?yàn)锳rrayList每插入一條數(shù)據(jù)曹宴,要移動(dòng)插入點(diǎn)及之后的所有數(shù)據(jù)搂橙。 這一點(diǎn)我做了實(shí)驗(yàn)歉提。在分別有200000條“記錄”的ArrayList和LinkedList的首位插入20000條數(shù)據(jù)笛坦,LinkedList耗時(shí)約是ArrayList的20分之1。

for(int m=0;m<20000;m++){

linkedlist.add(m,null); //當(dāng)在200000條數(shù)據(jù)之前插入20000條數(shù)據(jù)時(shí)苔巨,LinkedList只用了1125多ms.這就是LinkedList的優(yōu)勢所在
}
long time4 = new Dte().getTime();

System.out.print("batch linkedlist add:");
System.out.println(time4 - time3);
for(int n=0;n<20000;n++){
arraylist.add(n, null); //當(dāng)在200000條數(shù)據(jù)之前插入20000條數(shù)據(jù)時(shí)版扩,ArrayList用了18375多ms.時(shí)間花費(fèi)是arraylist的近20倍(視測試時(shí)機(jī)器性能)
}
long time5 = new Date().getTime();
System.out.print("batch arraylist add:");

System.out.println(time5 - time4);

4.查找操作indexOf,lastIndexOf,contains等,兩者差不多侄泽。5.隨機(jī)查找指定節(jié)點(diǎn)的操作get礁芦,ArrayList速度要快于LinkedList.
這里只是理論上分析,事實(shí)上也不一定悼尾,ArrayList在末尾插入和刪除數(shù)據(jù)的話柿扣,速度反而比LinkedList要快。我做過一個(gè)插入和刪除200000條數(shù)據(jù)的試驗(yàn)闺魏。


long time1 = new Date().getTime();
String s1 = (String) linkedlist.get(100000);// 總記錄200000未状,linkedlist加載第100000條數(shù)據(jù)耗時(shí)15~32ms不等
long time2 = new Date().getTime();
System.out.println(time2 - time1);

String s2 = (String) arraylist.get(100000);// 總記錄200000,linkedlist加載第100000條數(shù)據(jù)耗時(shí)0ms
long time3 = new Date().getTime();
System.out.println(time3 - time2);

/*分別insert200000條數(shù)據(jù)到linkedlist和arraylist
*由于是在末尾插入數(shù)據(jù)析桥,arraylist的速度比linkedlist的速度反而要快
/
public static void insertList(LinkedList linklist, ArrayList arraylist) {
long time1 = new Date().getTime();
System.out.println(time1);
for (int i = 0; i < 200000; i++) {
linklist.add(i, "linklist" + i);
}
long time2 = new Date().getTime();
System.out.println(time2 - time1);
for (int j = 0; j < 200000; j++) {
arraylist.add(j, "arraylist" + j);
}
long time3 = new Date().getTime();
System.out.println(time3 - time2);
}
/
delete linkedlist和arraylist中的200000條數(shù)據(jù)
*由于是在末尾刪除數(shù)據(jù)司草,arraylist的速度比linkedlist的速度反而要快
*/
public static void deleteList(LinkedList linklist, ArrayList arraylist) {
long time1 = new Date().getTime();
System.out.println(time1);
for (int i = 199999; i >= 0; i--) {
linklist.remove(i);
}
long time2 = new Date().getTime();
System.out.println(time2 - time1);
for (int j = 199999; j >= 0; j--) {
arraylist.remove(j);
}
long time3 = new Date().getTime();
System.out.println(time3 - time2);
}
public static void main(String args[]) {
LinkedList linkedlist = new LinkedList();
ArrayList arraylist = new ArrayList();
insertList(linkedlist, arraylist);
//以下代碼省略

插入:LinkedList 578msArrayList 437ms刪除:LinkedList 31msArrayList 16ms

比較一下ArrayList和LinkedList:
1.ArrayList是基于數(shù)組,LinkedList基于鏈表實(shí)現(xiàn)泡仗。2.對于隨機(jī)訪問get和set埋虹,ArrayList覺得優(yōu)于LinkedList,因?yàn)長inkedList要移動(dòng)指針娩怎。3.對于新增和刪除操作add和remove搔课,LinedList比較占優(yōu)勢,因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)峦树。4.查找操作indexOf,lastIndexOf,contains等辣辫,兩者差不多。這里只是理論上分析魁巩,事實(shí)上也不一定急灭,比如ArrayList在末尾插入和刪除數(shù)據(jù)就不設(shè)計(jì)到數(shù)據(jù)移動(dòng),不過還是有這么個(gè)建議:隨機(jī)訪問比較多的話一定要用ArrayList而不是LinkedList谷遂,如果需要頻繁的插入和刪除應(yīng)該考慮用LinkedList來提高性能葬馋。

**如果z 引用一個(gè)當(dāng)前內(nèi)容是“start”的字符串緩沖區(qū)對象,則此方法調(diào)用 z.append("le") 會(huì)使字符串緩沖區(qū)包含“startle”肾扰,而 z.insert(4, "le") 將更改字符串緩沖區(qū)畴嘶,使之包含“starlet”。 **
每個(gè)字符串緩沖區(qū)都有一定的容量集晚。只要字符串緩沖區(qū)所包含的字符序列的長度沒有超出此容量窗悯,就無需分配新的內(nèi)部緩沖區(qū)數(shù)組。如果內(nèi)部緩沖區(qū)溢出偷拔,則此容量自動(dòng)增大蒋院。從 JDK 5 開始亏钩,為該類補(bǔ)充了一個(gè)單個(gè)線程使用的等價(jià)類,即 StringBuilder欺旧。與該類相比姑丑,通常應(yīng)該優(yōu)先使用 StringBuilder 類,因?yàn)樗С炙邢嗤牟僮鞔怯眩捎谒粓?zhí)行同步栅哀,所以速度更快。 例如:如果 sb 引用 StringBuilder 的一個(gè)實(shí)例称龙,則 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果留拾。java.lang.StringBuilder一個(gè)可變的字符序列。此類提供一個(gè)與 StringBuffer 兼容的 API鲫尊,但不保證同步间驮。該類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡易替換,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)马昨。如果可能竞帽,建議優(yōu)先采用該類,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中鸿捧,它比 StringBuffer 要快屹篓。在 StringBuilder 上的主要操作是 append 和 insert 方法,可重載這些方法匙奴,以接受任意類型的數(shù)據(jù)堆巧。每個(gè)方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串生成器中泼菌。 append 方法始終將這些字符添加到生成器的末端谍肤;而 insert 方法則在指定的點(diǎn)添加字符。 String / StringBuffer /StringBuilder哗伯,在字符串連接操作上性能依次加強(qiáng)荒揣,我曾經(jīng)做過一個(gè)實(shí)驗(yàn),連續(xù)進(jìn)行10000次的字符串操作焊刹,三者速度上的差距是驚人的系任。在確切知道是不變字符串的情況下,還是用String最好虐块,因?yàn)镴ava語言中String采用了享元模式(Flyweight)俩滥,在JVM中只存在一份相同的String 。在確定循環(huán)次數(shù)時(shí)贺奠,盡量使用for循環(huán)霜旧,在循環(huán)嵌套中盡量將大循環(huán)放到外層,小循環(huán)放到內(nèi)層儡率,這點(diǎn)與VB等語言恰好相反挂据,經(jīng)過代碼測試的航背,不過還不知道原因±饷玻總之,在VB等微軟系列語言中用小套大會(huì)快很多箕肃,而在JAVA中用大套小會(huì)快很多婚脱!當(dāng)然這是指兩者能互相替換的時(shí)候,比如二維數(shù)組遍覓等勺像!
如果字符串特別長障贸,采用charAt逐一獲取特定位置的字符是非常耗時(shí)的。因?yàn)槊看潍@取制定索引位置的字符都要引起新的檢索過程吟宦,更好的辦法是將字符串通過調(diào)用toCharArray方法轉(zhuǎn)換成字符數(shù)組篮洁,然后通過數(shù)組索引值獲得指定位置的字符。
對于boolean值殃姓,避免不必要的等式判斷將一個(gè)boolean值與一個(gè)true比較是一個(gè)恒等操作(直接返回該boolean變量的值). 移走對于boolean的不必要操作至少會(huì)帶來2個(gè)好處: 1)代碼執(zhí)行的更快 (生成的字節(jié)碼少了5個(gè)字節(jié))袁波; 2)代碼也會(huì)更加干凈。
關(guān)于使用SESSION問題上蜗侈,盡量不要將大對象放到HttpSession或其他須序列化的對象中篷牌,并注意及時(shí)清空Session。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踏幻,一起剝皮案震驚了整個(gè)濱河市枷颊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌该面,老刑警劉巖夭苗,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隔缀,居然都是意外死亡题造,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門猾瘸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晌梨,“玉大人,你說我怎么就攤上這事须妻∽序颍” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵荒吏,是天一觀的道長敛惊。 經(jīng)常有香客問我,道長绰更,這世上最難降的妖魔是什么瞧挤? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任锡宋,我火速辦了婚禮,結(jié)果婚禮上特恬,老公的妹妹穿的比我還像新娘执俩。我一直安慰自己,他們只是感情好癌刽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布役首。 她就那樣靜靜地躺著,像睡著了一般显拜。 火紅的嫁衣襯著肌膚如雪衡奥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天远荠,我揣著相機(jī)與錄音矮固,去河邊找鬼。 笑死譬淳,一個(gè)胖子當(dāng)著我的面吹牛档址,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邻梆,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼辰晕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了确虱?” 一聲冷哼從身側(cè)響起含友,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎校辩,沒想到半個(gè)月后窘问,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宜咒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年惠赫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片故黑。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡儿咱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出场晶,到底是詐尸還是另有隱情混埠,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布诗轻,位于F島的核電站钳宪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吏颖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一搔体、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧半醉,春花似錦疚俱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞧壮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匙握,已是汗流浹背咆槽。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圈纺,地道東北人秦忿。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蛾娶,于是被迫代替她去往敵國和親灯谣。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法蛔琅,類相關(guān)的語法胎许,內(nèi)部類的語法,繼承相關(guān)的語法罗售,異常的語法辜窑,線程的語...
    子非魚_t_閱讀 31,597評論 18 399
  • java集合中ArrayList與LinkedList比較作者 codercjg 在 9 一月 2015, 11:...
    codercjg閱讀 179評論 0 0
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個(gè)月起每個(gè)月都生一對兔子寨躁,小兔子...
    趙宇_阿特奇閱讀 1,850評論 0 2
  • 一般大家都知道ArrayList和LinkedList的大致區(qū)別:1.ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)...
    myparamita閱讀 872評論 0 7
  • 文/與你相識(shí) 也許穆碎,這樣就好 從心頭聽見你的感動(dòng) 那色彩斑斕的秋天 已經(jīng)在眼前 也許,只有鳥才懂 那些行云流水的委...
    與你相識(shí)_40fa閱讀 226評論 0 2