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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模拟实现顺序表ArrayList1(三级)

發(fā)布時(shí)間:2024/4/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟实现顺序表ArrayList1(三级) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
package com.learn.datastructure;/*** 線性接口表* 我怎么覺得這些方法我們都學(xué)過,* 是不是都學(xué)過,大同小異,* 注意這是一個(gè)接口,和存儲(chǔ)結(jié)構(gòu)無關(guān)* 無論是順序表還是鏈表,都要把這些功能給我實(shí)現(xiàn),* 首先我們來講順序表啦,* @author Leon.Sun**/ public interface List {// 返回線性表的大小,即數(shù)據(jù)元素的個(gè)數(shù)。/*** 線性表里又幾個(gè)元素* @return*/public int size();// 返回線性表中序號(hào)為 i 的數(shù)據(jù)元素/*** 獲取第i個(gè)元素* @param i* @return*/public Object get(int i);// 如果線性表為空返回 true,否則返回 false。/*** 線性表是不是空的,* @return*/public boolean isEmpty();// 判斷線性表是否包含數(shù)據(jù)元素 e/*** 線性表是不是包括某個(gè)元素* 是不是查找* @param e* @return*/public boolean contains(Object e);// 返回?cái)?shù)據(jù)元素 e 在線性表中的序號(hào)/*** 某個(gè)元素在線性表的索引* @param e* @return*/public int indexOf(Object e);// 將數(shù)據(jù)元素 e 插入到線性表中 i 號(hào)位置/*** 添加* 這是加到指定位置,線性表的插入操作* @param i* @param e*/public void add(int i, Object e);// 將數(shù)據(jù)元素 e 插入到線性表末尾/*** 這兩個(gè)添加有什么區(qū)別,* 這是加到最后,又插入就有添加* @param e*/public void add(Object e);// 將數(shù)據(jù)元素 e 插入到元素 obj 之前/*** 在誰誰之前加* @param obj* @param e* @return*/public boolean addBefore(Object obj, Object e);// 將數(shù)據(jù)元素 e 插入到元素 obj 之后/*** 在誰誰之后加* 這個(gè)大家自己都可以來寫* @param obj* @param e* @return*/public boolean addAfter(Object obj, Object e);// 刪除線性表中序號(hào)為 i 的元素,并返回之/*** 刪除第幾個(gè),這是刪除第幾個(gè)元素* 比如我刪除第5個(gè)元素* @param i* @return*/public Object remove(int i);// 刪除線性表中第一個(gè)與 e 相同的元素/*** 刪除指定值的元素* 比如我刪除值是30的元素* @param e* @return*/public boolean remove(Object e);// 替換線性表中序號(hào)為 i 的數(shù)據(jù)元素為 e,返回原數(shù)據(jù)元素/*** 修改,把第幾個(gè)元素改成新的值* @param i* @param e* @return*/public Object replace(int i, Object e);} package com.learn.datastructure;/*** 這個(gè)類我們學(xué)過,叫ArrayList,實(shí)現(xiàn)List,可不能導(dǎo)包啊* 我們寫的是自己的,不是JAVA的,是我們的,這不能導(dǎo)包* 我們來模擬一下JAVA的,怎么不對(duì),方法沒實(shí)現(xiàn)* 添加沒有實(shí)現(xiàn)的方法,順序表,底層采用的是數(shù)組,但是長(zhǎng)度可以動(dòng)態(tài)的變化* * @author Leon.Sun**/ public class ArrayList implements List {/*** 我們把它從JDK的List源代碼拿過來,* 我們寫上一個(gè)private,底層是一個(gè)數(shù)組,Object類型什么都可以放* 但是數(shù)組的長(zhǎng)度有沒有確定,沒有確定,目前還沒有確定長(zhǎng)度,* */private Object[] elementData;/*** size什么意思,是不是數(shù)組的長(zhǎng)度,不是,* 不是數(shù)組分配了幾個(gè)空間,你數(shù)組分配了10個(gè)空間,* 可是我一個(gè)元素也沒有放,而是元素的個(gè)數(shù),* 然后我們?cè)賮韺懸粋€(gè)構(gòu)造方法*/private int size;/*** 我們?cè)僭黾右粋€(gè)構(gòu)造方法,* 有沒有指定數(shù)量,有沒有指定數(shù)組的長(zhǎng)度,沒有,* 那我們這里面該怎么辦呢,那思路方法多了去了,比如說可以調(diào)用this(4)*/public ArrayList() {/*** 告訴我這什么意思,我們點(diǎn)他一下跳到這里了,* 沒有指定長(zhǎng)度,默認(rèn)長(zhǎng)度就是4,這樣總可以吧,* 這是一種策略,當(dāng)然還有一種策略是什么,* 你要是有4個(gè)的話,加前4個(gè)的話是有空間的,加第5個(gè)就不行了* 我們不在這里糾結(jié)*/this(4);/*** 你也可以這么來指定* 沒有指定長(zhǎng)度,長(zhǎng)度是0* 就是一個(gè)元素也沒有,那種方式都行* */// elementData = new Object[] {};}/*** 構(gòu)造方法,initialCapacity這個(gè)單詞什么意思* 是初始的長(zhǎng)度,就是我們使用這個(gè)構(gòu)造方法呢,可以指定一個(gè)初始長(zhǎng)度,* 你想讓數(shù)組的初始長(zhǎng)度是幾,initialCapacity指定數(shù)組的初始長(zhǎng)度* 長(zhǎng)度是10,我們?cè)撛趺崔k* @param initialCapacity*/public ArrayList(int initialCapacity) {/*** 根據(jù)initialCapacity這個(gè)長(zhǎng)度給initialCapacity分配空間* 給數(shù)組分配空間,分配指定數(shù)量的空間,本來elementData他是沒有空間的,* 現(xiàn)在是不是有空間了,*/elementData = new Object[initialCapacity];/*** size應(yīng)該是幾,size不是initialCapacity,* 0還不如不寫呢,本來就是0,指定順序表的元素個(gè)數(shù),默認(rèn)是0,* 干脆不用寫,初始值本來就是0,*/// size = 0;}/*** 這里size是0,是還沒有寫呢,* 我們的size該怎么辦,長(zhǎng)度是幾,*/@Overridepublic int size() {/*** 直接返回size就行了* 因?yàn)槟忝看卧黾右粋€(gè)元素就加1*/return size;}/*** get比較簡(jiǎn)單,我想找到第幾個(gè)元素,* 我想找到索引是幾的元素,按照索引來找* 按照索引來找不是*/@Overridepublic Object get(int i) {/*** 我們加一個(gè)判斷* 如果i小于0或者i大于等于size,如果在這個(gè)范圍里面就是錯(cuò)誤的* 我們把這條語句注釋了,* 我們能不能來一個(gè) java.lang.ArrayIndexOutOfBoundsException:這種異常* 有什么不可以的嗎* 我們創(chuàng)建一個(gè)類MyArrayIndexOutOfBoundsException我的數(shù)組指針越界異常*/ // if(i<0 || i>=size) { // /** // * 這個(gè)時(shí)候就要拋異常了 // * 我們這里寫的比較假,我們這里叫RuntimeException, // * 我們能不能來一個(gè)索引越界異常, // */ // throw new RuntimeException("數(shù)組索引越界異常:" + i); // }if(i<0 || i>=size) {/*** throw這個(gè)異常就可以了*/throw new MyArrayIndexOutOfBoundsException("數(shù)組索引越界異常:" + i);}return elementData[i];}/*** isEmpty是永遠(yuǎn)返回false,* isEmpty返回誰,怎么就不是空的了,就看這個(gè)size等于0*/@Overridepublic boolean isEmpty() {/*** size等于0就是空的,不等于0就不是空的* 指向這一條語句,*/return size==0;}@Overridepublic boolean contains(Object e) {return false;}@Overridepublic int indexOf(Object e) {return 0;}@Overridepublic void add(int i, Object e) {}/*** 還有一個(gè)關(guān)鍵這個(gè)add有沒有寫過,add從來沒有寫過* 所以你加什么也相當(dāng)于什么也沒有做,你告訴我我怎么把元素加進(jìn)去* 這是添加到最后的,你告訴我該怎么辦,*/@Overridepublic void add(Object e) {/*** 底層是一個(gè)數(shù)組,我默認(rèn)的分配了4個(gè)空間,* 就給我們這個(gè)數(shù)組elementData賦值* add永遠(yuǎn)是最后,寫size,size初始值是0* 把元素放在數(shù)組最后的一個(gè)位置,給數(shù)組賦值*/elementData[size] = e;/*** 再來一個(gè)size++,元素個(gè)數(shù)加1,我們可以把這兩個(gè)語句合在一起* 然后數(shù)量加1了,這個(gè)時(shí)候我們來做一個(gè)操作了*/size++;/*** 這樣就合在一起了*/// elementData[size++] = e;}@Overridepublic boolean addBefore(Object obj, Object e) {return false;}@Overridepublic boolean addAfter(Object obj, Object e) {return false;}@Overridepublic Object remove(int i) {return null;}@Overridepublic boolean remove(Object e) {return false;}@Overridepublic Object replace(int i, Object e) {return null;}} package com.learn.datastructure;public class TestArrayList {/*** * @param args*/public static void main(String[] args) {/*** 請(qǐng)問這個(gè)List是哪一個(gè),是我們的還是JAVA的,是我們的,* 你沒有導(dǎo)包,他優(yōu)先采用當(dāng)前包,我們導(dǎo)入JAVA的包然后進(jìn)入看* transient Object[] elementData* 發(fā)現(xiàn)底層是數(shù)組,*/// java.util.ArrayList list;/*** 好我們之前都是這么來寫的,好像我們從來都不寫數(shù),* 不寫數(shù)怎么辦,*/List list = new ArrayList();/*** 我要是把這里面的都注釋了,長(zhǎng)度是0,是空的,* 是不是就這么實(shí)現(xiàn)了,這底層也是這么一個(gè)一個(gè)來實(shí)現(xiàn)的*/list.add(123);list.add(321);list.add(456);/*** 如果把這個(gè)注釋了,長(zhǎng)度是3,不是空的*/list.add(678);/*** 因?yàn)槟隳J(rèn)的長(zhǎng)度是4,加4個(gè)沒有問題,* 但是你加5個(gè)的時(shí)候就越界了*/// list.add(789);/*** 我現(xiàn)在想做一個(gè)操作,* 你說我現(xiàn)在執(zhí)行會(huì)不會(huì)報(bào)錯(cuò),沒有報(bào)錯(cuò)* 他沒有報(bào)錯(cuò),我想輸出一下* size()他的長(zhǎng)度是幾,長(zhǎng)度是0,* 這結(jié)果讓我好納悶* * 現(xiàn)在長(zhǎng)度是4,*/System.out.println(list.size());/*** 它是空的嗎,不是空的* * 不是空的*/System.out.println(list.isEmpty());/*** 2實(shí)際上是想要456,看看是不是,是null* 索引2的456,*/System.out.println(list.get(2));/*** 索引是0的,123*/System.out.println(list.get(0));/*** 索引是8的,越界* 數(shù)組索引越界異常:8* com.learn.datastructure.MyArrayIndexOutOfBoundsException: 數(shù)組索引越界異常:8* 是這個(gè)異常,*/System.out.println(list.get(8));}} package com.learn.datastructure;/*** 這個(gè)叫自定義異常,他要繼承RuntimeException* 這里面也非常的簡(jiǎn)單,只要實(shí)現(xiàn)兩個(gè)構(gòu)造方法,* 我們要一個(gè)無參的,和一個(gè)帶有異常信息的* @author Leon.Sun**/ public class MyArrayIndexOutOfBoundsException extends RuntimeException {public MyArrayIndexOutOfBoundsException() {super();}public MyArrayIndexOutOfBoundsException(String message) {super(message);}}

?

總結(jié)

以上是生活随笔為你收集整理的模拟实现顺序表ArrayList1(三级)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。