动态数组
数组本身是固定元素个数的,但是为了存储数据,这个数组可能会满,解决这个问题。
发现数组满了,就新建一个更大的数组,把原数组的数据复制过来,并销毁原数组数组就像一个仓库。
一次性新建超大仓库不可取,会浪费空间。
每次比原来的大一点,也不可取,会效率低下。
新建仓库是原来仓库的1.5倍比较合适。
比如原数组int[] arr = new int[]{1,2,3,4};
新数组的大小是它的1.5倍是6. 4+(4/2) 4+(4>>1)
arr.length + (arr.length>>1);
int[] newArr = new int[6];
for(int i = 0;i<arr.length;i++){
newArr[i] = arr[i];
}
例1:往一空间大小为4的数组中添加10个数字,当空间不够时,自动将数组空间增大为原来的1.5倍
package c22;
import java.util.Arrays;
/**
* @author zt
* @version 1.0
* @date
*/
public class C234 {
/**
* 存储数据的数组
*/
int[] arr;
/**
* 当前的位置
*/
int index = 0;
/**
* 无参的默认的构造方法
*/
public C234(){
// 知识点,构造方法嵌套调用,直接写this,不写方法名
// 此代码只能是第一行
this(4);
}
/**
* 初始化对象
* @param capacity
*/
public C234(int capacity){
this.arr = new int[capacity];
}
public static void main(String[] args) {
C234 c = new C234();
for (int i = 0;i<10;i++){
c.add(i);
}
System.out.println(Arrays.toString(c.arr));
}
/**
* 增加一个数字
* @param num
*/
public void add(int num){
if (index<arr.length){
arr[index++] = num;
}else {
int length = arr.length + (arr.length >> 1);
arr = Arrays.copyOf(arr,length);
}
}
}
例2:创建学生类,有id,name属性;创建学生管理类,添加学生信息,当空间不够时自动增大空间
首先创建学生类,并编写构造方法、get、set方法与to String方法
public class Student {
/**
* 编号
*/
protected int id;
/**
* 姓名
*/
private String name;
/**
* 默认构造方法
*/
public Student() {
}
/**
* 构造方法
* @param id
* @param name
*/
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
创建学生管理类,编写添加学生方法
public class StudentManager {
/**
* 学生数组
*/
Student[] students;
/**
* 当前数组指针
*/
int index;
public StudentManager(){
this(4);
}
/**
* 初始化
* @param length
*/
public StudentManager(int length){
this.students = new Student[length];
}
/**
* 增加学生
* @param student
*/
public void addStudent(Student student){
if (index == students.length){
int length = students.length + (students.length >> 1);
students = Arrays.copyOf(students,length);
}
students[index++] = student;
}
public static void main(String[] args) {
StudentManager studentManager = new StudentManager();
for (int i=0;i<10;i++) {
studentManager.addStudent(new Student(i, "name" + i));
}
System.out.println(Arrays.toString(studentManager.students));
}
}