大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 動態數組的實現和功能

動態數組的實現和功能

更新時間:2020-10-16 17:30:21 來源:動力節點 瀏覽1406次

我們都知道數組(Array)是有序的元素序列,而在某種程度上,數組又可以劃分為動態數組和靜態數組。動態數組是指在聲明時沒有確定數組大小的數組,即忽略圓括號中的下標;當要用它時,可隨時用ReDim語句重新指出數組的大小。本文就來和大家一起來探討動態數組的相關知識。


Objective-C中的NSMutableArray就是一個動態數組,不用指定數組的長度就可以放心向里邊添加元素,不需要考慮溢出的問題。實現動態數據的方式非常多,例如對靜態數組進行封裝擴容或者鏈表,甚至多種方式混合使用,根據數據量的大小來動態改變自己的數據結構。這里就使用最簡單的根據靜態數據動態擴容的方式,來實現一個動態數組。

為了實現一套完整的自定義數據結構,這里對靜態數組的封裝,使用的是之前自定義靜態數組,因為Objective-C并沒有封裝好的靜態數組可用,實際上就是一個可以存放指針并且內部維持Objective-C引用計數的指針數組。


自定義動態數組的效果

JKRArrayList *array = [JKRArrayList new];

for (NSUInteger i = 0; i < 60; i++) {

[array addObject:[Person personWithAge:i]];

}

NSLog(@"添加后 %@", array);

打印:

--- 擴容: 16 -> 24 ---

--- 擴容: 24 -> 36 ---

--- 擴容: 36 -> 54 ---

--- 擴容: 54 -> 81 ---

添加后 size=60, {

...

}

[array removeAllObjects];

NSLog(@"清空后 %@", array);

打印:

dealloc

dealloc

dealloc

...

dealloc

清空后 size=0, {

}


上面說的是動態數組的具體實現,下面我們一起來看動態數組的基本功能。

動態數組的應該提供的功能仿照NSMutableArray來設計,由于之后還會用多種鏈表來實現動態數組,所以還會有很多相同的處理邏輯和接口,這里先定義一個動態數組的基類:

@interface JKRBaseList: NSObject {

@protected

// 記錄動態數組的當前長度

NSUInteger _size;

}

- (NSUInteger)count;

- (void)rangeCheckForAdd:(NSUInteger)index;

- (void)rangeCheckForExceptAdd:(NSUInteger)index;

- (void)addObject:(nullable ObjectType)anObject;

- (BOOL)containsObject:(nullable ObjectType)anObject;

- (nullable ObjectType)firstObject;

- (nullable ObjectType)lastObject;

- (void)removeFirstObject;

- (void)removeLastObject;

- (void)removeObject:(nullable ObjectType)anObject;

- (_Nullable ObjectType)objectAtIndexedSubscript:(NSUInteger)idx;

- (void)setObject:(_Nullable ObjectType)obj atIndexedSubscript:(NSUInteger)idx;

@end

@interface JKRBaseList(JKRBaseList)

- (void)insertObject:(nullable ObjectType)anObject atIndex:(NSUInteger)index;

- (void)removeObjectAtIndex:(NSUInteger)index;

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(nullable ObjectType)anObject;

- (nullable ObjectType)objectAtIndex:(NSUInteger)index;

- (NSUInteger)indexOfObject:(nullable ObjectType)anObject;

- (void)removeAllObjects;

- (void)enumerateObjectsUsingBlock:(void (^)(_Nullable ObjectType obj, NSUInteger idx, BOOL *stop))block;

@end


JKRBaseList是所有動態數組的基類,之所以有一部分在擴展里邊寫,是為了便于區分,擴展內的接口是需要子類實現的,而擴展之外的接口則是不同方式實現的動態數組都相同的處理,不需要子類重寫,只要JKRBaseList自己實現即可。把不需要JKRBaseList實現的方法寫在擴展的好處就是不需要在JKRBaseList.m里邊寫接口的具體實現,如果定義成它的方法聲明而不去實現的話,編譯器會報警告。另外分成兩部分寫,也便于區分哪些是子類需要實現的。

系統的NSArray和NSMutableArray都允許存放nil,這里為了擴容功能,所以允許傳入并保存nil到數據中。

首先先看一下JKRBaseList里邊的成員變量:NSUInteger _size; 這個變量是所有動態數組都需要的,它負責記錄當前動態數組的長度。因為動態數組對外部可見的長度和內部真實的長度是不一定一致的,比如現在我們要實現的通過靜態數組封裝的動態數組,剛剛開始初始化的時候,動態數組對象內部保存的靜態數組長度可能是16,而外部展示的長度則為0,因為還沒有添加任何元素。如果用鏈表來實現動態數組的話,同樣需要記錄數組長度,否則每次都要遍歷鏈表所有節點來累加計算數組長度。


以上就是我們對動態數組的實現和功能的簡單介紹,實際上,動態數組可以在任何時候改變大小,在靈活、方便的同時也有助于有效管理內存。是不是已經感受到了動態數組的神奇和強大的能力了?其實,數組的魅力遠不止如此,‘’欲窮千里目,更上一層樓。‘’,觀看本站的Java零基礎教程,領略更加奧妙的數組風情吧!


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 成年女人视频播放免费观看 | 婷婷六月色 | 狠狠干图片 | 尹人香蕉99久久综合网站 | 四虎免费永久观看 | 99热久久精品国 | 亚洲最新在线视频 | 亚洲天天做夜夜做天天欢人人 | 亚洲人jizz| 精品国产自在现线看久久 | 国产91在线 | 日本 | 在线久综合色手机在线播放 | 免费观看四虎精品国产永久 | 欧美xxxx狂喷水喷水 | 欧美激情欧美狂野欧美精品免费 | 国产玖玖视频 | 四虎精品成人免费影视 | 91精品成人免费国产 | 国产v欧美v日韩在线观看 | 兔子bt资源在线 | 日韩综合一区 | 国产或人精品日本亚洲77美色 | 国产精品久久国产三级国不卡顿 | 青春草国产成人精品久久 | 欧美在线视频一区二区 | 国产福利精品在线观看 | 中国女人内谢25xxxxx | 欧美国产伦久久久久 | 性久久久久久久久久 | 欧美大成色www永久网站 | 伊在人亚洲香蕉精品播放 | 亚洲欧美日韩国产精品26u | 黄色免费观看视频网站 | 亚洲综合激情九月婷婷 | 在线视频日韩精品 | 日韩黄色大片 | 一级黄色片免费 | 夜夜精品视频 | 国产精品亚洲一区二区在线观看 | 久色网 | 国内精品伊人久久久久7777人 |