生活随笔
收集整理的這篇文章主要介紹了
【数据结构与算法-java实现】三 Java数组类实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 上一篇文章學習了:最好、最壞、平均、均攤時間復雜度的計算與分析方法.
- 本片文章學習數組這種結構。由于數組這種結構比較簡單,本文直接簡單介紹,然后給出兩種實現數組類的Java代碼:整形數組類與通用性的數組類
由于數組是相比于其他數據結構實在太簡單,這里我們只做簡單的介紹,然后直接給出實現的代碼。
文章目錄
- 1 數組的概念
- 2 整形數組類的實現
- 3 通用型數組類的實現
- 4 總結
1 數組的概念
數組(Array)是一種線性表數據結構。它用一組連續的內存空,來存儲一組具有相同類型的數據。對于線性表和非線性表這里不再多說。
我們要注意數組它是連續的內存空間和相同的數據類型。
還有一點就是我們要明白數組是如何做到根據下標來訪問數組的元素的。我們拿一個長度為10的int類型的數組int[] a=new int[10];來說明。如下圖是申請內存后數組元素的存儲方式。
假設上述數組的起始地址為1000.當CPU要訪問某一個數組的元素時,將會通過下面的公式進行訪問元素:
a[i]_address = base_address + i * data_type_size
其中,base_address 為數組的起始地址。data_type_size為數組元素的類型的大小。
計算機就是通過上述的公式進行數組的隨機訪問的。不像鏈表等非線性結構,無法隨機訪問元素。
- 數組這種結構,雖然具有隨機訪問的高效性,但是它的插入和刪除確實非常的低效。
- 以及數組的訪問也是很容易越界的
以上插入和刪除的低效,這里不再贅述。
我們注意一下數組訪問的越界。
1.1 Java中數組的越界訪問
在講述Java中數組的越界訪問之前,先來看一下C語言的越界訪問。如下代碼:
int main(int argc
, char* argv
[]){int i
= 0;int arr
[3] = {0};for(; i
<=3; i
++){arr
[i
] = 0;printf("hello world\n");}return 0;
}
上述代碼運行后,并非是打印3次hello world,而是無限次的打印hello world。這是為什么?
數組arr的大小是3,但是上面的for循環由于書寫錯誤,訪問了arr[3],這就是越界訪問。在C語言中,只要不是訪問內存受限的地方,所有的內存都是可以訪問的。所以由上面的數組訪問的公式,a[3]也被定位到一塊內存上,而這塊內存中存儲的剛好是局部變量i。那么arr[3]實際上就是i,這就導致此時又將i賦值為0。此時回到for循環發現i是0,繼續循環。。。。。
數組越界在C語言中是一種未決行為,并沒有規定數組越界訪問時應該如何處理。因為數組訪問的本質是訪問一段連續的內存,只要數組通過偏移計算得到的內存是可用的,那么程序就可能不會報任何錯誤。C語言中這種行為,很難debug到錯誤。
但是不像c語言,Java語言不允許這種越界訪問。Java編譯器會做越界檢查,如果有越界訪問,將會拋出異常。如:java.lang.ArrayIndexOutOfBoundsException。
2 整形數組類的實現
由于數組比較簡單,上面的內容我覺的就夠了。下面直接給出int數組類的實現。可以直接在eclipse編譯運行的代碼。代碼如下:
package Array
;public class Array {public int data
[];private int len
;private int cnt
;public Array(int capacity
) {this.data
=new int[capacity
];this.len
=capacity
;this.cnt
=0;}public int find(int index
) {if(index
<0 || index
>=len
)return -1;return data
[index
];}public boolean insert(int index
, int value
) {if(cnt
==len
) {System
.out
.println("數組空間已滿,無法插入!");return false;}if(index
<0 || index
>=len
) {System
.out
.println("插入位置不合法!");return false;}for(int i
=cnt
;i
>index
;--i
) {data
[i
]=data
[i
-1];}data
[index
]=value
;++cnt
;return true;}public boolean delete(int index
) {if(index
<0 || index
>=len
)return false;for(int i
=index
+1;i
<len
;i
++) {data
[i
-1]=data
[i
];}--cnt
;return true;}public void printAll() {for(int i
=0;i
<len
;i
++) {System
.out
.print(data
[i
]+" ");}System
.out
.println();}public static void main(String args
[]) {Array array
= new Array(5);array
.printAll();array
.insert(0,3);array
.insert(0, 4);array
.insert(1, 5);array
.insert(2, 2);array
.insert(3, 6);array
.insert(4, 8);array
.printAll();}
}
以上代碼只實現了數組類的插入和刪除。更多的方法在下面的通用性數組的實現里面。
3 通用型數組類的實現
下面是實現通用的數組類,也就是大家所知的泛型。C++中叫做模板。
下面的代碼已經經過測試,是可以正常使用的。如果你發現有其他bug,請在下方留言評論。
代碼如下:
package Array
;public class GenericArray<T>{private T
[] data
;private int size
;public GenericArray(int capacity
) {data
= (T
[])new Object[capacity
];size
=0;}public GenericArray() {this(10);}public int getCapacity() {return data
.length
;}public int count() {return size
;}public boolean isEmpty() {return size
==0;}public void set(int index
, T e
) {checkIndex(index
);data
[index
]=e
;}public T
get(int index
) {checkIndex(index
);return data
[index
];}public boolean contains(T e
) {for(int i
=0;i
<this.size
;++i
) {if(data
[i
].equals(e
))return true;}return false;}public int find(T e
) {for(int i
=0;i
<this.size
;++i
) {if(data
[i
].equals(e
))return i
;}return -1;}public void add(int index
, T e
) {checkIndex(index
);if(size
==data
.length
) {resize(2*data
.length
);}for(int i
=size
-1;i
>=index
;--i
) {data
[i
+1]=data
[i
];}data
[index
]=e
;size
++;}public void addFirst(T e
) {add(0, e
);}public void addLast(T e
) {add(size
, e
);}public T
remove(int index
) {chaeckIndexForRemove(index
);T ret
=data
[index
];for(int i
=index
+1;i
<size
;++i
) {data
[i
-1]=data
[i
];}--size
;data
[size
]=null
;if(size
== (data
.length
/4) && (data
.length
/2)!=0) {resize(data
.length
/2);}return ret
;}public T
removeFirst() {return remove(0);}public T
removeLast() {return remove(size
-1);}public void removeElement(T e
) {int index
=find(e
);if(index
!=-1) {remove(index
);}}@Overridepublic String
toString() {StringBuilder builder
= new StringBuilder();builder
.append(String
.format("Array size = %d, capacity = %d \n", size
, data
.length
));builder
.append('[');for (int i
= 0; i
< size
; i
++) {builder
.append(data
[i
]);if (i
!= size
- 1) {builder
.append(", ");}}builder
.append(']');return builder
.toString();}private void chaeckIndexForRemove(int index
) {if(index
< 0 || index
>= size
) {throw new IllegalArgumentException("remove failed! Require index >=0 and index < size.");}}private void resize(int capacity
) {T
[] newData
= (T
[])new Object[capacity
];for(int i
=0;i
<size
;++i
) {newData
[i
]=data
[i
];}data
=newData
;}private void checkIndex(int index
) {if(index
<0 || index
>size
) {throw new IllegalArgumentException("Add failed! Require index >=0 and index <= size.");}}public static void main(String args
[]) {GenericArray
<Integer> a
= new GenericArray<Integer>(5);a
.add(0, 2);a
.add(1, 4);a
.add(2, 3);a
.add(3, 7);a
.add(4, 9);for(int i
=0;i
<a
.size
;++i
) {System
.out
.print(a
.get(i
)+" ");}System
.out
.println();a
.remove(1);for(int i
=0;i
<a
.size
;++i
) {System
.out
.print(a
.get(i
)+" ");}a
.addFirst(23);System
.out
.println();for(int i
=0;i
<a
.size
;++i
) {System
.out
.print(a
.get(i
)+" ");}a
.addLast(24);System
.out
.println();for(int i
=0;i
<a
.size
;++i
) {System
.out
.print(a
.get(i
)+" ");}}
}
4 總結
學習交流加
- 個人qq: 1126137994
- 個人微信: liu1126137994
- 學習交流資源分享qq群: 962535112
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的【数据结构与算法-java实现】三 Java数组类实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。