Java數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組(動力節(jié)點(diǎn)之Java學(xué)院整理)
數(shù)組的用處是什么呢?——當(dāng)你需要將30個(gè)數(shù)進(jìn)行大小排列的時(shí)候,用數(shù)組這樣的數(shù)據(jù)結(jié)構(gòu)存儲是個(gè)很好的選擇,當(dāng)你是一個(gè)班的班主任的時(shí)候,每次要記錄那些學(xué)生的缺勤次數(shù)的時(shí)候,數(shù)組也是很有用。數(shù)組可以進(jìn)行插入,刪除,查找等。
1)創(chuàng)建和內(nèi)存分配
Java中有兩種數(shù)據(jù)類型,基本類型和對象類型,也有人稱為引用類型,Java中把數(shù)組當(dāng)成對象,創(chuàng)建數(shù)組時(shí)使用new操作符。
int array[] = new int[10];
既然是對象,那么array便是數(shù)組的一個(gè)引用,根據(jù)Java編程思想(一) —— 一切都是對象 的內(nèi)存分配,array會在棧中開辟空間,并且空間存儲著保存數(shù)組存儲的地址,真正保存對象的地方是對,new操作在堆中開辟了所需的空間,然后array指向頭地址。
初始化:
public class UseArray {
public static void main(String[] args) {
int array[] = new int[10];
System.out.println(array[2]);
UseArray a[] = new UseArray[12];
System.out.println(a[1]);
int array2[] ={1,2,3,4,5,5,6};
}
}
new后的數(shù)組里面的值被默認(rèn)初始化為0,而對象的初始化是空的,null,當(dāng)然還可以通過{}的方式初始化。
2)數(shù)組封裝后的使用
public class UseArray {
private int[] array;
private int number = 0;
public UseArray(int max){
array = new int[max];
}
public void insert(int value){
array[number] = value;
number++;
}
public int find(int value){
for (int i= 0; i < number; i++) {
if(array[i]==value)
return i;
}
return number;
}
public boolean delete(int value){
int index = find(value);
if(index != number){
for (int i = index; i < number-1; i++) {
array[i] = array[i+1];
}
number--;
return true;
}
return false;
}
public void display(){
for (int i = 0; i < number; i++) {
System.out.printf(array[i]+" ");
}
}
public static void main(String[] args) {
UseArray ua = new UseArray(5);
ua.insert(1);
ua.insert(2);
ua.insert(6);
ua.insert(7);
ua.insert(3);
ua.display();
if(ua.find(5) != ua.number){
System.out.println("find,the number index is "+ua.find(5));
}else{
System.out.println("not found!");
}
if(ua.delete(5)!=true){
System.out.println("can not delete!");
}
ua.display();
}
}
將整個(gè)數(shù)組封裝,用number代替數(shù)組的個(gè)數(shù),插入數(shù)據(jù)的時(shí)候也不必理會往哪個(gè)下標(biāo)插,當(dāng)然,也可以自定義一個(gè)具體下標(biāo)的方法。
方法比較簡單就不介紹了,但是存在的一個(gè)缺點(diǎn)在delete那里,其實(shí)只是從刪除元素開始的左移而已,所以,雖然number減少了,但是最后一個(gè)元素并沒有刪除掉,只是display輸出展示的時(shí)候隱藏了而已,但是,下次插入元素的時(shí)候新元素便會取代掉最后一個(gè)元素的位置。
3)查找優(yōu)化——二分查找
public int find(int value){
int start = 0;
int end = number-1;
while(end>=start){
int index =(end + start)/2;
if(array[index]==value){
return index;
}else if(array[index] >value){
end = index-1;
}else {
start = index+1;
}
}
return number;
}
二分查找前提是數(shù)組已經(jīng)有序。剛開始index寫成end和start相減,造成死循環(huán)。其實(shí)要的是相加。1,2,3,6,7。index=2,value=7,3小于7,start=3,那么index要的是3和4間的中間數(shù),所以是相加之后除以2,6小于7,start=4,find到7。
4)大O表示法
設(shè)N為數(shù)據(jù)總數(shù),加入插入一個(gè)數(shù)據(jù)時(shí)間為K。那么線性查找總時(shí)間T=K*N/2,因?yàn)椴檎业脑挻蟾艦楸容^數(shù)目的一半。
二分查找的話T=k*log2(N)。大O表示法,O可以看成是order of,大約是的意思,k/2也是常數(shù),所以可以看成是O(N)。
數(shù)組的缺點(diǎn)呢,就是大小固定,查找慢,如果你要經(jīng)常查找百萬級別的數(shù)據(jù),還會用數(shù)組嗎?不會的,所以數(shù)據(jù)結(jié)構(gòu)的選用要結(jié)合具體的實(shí)際情況,達(dá)到最大的效率值。
以上所述是小編給大家介紹的Java數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組(動力節(jié)點(diǎn)之Java學(xué)院整理),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之?dāng)?shù)組
- Java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)二維數(shù)組與稀疏數(shù)組轉(zhuǎn)換詳解
- Java數(shù)據(jù)結(jié)構(gòu)與算法之稀疏數(shù)組與隊(duì)列深入理解
- java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):稀疏數(shù)組
- 淺談Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組知識總結(jié)
- java數(shù)據(jù)結(jié)構(gòu)和算法中數(shù)組的簡單入門
- 詳解Java數(shù)據(jù)結(jié)構(gòu)和算法(有序數(shù)組和二分查找)
- java數(shù)據(jù)結(jié)構(gòu)與算法之雙向循環(huán)隊(duì)列的數(shù)組實(shí)現(xiàn)方法
- Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之?dāng)?shù)組
相關(guān)文章
java開發(fā)主流定時(shí)任務(wù)解決方案全橫評詳解
這篇文章主要為大家介紹了java開發(fā)主流定時(shí)任務(wù)解決方案全橫評詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
java如何實(shí)現(xiàn)post請求webservice服務(wù)端
這篇文章主要介紹了java如何實(shí)現(xiàn)post請求webservice服務(wù)端,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Springboot 整合 Java DL4J 實(shí)現(xiàn)智能客服功能
本文主要介紹了如何使用SpringBoot整合JavaDeeplearning4j來構(gòu)建一個(gè)智能客服系統(tǒng),詳細(xì)探討了神經(jīng)網(wǎng)絡(luò)選擇、數(shù)據(jù)集格式、技術(shù)介紹、Maven依賴、代碼示例等內(nèi)容,為構(gòu)建高效、便捷、個(gè)性化的客戶服務(wù)提供了理論支持和實(shí)踐指導(dǎo)2024-10-10
解讀動態(tài)數(shù)據(jù)源dynamic-datasource-spring-boot-starter使用問題
這篇文章主要介紹了解讀動態(tài)數(shù)據(jù)源dynamic-datasource-spring-boot-starter使用問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼
這篇文章主要介紹了Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
手把手教你用Java實(shí)現(xiàn)一套簡單的鑒權(quán)服務(wù)
現(xiàn)今大部分系統(tǒng)都會有自己的鑒權(quán)服務(wù),本文介紹了最常用的鑒權(quán)服務(wù),就是日常用戶的登錄登出,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

