Java自定義長(zhǎng)度可變數(shù)組的操作
我們都知道數(shù)組是線性的、類(lèi)型固定、內(nèi)存地址連續(xù)、定長(zhǎng)的,主要是數(shù)組一旦被定義,那么它的長(zhǎng)度也就定下來(lái)了,只能添加有限的數(shù)據(jù)。而長(zhǎng)度可變的數(shù)組是要將這個(gè)長(zhǎng)度打破,實(shí)現(xiàn)數(shù)組數(shù)據(jù)無(wú)限增加
那么定義長(zhǎng)度可變的數(shù)組就可以用兩個(gè)數(shù)組來(lái)實(shí)現(xiàn)數(shù)組長(zhǎng)度的變化。為了避免每次增加數(shù)據(jù)或刪除數(shù)據(jù)時(shí)都要重新開(kāi)辟空間,我先設(shè)定原數(shù)組為固定長(zhǎng),在當(dāng)數(shù)組放滿(mǎn)時(shí),一次增加一定的長(zhǎng)度,這樣 節(jié)省了開(kāi)辟空間的時(shí)間
因?yàn)閿?shù)組里的數(shù)據(jù)類(lèi)型是不確定的,所以用泛型比較好
public class MyList<E> {
private int rongliang;//容量
private int zengliang;//增量
private int num;//數(shù)量
//定義一個(gè)原數(shù)組
//Object類(lèi)包含所有的類(lèi)型,所以定義數(shù)組是用Object類(lèi)
private Object[] src;
//三個(gè)不同的構(gòu)造方法
public MyList(){
this(10,10);
}
public MyList(int rongliang){
this(rongliang,10);
}
public MyList(int rongliang,int zengliang){
this.rongliang = rongliang;
this.zengliang = zengliang;
src = new Object[rongliang];
}
}
在MyList中實(shí)現(xiàn)在數(shù)組中添加數(shù)據(jù),要考慮到數(shù)組中的數(shù)據(jù)數(shù)量小于數(shù)組長(zhǎng)度時(shí),可以直接在數(shù)組為null處添加數(shù)據(jù),但當(dāng)數(shù)組的數(shù)量大于等于數(shù)組長(zhǎng)度時(shí),要先重新定義一個(gè)數(shù)組,長(zhǎng)度是原數(shù)組加增量,然后再添加數(shù)據(jù)
public void add(E s){
//判斷數(shù)組中的數(shù)據(jù)數(shù)量num是否大于數(shù)組的長(zhǎng)度(容量),超出則需擴(kuò)容
if(num>=src.length){
//定義一個(gè)新的數(shù)組,長(zhǎng)度是原有的長(zhǎng)度加增量
Object arr[] = new Object[src.length+zengliang];
//拷貝數(shù)組數(shù)據(jù)
System.arraycopy(arr, 0, arr, 0, src.length);
src = arr;
}
//如果num不大于數(shù)組的長(zhǎng)度,則不需擴(kuò)容,直接加入
//如果num大于等于數(shù)組長(zhǎng)度,則需執(zhí)行上面的if語(yǔ)句擴(kuò)容,再加入數(shù)據(jù)
//最后num++
src[num++] = s;
}
取出指定下標(biāo)的數(shù)據(jù),因?yàn)閭魅氲氖窍聵?biāo)的參數(shù),所以要判斷數(shù)組的下標(biāo)是否越界,拋出異常
public E get(int index){
//拋出異常
if(index<0 || index>=num){
throw new IndexOutOfBoundsException("下標(biāo)越界!index:"+index+",size:"+num);
}
//強(qiáng)制轉(zhuǎn)換成E類(lèi)型
return (E)src[index];
}
修改指定下標(biāo)的數(shù)據(jù),因?yàn)閭魅氲氖窍聵?biāo)的參數(shù),所以要判斷數(shù)組的下標(biāo)是否越界,拋出異常
public void modify(int index,E s){
//拋出異常
if(index<0 || index>=num){
throw new IndexOutOfBoundsException("下標(biāo)越界!index:"+index+",size:"+num);
}
src[index] = s;
}
刪除指定下標(biāo)的數(shù)據(jù),當(dāng)數(shù)組中null值的長(zhǎng)度大于等于增量時(shí),要將數(shù)組的容量減小,防止浪費(fèi)
public void delete(int index){
//拋出異常
if(index<0 || index>=num){
throw new IndexOutOfBoundsException("下標(biāo)越界!index:"+index+",size:"+num);
}
//將>index的數(shù)據(jù)依次向前移動(dòng)一位
System.arraycopy(src, index+1, src, index, num-index-1);
num--;
//減少容量的方法
if(src.length-num>=zengliang){
//定義一個(gè)新的數(shù)組,長(zhǎng)度是原先數(shù)組的長(zhǎng)度減去增量
Object arr[] = new Object[src.length-zengliang];
//拷貝數(shù)組
System.arraycopy(src, 0, arr, 0, num);
src = arr;
}
}
將指定下標(biāo)處的數(shù)據(jù)改為指定的數(shù)據(jù)
public void insert(int index,E s){
//拋出異常
if(index<0 || index>=num){
throw new IndexOutOfBoundsException("下標(biāo)越界!index:"+index+",size:"+num);
}
//判斷數(shù)組中的數(shù)據(jù)數(shù)量num是否大于數(shù)組的長(zhǎng)度(容量),超出則需擴(kuò)容
if(num>=src.length){
//定義一個(gè)新的數(shù)組,長(zhǎng)度是原有的長(zhǎng)度加增量
Object arr[] = new Object[src.length+zengliang];
//拷貝數(shù)組數(shù)據(jù)
System.arraycopy(src, 0, arr, 0, src.length);
src = arr;
}
//將>index的數(shù)據(jù)依次向后移動(dòng)一個(gè)位置
//arraycopy()是可以將數(shù)據(jù)自己拷貝給自己
System.arraycopy(src, index, src, index+1, num-index);
//插入數(shù)據(jù)
src[index] = s;
num++;
}
最后在寫(xiě)個(gè)獲取數(shù)組中數(shù)據(jù)的個(gè)數(shù),而不是數(shù)組的長(zhǎng)度
public int size(){
return num;
}
寫(xiě)個(gè)測(cè)試類(lèi),來(lái)測(cè)試這個(gè)長(zhǎng)度可變的數(shù)組是否可行
public class test {
public static void main(String[] args) {
//創(chuàng)建一個(gè)MyList對(duì)象
// 在創(chuàng)建對(duì)象時(shí)明確類(lèi)型
MyList<String> list = new MyList<String>();
//添加數(shù)據(jù)
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
list.add("g");
list.add("h");
list.add("i");
list.add("j");
//遍歷數(shù)組
for(int i=0;i<list.size();i++){
String s = list.get(i);
System.out.print(s+" ");
}
System.out.println("");
int n = list.size();
System.out.println("數(shù)據(jù)個(gè)數(shù)為:"+n);
System.out.println("**********************************************");
//修改指定位置的數(shù)據(jù)
list.modify(1, "QQ");
//遍歷數(shù)組
for(int i=0;i<list.size();i++){
String s = list.get(i);
System.out.print(s+" ");
}
System.out.println("");
int m = list.size();
System.out.println("數(shù)據(jù)個(gè)數(shù)為:"+m);
System.out.println("**********************************************");
//刪除指定位置的數(shù)據(jù)
list.delete(2);
//遍歷數(shù)組
for(int i=0;i<list.size();i++){
String s = list.get(i);
System.out.print(s+" ");
}
System.out.println("");
int k = list.size();
System.out.println("數(shù)據(jù)個(gè)數(shù)為:"+k);
System.out.println("**********************************************");
//在指定位置插入指定的數(shù)據(jù)
list.insert(3, "zr");
list.insert(3, "qi");
//遍歷數(shù)組
for(int i=0;i<list.size();i++){
String s = list.get(i);
System.out.print(s+" ");
}
System.out.println("");
int h = list.size();
System.out.println("數(shù)據(jù)個(gè)數(shù)為:"+h);
System.out.println("**********************************************");
}
}
最終數(shù)組的結(jié)果為:
a b c d e f g h i j 數(shù)據(jù)個(gè)數(shù)為:10 ********************************************** a QQ c d e f g h i j 數(shù)據(jù)個(gè)數(shù)為:10 ********************************************** a QQ d e f g h i j 數(shù)據(jù)個(gè)數(shù)為:9 ********************************************** a QQ d qi zr e f g h i j 數(shù)據(jù)個(gè)數(shù)為:11 **********************************************
補(bǔ)充:在Java中創(chuàng)建一個(gè)自定義長(zhǎng)度的數(shù)組并輸入每個(gè)元素
用到知識(shí)點(diǎn):數(shù)組、方法、Scanner、for循環(huán)。
作業(yè):
package Array;
import java.util.Scanner;
public class InputArray {
public static void main(String[] args) {
shuzu();//方法調(diào)用
}
//方法定義
public static void shuzu() {
//將輸入的數(shù)字作為數(shù)組的長(zhǎng)度
Scanner sz = new Scanner(System.in);
System.out.println("請(qǐng)輸入數(shù)組長(zhǎng)度:");//提示可以操作
int[] cd = new int[sz.nextInt()];//數(shù)組初始化完成
System.out.println("當(dāng)前數(shù)組長(zhǎng)度定義為:"+cd.length);//再提示一下結(jié)果
//用for循環(huán)為每一個(gè)元素賦值
for (int i = 0; i < cd.length; i++) {
int q = i+1;//這里q用作提示,避免提示出第0個(gè)元素。
System.out.println("請(qǐng)輸入第"+q+"個(gè)元素的值:");
cd [i] = sz.nextInt();
System.out.println("第"+q+"個(gè)元素定義為"+cd[i]+"。");
}
sz.close();
//數(shù)組內(nèi)各元素已經(jīng)完成賦值,但是再用for循環(huán)遍歷一次
System.out.print("數(shù)組內(nèi)元素全部完成賦值:");//繼續(xù)提示一下
for (int i2 = 0; i2 < cd.length; i2++) {
if(i2 == cd.length-1) {
System.out.print(cd[i2]+"。");
}else {
System.out.print(cd[i2]+"、");
}
}
return;//方法結(jié)束,rentun;
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
spring-boot實(shí)現(xiàn)增加自定義filter(新)
本篇文章主要介紹了spring-boot實(shí)現(xiàn)增加自定義filter(新),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
關(guān)于Springboot+gateway整合依賴(lài)并處理依賴(lài)沖突問(wèn)題
這篇文章主要介紹了Springboot+gateway整合依賴(lài)并處理依賴(lài)沖突問(wèn)題,給大家提到了spring boot版本和spring cloud版本,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
SpringBoot整合Shiro實(shí)現(xiàn)登錄認(rèn)證的方法
這篇文章主要介紹了SpringBoot整合Shiro實(shí)現(xiàn)登錄認(rèn)證的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Spring?MVC基于注解的使用之JSON數(shù)據(jù)處理的方法
這篇文章主要介紹了Spring?MVC基于注解的使用JSON數(shù)據(jù)處理,json是一種輕量級(jí)的數(shù)據(jù)交換格式,是一種理想的數(shù)據(jù)交互語(yǔ)言,它易于閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
SpringBoot2 實(shí)現(xiàn)JPA分頁(yè)和排序分頁(yè)的案例
這篇文章主要介紹了SpringBoot2 實(shí)現(xiàn)JPA分頁(yè)和排序分頁(yè)的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
java swing實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲
這篇文章主要為大家詳細(xì)介紹了java swing實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Springboot訪問(wèn)html頁(yè)面步驟解析
這篇文章主要介紹了Springboot訪問(wèn)html頁(yè)面過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Java中split根據(jù)"."分割字符串問(wèn)題舉例
split表達(dá)式其實(shí)就是一個(gè)正則表達(dá)式,* | . ^ 等符號(hào)在正則表達(dá)式中屬于一種有特殊含義的字符,下面這篇文章主要給大家介紹了關(guān)于Java中split根據(jù)“.“分割字符串問(wèn)題的相關(guān)資料,需要的朋友可以參考下2022-10-10

