日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【数据结构与算法-java实现】三 Java数组类实现

發布時間:2023/12/10 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构与算法-java实现】三 Java数组类实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 上一篇文章學習了:最好、最壞、平均、均攤時間復雜度的計算與分析方法.
  • 本片文章學習數組這種結構。由于數組這種結構比較簡單,本文直接簡單介紹,然后給出兩種實現數組類的Java代碼:整形數組類與通用性的數組類

由于數組是相比于其他數據結構實在太簡單,這里我們只做簡單的介紹,然后直接給出實現的代碼。

文章目錄

  • 1 數組的概念
    • 1.1 Java中數組的越界訪問
  • 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編譯運行的代碼。代碼如下:

  • Array.java
package Array;/*** 1) 數組的插入、刪除、按照下標隨機訪問操作;* 2)數組中的數據是int類型的;**/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;//一開始一個數據都誒呦,所以為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,請在下方留言評論。

代碼如下:

  • GenericArray.java
package Array;//這個可能你的不一樣public class GenericArray<T>{private T[] data;private int size;//構造函數public GenericArray(int capacity) {data = (T[])new Object[capacity];size=0;}//無參構造方法,默認數組容量為10public GenericArray() {this(10);}//獲取數組容量public int getCapacity() {return data.length;}//獲取當前元素個數public int count() {return size;}//判斷數組是否為空public boolean isEmpty() {return size==0;}//修改index位置的元素public void set(int index, T e) {checkIndex(index);data[index]=e;}//獲取對應index位置的元素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;}//獲取對應元素的下標,未找到則返回-1public int find(T e) {for(int i=0;i<this.size;++i) {if(data[i].equals(e))return i;}return -1;}//在index位置插入元素e,時間復雜度是O(m+n)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);}// 刪除index位置的元素并返回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) {// TODO Auto-generated method stubif(index < 0 || index >= size) {throw new IllegalArgumentException("remove failed! Require index >=0 and index < size.");}}//擴容方法,時間復雜度O(n)private void resize(int capacity) {// TODO Auto-generated method stubT[] newData= (T[])new Object[capacity];for(int i=0;i<size;++i) {newData[i]=data[i];}data=newData;}private void checkIndex(int index) {// TODO Auto-generated method stubif(index<0 || index>size) {throw new IllegalArgumentException("Add failed! Require index >=0 and index <= size.");}}//測試用的main,你可以自己寫測試函數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)+" ");}} }
  • 上述代碼在eclipse中運行結果如下:

4 總結

  • 注意數組的插入刪除的效率以及越界訪問

學習交流加

  • 個人qq: 1126137994
  • 個人微信: liu1126137994
  • 學習交流資源分享qq群: 962535112
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【数据结构与算法-java实现】三 Java数组类实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。