大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 詳解自定義數(shù)組隊(duì)列

詳解自定義數(shù)組隊(duì)列

更新時(shí)間:2021-01-04 08:46:27 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1379次

數(shù)組作為所有數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)和獲取速度最快的一種,憑借其獨(dú)特的優(yōu)勢(shì)在數(shù)據(jù)存儲(chǔ)領(lǐng)域獨(dú)領(lǐng)風(fēng)騷。但是數(shù)組也有其自身的局限性,造成了一些不可避免的問題。我們都知道數(shù)組的長度必須是固定的,且一旦定義之后就無法動(dòng)態(tài)的更改,這就會(huì)造成這樣的問題,如果數(shù)組已滿,就無法繼續(xù)添加數(shù)據(jù)。為了解決這個(gè)問題,人們想到了自定義數(shù)組隊(duì)列的方法。

 

試想一下,如果刪除一個(gè)數(shù)據(jù),它的內(nèi)存空間空著沒有被使用。另外數(shù)組只能存儲(chǔ)同一類型的數(shù)據(jù),如果把它設(shè)置成Object類型的話,是可以存不同類型的數(shù)據(jù)了,但是設(shè)想這樣一種情況:現(xiàn)在項(xiàng)目中有定義了一個(gè)Object類型的數(shù)組。項(xiàng)目中擁有很多的圖形類,確實(shí)這個(gè)數(shù)組都能保存,但問題是這時(shí)用戶保存了一個(gè)其他類型的東西,程序是不會(huì)報(bào)錯(cuò)的,因?yàn)轭愋褪荗bject。這樣肯定是不行的。另外在Java中向上轉(zhuǎn)型是安全的,Object類型可以適應(yīng)一切類型,但是向下轉(zhuǎn)型確是不安全的。比如下面的代碼:

package Cbs;

public class Test {

 

public static void main(String[] args) {

//定義Object類型的數(shù)組

Object[] array=new Object[10];

//使用基本數(shù)據(jù)類型的包裝類

Integer i=10;

Float f=12.0f;

//向上轉(zhuǎn)型,沒有問題

array[0]=i;

array[1]=f;

//向下轉(zhuǎn)型

int i1=(int)array[0];

//注意array[1]中存儲(chǔ)的是12.0,但是這樣子語法沒有問題,編譯不會(huì)出錯(cuò)

int i2=(int)array[1];

System.out.println(i1);

System.out.println(i2);//拋出ClassCastException異常

}

 

}

 

也就是說,如果使用這樣的數(shù)組,在轉(zhuǎn)型是發(fā)生問題是很難發(fā)現(xiàn)的。這也是數(shù)組的一個(gè)局限性。那么既然數(shù)組存在這樣的缺陷,我們就要想辦法解決這個(gè)問題。該如何解決呢?數(shù)組長度當(dāng)然是無法發(fā)生變化的,但是數(shù)組名里面存儲(chǔ)的是數(shù)組在內(nèi)存中的首地址這個(gè)確是可以改變的。那么是否可以通過地址的改變來動(dòng)態(tài)改變數(shù)組的大小呢?答案是肯定的。我們可以聲明一個(gè)新的數(shù)組,把它的大小增加到我們想要的程度,然后把原數(shù)組的值copy到新數(shù)組中,再把新數(shù)組賦值給原數(shù)組,這樣操作就可以使得數(shù)組的大小發(fā)生動(dòng)態(tài)改變了。這時(shí)增加一個(gè)數(shù)據(jù)就讓新數(shù)組長度加一,減少一個(gè)數(shù)據(jù),就讓新數(shù)組長度減一就可以了。數(shù)組長度的問題就解決了。那么數(shù)據(jù)類型應(yīng)該如何解決呢?這就要使用Java的泛型搞定了。泛型Java中并不是一種數(shù)據(jù)類型,而是一個(gè)用于表示類型的符號(hào),常用的泛型表示符號(hào)有E、K、Y等。這樣我們?cè)诙x類的時(shí)候就可以指定泛型,然后在類中使用指定的類型返回和輸入,這樣就不會(huì)產(chǎn)生類型的問題了。下面要做的就是定義一個(gè)類,用于操作數(shù)組,也就是我們要講的自定義數(shù)組隊(duì)列。

package com.cbs;

 

/**

 * 自定義數(shù)組隊(duì)列

 * @author CBS

 */

 

public class MyList<E> {//使用泛型E

//聲明一個(gè)Object數(shù)組

private Object[] array;

private int size=0;//記錄隊(duì)列中數(shù)據(jù)類型的長度

private int initCount=0;//初始化時(shí)數(shù)組的大小,默認(rèn)為0

private int incresCount=1;//數(shù)組已滿時(shí),每次數(shù)組的增長長度

/**

 * 構(gòu)造方法

 * @param initCount 為數(shù)組的初始長度

 */

public MyList(int initCount){

this.initCount=initCount;

array=new Object[initCount];

}

/**

 * 構(gòu)造方法

 * @param initCount 為數(shù)組的初始長度

 * @param incresCount 為數(shù)組滿是每次的增長長度

 */

public MyList(int initCount, int incresCount) {

this.initCount = initCount;

this.incresCount = incresCount;

array=new Object[initCount];

}

 

//實(shí)現(xiàn)數(shù)據(jù)的添加

public void add(E e){

if(size<initCount){

array[size]=e;

}

else{

Object[] newArray=new Object[array.length+incresCount];

newArray[size]=e;

for(int i=0;i<array.length;i++){

newArray[i]=array[i];

}

initCount+=incresCount;

array=newArray;

}

size++;

}

//實(shí)現(xiàn)刪除指定下標(biāo)位置的數(shù)據(jù)

public void delete(int i){

size--;

initCount--;

Object[] newArray=new Object[array.length-1];

for(int j=0;j<i;j++)

newArray[j]=array[j];

for(int j=i+1;j<array.length;j++)

newArray[j-1]=array[j];

array=newArray;

}

//實(shí)現(xiàn)插入指定下標(biāo)位置的數(shù)據(jù)

public void insert(E e,int i){

if(size<initCount && i>=0 && i<size-1){

for(int j=size;j>i;j--)

array[j]=array[j-1];

array[i]=e;

}

else{

Object[] newArray=new Object[array.length+incresCount];

for(int j=0;j<array.length;j++){

newArray[j]=array[j];

}

initCount+=incresCount;

array=newArray;

for(int j=size;j>i;j--)

array[j]=array[j-1];

array[i]=e;

}

size++;

}

//實(shí)現(xiàn)獲取指定下標(biāo)位置的數(shù)據(jù)

public E get(int i){

if(i<0 || i>=size)

return null;

else

return (E) array[i];

}

//實(shí)現(xiàn)更新指定下標(biāo)位置的數(shù)據(jù)

public void upDate(E e,int i){

if(i>=0 && i<size)

array[i]=e;

}

//獲取數(shù)組隊(duì)列中存儲(chǔ)的元素個(gè)數(shù)

public int legnth(){

return size;

}

 

}

 

通過上面的代碼,我們完成了一個(gè)自定義數(shù)組隊(duì)列。當(dāng)然這里對(duì)自定義數(shù)組隊(duì)列做了一定的優(yōu)化,可以由用戶指定初始的隊(duì)列長度和每次隊(duì)滿時(shí)增長的長度。相比于上面所說的每次長度加一,這樣做就不用每次都新建一個(gè)新的數(shù)組了。這樣以后只要在類中實(shí)例化MyList的對(duì)象就可以很方便的操作數(shù)組隊(duì)列啦。在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的過程中我們難免遇到這樣那樣的問題,但是數(shù)學(xué)領(lǐng)域的學(xué)者們總是能想到解決的辦法,我們也是站在了他們的肩膀上才能學(xué)到這么多優(yōu)質(zhì)的知識(shí)。興趣才是我們學(xué)習(xí)的根本動(dòng)力,對(duì)數(shù)據(jù)結(jié)構(gòu)感興趣的小伙伴在本站的數(shù)據(jù)結(jié)構(gòu)和算法教程中還有著許多有趣的數(shù)據(jù)結(jié)構(gòu)知識(shí)等你來學(xué)哦。


提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 亚洲国产成人久久精品动漫 | 一级毛片aa | 日日操免费视频 | 天天夜夜操 | 久久99精品久久久久久臀蜜桃 | 欧美毛片在线 | 特级中国aaa毛片 | 日韩一级片在线观看 | 99ri国产 | 99热只有这里有精品 | 青青青国产手机免费视频 | 97玖玖| 嫩草影院麻豆久久视频 | 精品哟哟哟国产在线观看不卡 | 在线看欧美三级中文经典 | 永久黄网站色视频免费观看 | 香蕉色香蕉在线视频 | 成年人的毛片 | 国产日韩欧美综合 | 欧美成人免费在线视频 | 国产精品免费一区二区三区 | 日本亚洲成高清一区二区三区 | 国产一区亚洲二区 | 伊人免费视频网 | 国产成人高清亚洲一区久久 | 色国产在线 | 国产精品成人一区二区不卡 | 色国产在线视频一区 | 日韩毛片大全 | 伊人天天躁夜夜躁狠狠 | 国产综合欧美日韩视频一区 | 高清在线精品一区二区 | 日本免费不卡 | 久久精品免视看国产成人2021 | 欧美精品h在线播放 | 日日狠狠的日日日日 | 日本精品二区 | 俄罗斯毛片视频 | 欧美18—19sex性护士 | 插久久| 免费一级黄色片 |