arraylist扩容是创建新数组吗 java_Java编程之数组扩容
一、背景
數組在實際的系統開發中用的越來越少了,我們只有在閱讀某些開源項目時才會看到數組的使用。在Java中,數組與List、Set、Map等集合類相比,后者使用起來方便,但是在基本數據類型處理方面,數組還是占優勢的,而且集合類的底層也都是通過數組實現的。
我們大家都知道,在Java中數組是定長的,一旦初始化以后,就不可以改變其長度,而這在實際應用中是不方便的。舉例來說,如果要對班級學生的信息進行統計,因為我們不知道一個班級會有多少學生(隨時有入學、退學、轉學的學生),所以需要一個足夠大的數組來容納所有的學生(當然,在實際應用場景中,你可以用List或者其他的集合類,本文在此只討論數據)。那么,究竟需要多大才算足夠大呢?事實上,“足夠大”只是一個相對的概念,并沒有確定的值。所以,當“足夠大”變成“足夠小”的時候,就會超出數組的最大容量,如何解決呢?那就給數組擴容吧,也許看到此處的朋友會問,你這不是和前面所說的矛盾么?請不要糾結,我這里所說的給數組擴容,只是“婉轉”地給數組擴容。那么,怎么個“婉轉”擴容呢?還是從例子說起。
二、實例展示
假設一個班級最初規定只能容納60個學生,但是由于有幾個轉學的學生突然插進來,整個班級的學生人數達到了80人,這種情況很正常呢,想想我們高中所在的那些強化班就知道是怎么回事了。
第一,先定義一個學生的屬性類:Student
public class Student {
/**
* 學生編號
*/
private long studentId;
/**
* 學生姓名
*/
private String name;
/**
* 學生年齡
*/
private int age;
/**
* 學生性別:0-男,1-女
*/
private int gender;
/**
* 學生所在班級
*/
private String ownerClass;
public long getStudentId() {
return studentId;
}
public void setStudentId(long studentId) {
this.studentId = studentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getOwnerClass() {
return ownerClass;
}
public void setOwnerClass(String ownerClass) {
this.ownerClass = ownerClass;
}
}
第二、編寫給數組擴容的工具類:ArrayExtendCapacityUtil
public class ArrayExtendCapacityUtil {
/**
* 將數組進行擴容
*
* @param datas
* @param newLen
* @return
*/
public static T[] extendCapacity(T[] datas, int newLen){
//負值校驗
newLen = newLen < 0 ? 0 : newLen;
//生成一個新的數組,并copy原來的值
return Arrays.copyOf(datas, newLen);
}
}
第三、編寫測試類:ArrayExtendCapacityMain
import java.util.ArrayList;
import java.util.List;
public class ArrayExtendCapacityMain {
public static void main(String args[]){
//一個班規定60個學生
Student[] num = new Student[60];
System.out.println("初始化:" + num.length);
System.out.println("最后一個學生的編號:" + converData(num.length).get(num.length-1).getStudentId());
//增加20個學生
num = ArrayExtendCapacityUtil.extendCapacity(num, 80);
System.out.println("擴容后:" + num.length);
System.out.println("擴容后最后一個學生的編號:" + converData(num.length).get(num.length-1).getStudentId());
}
private static List converData(int capacity){
List students = new ArrayList();
for(int i=0;i
Student student = new Student();
student.setStudentId(i);
student.setName(i+"-King");
student.setAge(i+10);
student.setGender(i % (i+10) == 0 ? 0 : 1);
student.setOwnerClass(i + "-class");
students.add(student);
}
return students;
}
}
三、測試結果
初始化:60
最后一個學生的編號:59
擴容后:80
擴容后最后一個學生的編號:79
四、測試結果分析
本文實例中采用的是Arrays數組工具類的copyOf方法,產生了一個newLen長度的新數組,并把原來的值拷貝進去,然后就可以對超長的元素進行賦值。
通過這樣的方式,曲折地解決了數組的變長問題。其實,集合的長度自動維護功能的原理與此類似,在實際開發中,如果確實需要變長的數據集,數組也是在考慮范圍之內的,不能因為數組是固定長度就將其否定。在這里,我可以直接借用一個結論:對基本數據進行求和計算時,數組的效率是集合的10倍。有興趣的朋友可以自己證明一下這個結論。
總結
以上是生活随笔為你收集整理的arraylist扩容是创建新数组吗 java_Java编程之数组扩容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vba 指定列后插入列_在不同的列左侧插
- 下一篇: java美元兑换,(Java实现) 美元