java数据结构_概述Java中的数据结构是什么及其内部实现原理
本文主講介紹幾種常用的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)是一種容器的一個(gè)分支,容器時(shí)用來(lái)裝東西的,那么數(shù)據(jù)結(jié)構(gòu)就是專門用來(lái)存儲(chǔ)數(shù)據(jù)的容器。首先我們從數(shù)組來(lái)給大家漸漸引入數(shù)據(jù)結(jié)構(gòu),容器的概念。那么數(shù)組是什么呢,數(shù)組是一個(gè)對(duì)象,準(zhǔn)確的說(shuō)我們將對(duì)象進(jìn)行分類,具有特定功能的對(duì)象就被成為數(shù)據(jù)結(jié)構(gòu)或者容器,集合等,數(shù)組就是其中之一。有一個(gè)人說(shuō)過(guò)程序就是算法與數(shù)據(jù)結(jié)構(gòu),這句話大體上能夠描述程序。
我們從數(shù)組的特性來(lái)慢慢延伸到集合。如果面試官要你介紹一下數(shù)組該怎么說(shuō)呢,它的容量是固定的,其中每個(gè)元素對(duì)應(yīng)一個(gè)唯一的下標(biāo),通過(guò)下標(biāo)我們可以找到相應(yīng)的元素,那么這種通過(guò)K找到V的結(jié)構(gòu)我們稱為表對(duì)吧。
首先從數(shù)組的容量來(lái)看,它的容量是在一開始被創(chuàng)建就固定了的,如int[] i={1,2,3};或者int[] is=new int[8];那我們?nèi)绾螌?duì)數(shù)組進(jìn)行擴(kuò)容呢,看如下代碼
擴(kuò)容用乘法,縮減用除法,使用原有數(shù)組長(zhǎng)度作為一個(gè)新的標(biāo)準(zhǔn)量來(lái)參照擴(kuò)大或縮小的倍數(shù),那為什么不手動(dòng)輸入一個(gè)數(shù)字來(lái)定義數(shù)組大小呢,那樣就把代碼寫死了,實(shí)際上應(yīng)該是原數(shù)組長(zhǎng)度*n。我們除了會(huì)對(duì)容量進(jìn)行操作外,其次就是最重要的增刪了,改是非常簡(jiǎn)單的,直接通過(guò)下標(biāo)取出元素然后賦值即可。那么我該如何向數(shù)組中刪除一個(gè)元素呢
這是我剛剛學(xué)習(xí)java時(shí)寫的一小段代碼,它用于刪除數(shù)組指定下標(biāo)的元素,邏輯就是將要?jiǎng)h除的下標(biāo)置換到數(shù)組尾部然后縮減數(shù)組長(zhǎng)度,添加也是同樣的方法,總之是非常的麻煩,那么對(duì)數(shù)組這種結(jié)構(gòu)可以歸納為數(shù)組是一種被創(chuàng)建時(shí)長(zhǎng)度固定,難增刪的數(shù)據(jù)結(jié)構(gòu),但是它由于有下標(biāo)作為索引所以能夠快速定位到指定下標(biāo)的元素,同時(shí)java.util.Arrays是JDK提供的對(duì)數(shù)組操作的工具類,它用于幫助我們更好地使用數(shù)組,包括
//Arrays.sort(a, c);//Arrays.binarySearch(a, key) //Arrays.deepEquals(a1, a2) //Arrays.parallelPrefix(array, op); //Arrays.stream(array)
這幾種方法,第一個(gè)排序,第二個(gè)使用二分法搜索,第三個(gè)判斷兩個(gè)數(shù)組是否每個(gè)元素都一致,第四第五都是JDK8提供的,用于函數(shù)式編程。其他還有fill填充等,可以自己挨個(gè)去看看。
它還有一個(gè)很有意思的方法叫做Arrays.asList(),該方法要求傳入一個(gè)數(shù)組變量然后能夠?qū)?shù)組轉(zhuǎn)為L(zhǎng)ist,那么List是什么呢?
List是一種非常常用的數(shù)據(jù)結(jié)構(gòu),叫做鏈表。為了避免數(shù)組插入和刪除對(duì)資源的線性開銷,就是數(shù)組長(zhǎng)度越長(zhǎng)添加元素耗費(fèi)的資源就越多,使用不連續(xù)存儲(chǔ)的鏈表就能夠解決這個(gè)問(wèn)題。鏈表的思想是每個(gè)元素首位相連,因?yàn)榻凶鲦湵硭运鋵?shí)還是一種KV結(jié)構(gòu),第一個(gè)元素的V作為第二個(gè)元素的K,第二個(gè)元素的V作為第三個(gè)元素的K,最后一個(gè)元素的V為null。如果不明白的話可以想象一下電影人體蜈蚣,這種結(jié)構(gòu)的好處就是我們對(duì)其增刪只需要斷開前一個(gè)元素的V和后一個(gè)元素的K即可,就像插件一樣,是可插拔的。List是一個(gè)接口,它有兩個(gè)子類,ArrayList和LinkedList,看名字就可以看得出一種是基于數(shù)組實(shí)現(xiàn)另一個(gè)是基于鏈表實(shí)現(xiàn)的。LinkedList相比ArrayList而言有更高效的插入和刪除執(zhí)行速度, LinkedList才是真正意義上的鏈表。鏈表的特點(diǎn)就是增刪快,但是搜索指定元素消耗的資源也是呈現(xiàn)線性增長(zhǎng)的。
除了數(shù)組和鏈表之外還有很多很多種延伸出的結(jié)構(gòu)被用作不同的應(yīng)用場(chǎng)景,如果你理解數(shù)組和鏈表那么遇到新的數(shù)據(jù)結(jié)構(gòu)也會(huì)容易上手,也可以自定義一個(gè)自己需要的容器。Set是一種自帶去重的容器,它和List一樣同屬Collection的子類,特點(diǎn)就是不會(huì)出現(xiàn)重復(fù)元素。有兩個(gè)常用子類hashSet和linkedHashSet,hashSet的內(nèi)部是一個(gè)hashMap,特點(diǎn)是取出元素的順序不一定與存入順序一致,它沒(méi)有一個(gè)專門用于記錄順序的索引, linkedHashSet是一個(gè)有序的set,它有專門用于記錄順序的索引。
下一個(gè)數(shù)據(jù)結(jié)構(gòu)就是Map,map是一種特殊的結(jié)構(gòu),它內(nèi)部?jī)?chǔ)存的是鍵值對(duì),與List都是同為表,區(qū)別就是map的K是可以被我們使用的,它將K,V封裝為一個(gè)整體Entry,這里的Entry作為一個(gè)元素,相當(dāng)于List中的一個(gè)元素,然后Entry中還有兩個(gè)元素K和V。Map接口有一個(gè)上面提到過(guò)的子類HashMap,只要看帶有Hash前綴的容器就說(shuō)明,它的索引是由哈希算法也叫散列算法計(jì)算得出的,它是一種摘要算法也就是我們常用的md5,sha256的原型,這種算法計(jì)算得出的索引是唯一的,那么map的特點(diǎn)就是Entry中的K唯一,V可以重復(fù)。它也提供了很多自己獨(dú)有的API,所以map的應(yīng)用面積較廣。本次代碼較少,接下來(lái)將從代碼層面深入講解每個(gè)容器的實(shí)現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的java数据结构_概述Java中的数据结构是什么及其内部实现原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 量子力学学习书籍
- 下一篇: python 通过ip获取城市_pyth