最近在看JAVA教學的視頻,覺得老師講的很好,同時借用源代碼還有筆記來撰寫本系列博客,記錄自己的學習內容,同時也供看到的人學習。
這篇來進行一個實踐,上一篇我們介紹了StringBuilder,相比於String,作爲可變字符序列的它已經有了很明顯的優勢,但是在對象種類無數的JAVA裏面,StringBuilder所提供的數組成員也要完全一樣的,只靠它是不行滴~那麼問題來了,怎樣構造一個“超級容器”去盛放各種各樣的對象而又讓他們構成一個數組呢?那就是JAVA的一個大容器——ArrayList,以Object[] elements爲結構的它完全可以包含任何類型的對象,同時ArrayList也是邁向JAVA數據結構世界的一個大門,本篇要實踐的內容就是參考StringBuilder類和ArrayList類的JDK源碼來仿造出一個MyArrayList,代碼如下,部分解釋已經寫在註釋部分:
<span style="font-size:14px;">import java.util.ArrayList;
/**
* 仿造StringBuilder類,模擬實現JDK中提供的ArrayList類,創造一個容器,可以裝各種各樣的對象。
*/
public class MyArrayList {
/**
* The value is used for object storage.
*/
private Object[] value;
/**
* The size is the number of objects used.
*/
private int size;
public MyArrayList(){
// value = new Object[16];
this(10); //一個構造器調另一個構造器。
}
public MyArrayList(int size){
if(size<0){
try {
throw new Exception(); //手動拋出一個異常。 講到異常章節再說,先混個眼熟
} catch (Exception e) {
e.printStackTrace();
}
}
value = new Object[size];
}
public int size(){
return size;
}
public boolean isEmpty() {
return size == 0;
}
public void add(Object obj){
//是變化着的:
value[size] = obj;
size++;
if(size>=value.length){
//裝不下了。擴容吧!
int newCapacity = value.length*2;
//System.arraycopy(src, srcPos, dest, destPos, length); //這種是調用JDK提供的數組複製的方法,建一個新數組把老的成員拷貝進來,見上一篇筆記。
//建一個新的數組,手動拷貝舊的內容:
Object[] newList = new Object[newCapacity];
//下面是手動拷貝部分:
for(int i=0;i<value.length;i++){
newList[i] = value[i];
}
value = newList;
}
}
public Object get(int index){
rangeCheck(index); //調用檢測是否越界的方法。
return value[index];
}
public int indexOf(Object obj){
if(obj==null){
return -1;
}else{
for(int i=0;i<value.length;i++){
if(obj==value[i]){
return i;
}
}
return -1; //循環一遍之後如果還沒有相等的那就報空(返-1)
}
}
public int lastIndexOf(Object obj){
if(obj==null){
return -1;
}else{
for(int i=value.length-1;i>=0;i--){
if(obj==value[i]){
return i;
}
}
return -1;
}
}
public Object set(int index, Object object) {
rangeCheck(index);
Object old = value[index];
value[index] = object;
return old;
}
public void rangeCheck(int index){
if(index<0||index>size-1){ //[0,size-1]
try {
throw new Exception(); //手動拋出一個異常。 講到異常章節再說
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyArrayList list = new MyArrayList(2);
list.add("aaa"); //index = 0
list.add(new Human("高琪")); //index = 1
list.add("bbbb");
list.add("bbbb");
list.add("bbbb");
list.add("bbbb");
ArrayList list2;
Human h = (Human) list.get(1); //強制轉型,由value型轉爲Human型。
System.out.println(h.getName());
// System.out.println(list.get(3));
System.out.println(list.size());
}
}</span>
<span style="font-size:14px;">public class Human {
private String name;
public Human(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}</span>
建議閱讀或者編寫、調試上述代碼的時候對比着JDK文檔的源碼看纔能有不少收穫,看源碼的方法上一篇筆記已經介紹過了,這裏就不贅述了。
終於寫到第20篇了~~~