項(xiàng)目?jī)?yōu)化和List集合

一糠赦、項(xiàng)目?jī)?yōu)化

1.分析情況? ??

當(dāng)前情況

2.使用泛型和Object優(yōu)化項(xiàng)目

import com.qfedu.student.system.myexception.IllegalCapacityException;

import com.qfedu.student.system.myexception.OverflowMaxArraySizeException;

/**

* 自定義數(shù)據(jù)存儲(chǔ)工具爹脾,MyList用于存儲(chǔ)代碼中操作的數(shù)據(jù)

*

* @author Anonymous

*

* @param <E> 使用泛型滿足更多的情況

*/

public class MyList<E> {

/**

* 保存數(shù)據(jù)的底層Object數(shù)組,可以保存任意數(shù)據(jù)類型嚷炉,但是在操作方法是會(huì)

* 對(duì)操作的數(shù)據(jù)類型掠手,通過(guò)泛型進(jìn)行約束操作

*/

private Object[] elementData = null;

/**

* DEFAULT_CAPACITY 默認(rèn)容量费坊,這里是一個(gè)帶有名字的常量

*/

private static final int DEFAULT_CAPACITY = 10;

/**

* 數(shù)組最大容量事格,是int類型最大值 - 8 -8等我給你講

*/

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/**

* 當(dāng)前底層Object數(shù)組中有效元素個(gè)數(shù)

*/

private int size = 0;

/**

* 無(wú)參數(shù)構(gòu)造方法氢卡,使用DEFAULT_CAPACITY約束初始化容量

*/

public MyList() {

elementData = new Object[DEFAULT_CAPACITY];

}

/**

* 提供給用戶可以指定初始化容量的操作方法

*

* @param initCapacity 用戶指定的初始化容量锈至,但是必須在合理范圍以內(nèi)

* @throws IllegalCapacityException 用戶指定的初始化容量超出范圍

*/

public MyList(int initCapacity) throws IllegalCapacityException {

if (initCapacity < 0 || initCapacity > MAX_ARRAY_SIZE) {

throw new IllegalCapacityException("Input Parameter is Invalid!");

}

elementData = new Object[initCapacity];

}

/**

* 添加方法,添加在創(chuàng)建MyList對(duì)象是約束的具體數(shù)據(jù)類型

*

* @param e 通過(guò)泛型約束的具體數(shù)據(jù)類型

* @return 添加成功返回true, 否則返回false

* @throws OverflowMaxArraySizeException

*/

public boolean add(E e) throws OverflowMaxArraySizeException {

if (size == elementData.length) {

// 添加操作是一個(gè)元素译秦,最小容量要求就是在原本的數(shù)組容量之上 + 1

grow(size + 1);

}

elementData[size] = e;

size += 1;

return true;

}

/**

* 刪除保存在MyList中的指定元素

*

* @param obj 用戶指定的元素

* @return 刪除成功返回true峡捡,否則返回false

*/

public boolean remove(Object obj) {

int index = indexOf(obj);

return remove(index);

}

/**

* 刪除指定下標(biāo)的的元素

*

* @param index 用戶指定的下標(biāo)位置

* @return 刪除成功返回true,否則返回false

*/

public boolean remove(int index) {

if (index < 0 || index >= size) {

return false;

}

for (int i = index; i < size - 1; i++) {

elementData[i] = elementData[i + 1];

}

// 原本最后一個(gè)有效元素位置賦值為null

elementData[size - 1] = null;

// 有效元素個(gè)數(shù) - 1

size -= 1;

return true;

}

/**

* 根據(jù)指定元素筑悴,找出對(duì)應(yīng)的下標(biāo)位置们拙,沒(méi)有找到返回-1

*

* @param obj 用戶傳入的元素

* @return 找到元素返回值大于等于0,沒(méi)有找到返回-1

*/

public int indexOf(Object obj) {

int index = -1;

for (int i = 0; i < size; i++) {

if (obj.equals(elementData[i])) {

index = i;

break;

}

}

return index;

}

/**

* 替換修改方法阁吝,使用指定元素替換指定下標(biāo)的元素

*

* @param index 指定的下標(biāo)位置砚婆,約束在合理范圍以內(nèi)

* @param e 泛型約束的指定數(shù)據(jù)類型,保證數(shù)據(jù)類型一致化

* @return 被替換掉的元素突勇。如果沒(méi)有被替換的元素装盯,返回null

*/

public E set(int index, E e) {

if (index < 0 || index >= size) {

return null;

}

// 取出原本的元素

E temp = (E) elementData[index];

elementData[index] = e;

return temp;

}

/**

* 返回當(dāng)前MyList底層數(shù)組中保存有效元素個(gè)數(shù)是多少個(gè)

*

* @return 返回當(dāng)前MyList底層數(shù)組中有效元素個(gè)數(shù)

*/

public int size() {

return size;

}

/**

* 判斷當(dāng)前MyList中是否為空

*

* @return 如果是空返回true,否則返回false

*/

public boolean isEmpty() {

return 0 == size;

}

/**

* 判斷指定元素是否在MyList底層數(shù)組中存在

*

* @param obj 用戶指定的元素

* @return 存在返回true甲馋,不存在返回false

*/

public boolean contains(Object obj) {

return indexOf(obj) > -1;

}

/**

* 根據(jù)指定下標(biāo)位置埂奈,獲取對(duì)應(yīng)的元素

*

* @param index 指定下標(biāo)位置

* @return 對(duì)應(yīng)的元素,如果不存在定躏,返回null

*/

public E get(int index) {

return index > -1 && index < size ? (E) elementData[index] : null;

}

/**

* 類內(nèi)私有化方法账磺,用于在添加元素過(guò)程中,出現(xiàn)當(dāng)前底層數(shù)組容量不足的情況下 對(duì)底層數(shù)組進(jìn)行擴(kuò)容操作共屈,滿足使用要求

*

* @param minCapacity 添加操作要求的最小容量

* @throws OverflowMaxArraySizeException 數(shù)組容量超出最大范圍

*/

private void grow(int minCapacity) throws OverflowMaxArraySizeException {

// 1. 獲取原數(shù)組容量

int oldCapacity = elementData.length;

// 2. 計(jì)算得到新數(shù)組容量绑谣,新數(shù)組容量大約是原數(shù)組容量的1.5倍

// >> 1 右移一位 該操作是二進(jìn)制操作 等價(jià)于 / 2 效率略高

int newCapacity = oldCapacity + (oldCapacity >> 1);

// 3. 判斷新數(shù)組容量是否滿足最小容量要求

if (minCapacity > newCapacity) {

newCapacity = minCapacity;

}

// 4. 判斷當(dāng)前容量是否超出了MAX_ARRAY_SIZE

if (newCapacity > MAX_ARRAY_SIZE) {

throw new OverflowMaxArraySizeException("Overflow MAX_ARRAY_SIZE");

}

// 5. 創(chuàng)建新數(shù)組

Object[] temp = new Object[newCapacity];

// 6. 數(shù)據(jù)拷貝

for (int i = 0; i < oldCapacity; i++) {

temp[i] = elementData[i];

}

// 7. 使用allStus保存新數(shù)組首地址

elementData = temp;

}

}

二、List接口

1.List接口概述

? ? List接口特征:1.數(shù)據(jù)存儲(chǔ)可重復(fù)拗引。2.有序借宵,添加順序和保存順序一致。

? ? --|? ? ArrayList<E>? ? 可變長(zhǎng)數(shù)組

? ? --|? ? LinkedList<E>? ? 雙向鏈表

? ? --|? ? Vector <E>? ? 線程安全的課變長(zhǎng)數(shù)組

2.List常用方法

? ? 增:

? ? ? ? boolean add(E e);????List接口繼承Collection接口 add方法矾削,使用操作和Collection一致壤玫,并且這里采用的添加方式是【尾插法】。

? ? ? ? boolean add(int index, E e);? ? List接口【特有方法】哼凯,在指定位置添加指定元素欲间。

? ? ? ? boolean addAll(Collection<? extends E> c);? ? List接口繼承Collection接口 addAll方法,使用操作和Collection一致断部,并且這里采用的添加方式是【尾插法】猎贴。

? ??????boolean addAll(int index, Collection<? extends E> c);????List接口【特有方法】,在指定下標(biāo)位置,添加另一個(gè)集合中所有內(nèi)容

? ? 刪:

? ??????E remove(int index);????List接口【特有方法】她渴,獲取指定下標(biāo)位置的元素达址。

????????boolean remove(Object obj);????List接口繼承Collection接口方法。刪除集合中的指定元素

????????boolean removeAll(Collection<?> c);????List接口繼承Collection接口方法趁耗。刪除當(dāng)前集合中和參數(shù)集合重復(fù)元素沉唠。

????????boolean retainAll(Collection<?> c);????List接口繼承Collection接口方法。保留當(dāng)前集合中和參數(shù)集合重復(fù)元素苛败。

????????clear();????List接口繼承Collection接口方法满葛。清空整個(gè)集合中的所有元素。

? ? 改:

? ??????E set(int index, E e);????List接口【特有方法】罢屈,使用指定元素替代指定下標(biāo)的元素嘀韧,返回值是被替換的元素。

? ? 查:

? ??????int size();????List接口繼承Collection接口方法缠捌。獲取集合中有效元素個(gè)數(shù)

????????boolean isEmpty();????List接口繼承Collection接口方法乳蛾。判斷當(dāng)前集合是否為空

????????boolean contains(Object obj);????List接口繼承Collection接口方法。判斷指定元素是否包含在當(dāng)前集合中

????????boolean containsAll(Collection<?> c);????List接口繼承Collection接口方法鄙币。判斷參數(shù)集合是不是當(dāng)前集合在子集合

????????Object[] toArray();????List接口繼承Collection接口方法。獲取當(dāng)前集合中所有元素Object數(shù)組

????????E get(int index);????List接口【特有方法】蹂随。獲取指定下標(biāo)對(duì)應(yīng)的元素

????????List<E> subList(int fromIndex, int toIndex);????List接口【特有方法】十嘿。獲取當(dāng)前集合指定子集合,從fromIndex開(kāi)始岳锁,到toIndex結(jié)束绩衷。fromIndex <= 范圍 < toIndex

????????int indexOf(Object obj);????List接口【特有方法】。獲取指定元素在集合中第一次出現(xiàn)位置

????????int lastIndexOf(Object obj);????List接口【特有方法】激率。獲取指定元素在集合中最后一次出現(xiàn)的位置

3.List接口常用方法演示

演示
演示

三咳燕、ArrayList

????1.ArrayList概述? ??

? ? ? ? ArrayList是在Java中集合非常重要的一個(gè)組裝,基于數(shù)組玩橫的數(shù)據(jù)結(jié)構(gòu)乒躺≌忻ぃ可邊長(zhǎng)數(shù)組操作!

? ? ? ? 底層保存數(shù)據(jù)的是一個(gè)Object類型數(shù)組嘉冒。

? ? ? ? ArrayList使用的方法都是List接口中的方法曹货,有兩個(gè)需要了解的成員方法;

? ? ? ? ? ? ensureCapacity();? 判斷方法讳推,用于確定當(dāng)前底層數(shù)組的容量是否滿足當(dāng)前操作的需求顶籽。

? ? ? ? ? ? trimToSize();? 節(jié)省空間,將底層數(shù)組的容量所溶質(zhì)有效元素個(gè)數(shù)

? ? ? ? ? ? 需要掌握的是關(guān)于ArrayList效率相關(guān)的問(wèn)題和細(xì)節(jié)問(wèn)題银觅。

? ? 2.效率問(wèn)題

圖例

????3.內(nèi)存地址

? ??????內(nèi)存地址概念 : 計(jì)算機(jī)中為了更好的使用內(nèi)存礼饱,操作程序,完成代碼。將內(nèi)存按照最小單位镊绪,進(jìn)行編號(hào)處理匀伏。最小單位: 字節(jié) byte。從編號(hào)為0內(nèi)存開(kāi)始镰吆,到內(nèi)存的最大值帘撰。地址的展示方式是十六進(jìn)制。

? ? 4.內(nèi)存地址對(duì)于CPU有什么關(guān)系

? ??????CPU就是根據(jù)內(nèi)存地址万皿,可以直達(dá)內(nèi)存所在區(qū)域摧找,執(zhí)行對(duì)應(yīng)代碼。精準(zhǔn)而優(yōu)雅牢硅,速度非车旁牛快!<跤唷综苔!

? ? 5.數(shù)組空間地址關(guān)系

分析圖

? ? 6.null到底是什么

? ? ? ? null是計(jì)算機(jī)中非常特殊的一塊內(nèi)存,該內(nèi)存編號(hào) 0x0000 0000

? ? ? ? 該內(nèi)存收到系統(tǒng)保護(hù)? ? 不只是電腦位岔,包裹手機(jī)座云,ipad愉择,智能設(shè)備,只要存在計(jì)算機(jī)基本結(jié)構(gòu)的設(shè)備上都存在null編號(hào)為0x0內(nèi)存。大小一個(gè)字節(jié)

? ? ? ? 不能讀取該內(nèi)存的任何數(shù)據(jù)锣夹,也不能寫(xiě)入任何數(shù)據(jù)傍念。一旦操作蜡坊,程序直接被系統(tǒng)殺死kill-9

? ? ? ? 一般用于引用數(shù)據(jù)類型的初始化峦剔,利用開(kāi)發(fā)中關(guān)于null的異常,輔助找出代碼中的錯(cuò)誤惠勒。

? ? ? ? NullPointerException

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赚抡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纠屋,更是在濱河造成了極大的恐慌涂臣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件售担,死亡現(xiàn)場(chǎng)離奇詭異肉康,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)灼舍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)吼和,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人骑素,你說(shuō)我怎么就攤上這事炫乓「斩幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵末捣,是天一觀的道長(zhǎng)侠姑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)箩做,這世上最難降的妖魔是什么莽红? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮邦邦,結(jié)果婚禮上安吁,老公的妹妹穿的比我還像新娘。我一直安慰自己燃辖,他們只是感情好鬼店,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著黔龟,像睡著了一般妇智。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氏身,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天巍棱,我揣著相機(jī)與錄音,去河邊找鬼蛋欣。 笑死拉盾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豁状。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼倒得,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泻红!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起霞掺,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谊路,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后菩彬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缠劝,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年骗灶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惨恭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耙旦,死狀恐怖脱羡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤锉罐,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布帆竹,位于F島的核電站,受9級(jí)特大地震影響脓规,放射性物質(zhì)發(fā)生泄漏栽连。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一侨舆、第九天 我趴在偏房一處隱蔽的房頂上張望秒紧。 院中可真熱鬧,春花似錦态罪、人聲如沸噩茄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绩聘。三九已至,卻和暖如春耗啦,著一層夾襖步出監(jiān)牢的瞬間凿菩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工帜讲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衅谷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓似将,卻偏偏與公主長(zhǎng)得像获黔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子在验,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348