牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树
?
?
? 不多說,直接上干貨!
首先來說一個非常形象的例子,來說明下數組和鏈表。
上體育課的時候,老師說:你們站一隊,每個人記住自己是第幾個,我喊到幾,那個人就舉手,這就是數組。
老師說,你們每個人記住自己前面的人和后面的人,然后老師只知道第一人是誰。 然后你們各自由活動,老師要找某一個人,是不是每次都是從第一個開始往自己身后的人開始傳達?這就是鏈表。
老師說: 大家1,2,3,4報數,凡是報1,為1隊,凡是報2的為2隊....... ?這就是散列(哈希)。而這個4就相當于預定義好的桶的個數。
?
程序中,存放指定的數據最常用的數據結構有兩種:數組和鏈表。
?
數組和鏈表的區別:
1、 ?數組是將元素在內存中連續存放。
? ? ? 鏈表中的元素在內存中不是順序存儲的,而是通過存在元素中的指針聯系到一起。
2、 ?數組必須事先定義固定的長度,不能適應數據動態的增減的情況。當數據增加時,可能超出原先定義的元素個數;當數據減少時,造成內存浪費;
鏈表動態地進行存儲分配,可以適應數據動態地增減的情況。
3、(靜態)數組從棧中分配空間,對于程序員方便快速,但是自由度小;
鏈表從堆中分配空間,自由度大但是申請管理比較麻煩。
?
數組和鏈表在存儲數據方面到底誰好?根據數組和鏈表的特性,分兩種情況討論:
1、當進行數據查詢時,數組可以直接通過下標迅速訪問數組中的元素。
? ? ?而鏈表則需要從第一個元素開始一直找到需要的元素位置,
? ? ?顯然,數組的查詢效率會比鏈表的高。
2、當進行增加或刪除元素時,在數組中增加一個元素,需要移動大量元素,在內存中空出一個元素的空間,然后將要增加的元素放在其中。
? ? ? ? ? ? ?同樣,如果想刪除一個元素,需要移動大量去填掉被移動的元素,而鏈表只需改動元素中的指針即可實現增加或刪除元素。
?
?
那么哈希表,是既能具備數組的快速查詢的優點,又能融合鏈表方便快捷的增加刪除元素的優勢。
所謂的hash,簡單的說就是散列,即將輸入的數據通過hash函數得到一個key值,輸入的數據存儲到數組中下標的key值的數組單元中去。
?
?
?
?
Java中數據存儲方式最底層的兩種結構,一種是數組,另一種就是鏈表。
數組的特點:連續空間,尋址迅速,但是在刪除或者添加元素的時候需要有較大幅度的移動,所以查詢速度快,增刪較慢。
而鏈表正好相反,由于空間不連續,尋址困難,增刪元素只需修改指針,所以查詢慢、增刪快。
有沒有一種數據結構來綜合一下數組和鏈表,以便發揮他們各自的優勢?答案是肯定的!就是:哈希表。
哈希表具有較快(常量級)的查詢速度,及相對較快的增刪速度,所以很適合在海量數據的環境中使用。一般實現哈希表的方法采用“拉鏈法”,我們可以理解為“鏈表的數組”,如下圖:
哈希表。如拿HashMap來說。
?
從上圖中,我們可以發現哈希表是由數組 ?+ ? 鏈表組成的,一個長度為16的數組中,每個元素存儲的是一個鏈表的頭結點。那么這些元素是按照什么樣的規則存儲到數組中呢。一般情況是通過hash(key)%len獲得,也就是元素的key的哈希值對數組長度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存儲在數組下標為12的位置。它的內部其實是用一個Entity數組來實現的,屬性有key、value、next。
總結
以上是生活随笔為你收集整理的牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爆牙齿的世界杯日记(小组末轮AB组)
- 下一篇: java美元兑换,(Java实现) 美元