iOS 數據結構

  1. 數組和鏈表的區別
  • 數組 地址連續,查找速度快,操做效率低 存儲單元在定義時分配,元素個數固定,內存空間要求高
  • 鏈表 地址不連續,查找速度慢,操做效率高 存儲單元在程序執行時動態申請,可按需動態增減
  1. iOS內存分區的狀況,五大區域
  • 棧區Stack 先進後出FILO 由編譯器自動分配和釋放 棧空間多線程不共享 連續的內存地址,由高向低分配,不會產生碎片 空間較小,運行速度較快,效率高 棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高
  • 堆區Heap 分配方式相似鏈表,先進先出FIFO 通常須要手動分配和釋放 堆內存多線程共享 不連續的內存地址,由低向高分配,容易產生碎片 空間較大,運行速度較慢,效率不如棧 計算機底層並無對堆的支持,堆是有C/C++函數庫提供的,加上碎片問題,致使堆的效率比棧低
  • 全局區 全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域.data段,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域.bss段 程序結束後由系統釋放
  • 常量區 常量字符串就是放在這裏的 程序結束後由系統釋放
  • 代碼區 存放函數體的二進制代碼

內存分區

  • 當一個app啓動後,代碼區、常量區、全局區大小就已經固定,所以指向這些區的指針不會產生崩潰性的錯誤。而堆區和棧區是時時刻刻變化的(堆的建立銷燬,棧的彈入彈出),因此當使用一個指針指向這個區裏面的內存時,必定要注意內存是否已經被釋放,不然會產生程序崩潰(也便是野指針報錯)
  1. Hash表 哈希表(Hash table,也叫散列表)是根據鍵Key直接訪問在內存中存儲位置的數據結構。也就是說,它經過計算一個關於鍵值的函數,將所需查詢的數據映射到表中一個位置來訪問記錄,這加快了查找速度。這個映射函數叫作散列函數,存放記錄的數組叫作散列表。通俗講就是把Key經過一個固定的算法函數(hash函數)轉換成一個整型數字,而後就對該數字用數組的長度進行取餘,取餘結果就看成數組的下標,將value存儲在以該數字爲下標的數組空間裏。當使用hash表查詢時,就是使用hash函數將key轉換成對應的數組下標,並定位到該下標的數組空間裏獲取value,這樣就充分利用到數組的定位性能進行數據定位git

  2. iOS裏有哪些地方用到了Hashgithub

附:個人博客地址算法

相關文章
相關標籤/搜索