Java 自定義動(dòng)態(tài)數(shù)組方式
Java自定義動(dòng)態(tài)數(shù)組
1、靜態(tài)數(shù)組向動(dòng)態(tài)數(shù)組轉(zhuǎn)變
(1)靜態(tài)數(shù)組,數(shù)組空間固定長(zhǎng)度

這個(gè)數(shù)組空間總長(zhǎng)為4,如果此時(shí)新插入一個(gè)數(shù)據(jù)就會(huì)報(bào)數(shù)組空間不足
(2)靜態(tài)數(shù)組如何轉(zhuǎn)變成動(dòng)態(tài)數(shù)組

第一步:創(chuàng)建一個(gè)空間是data數(shù)組兩倍的newData數(shù)組(擴(kuò)容);
第二步:把data數(shù)組中的元素全部賦值到newData數(shù)組;
2、數(shù)組擴(kuò)容程序
// 數(shù)組擴(kuò)容
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
數(shù)組添加元素:數(shù)組空間不夠就會(huì)擴(kuò)容(原來(lái)空間2倍)
// 數(shù)組指定位置添加元素
public void add(int index, E e) {
// if (size == data.length)
// throw new IllegalArgumentException("Add failed.Array is full.");
if (index < 0 || index > size)
throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size");
if (size == data.length)
resize(2 * data.length);
for (int i = size - 1; i >= index; i--)
data[i + 1] = data[i];
data[index] = e;
size++;
}
數(shù)組刪除元素:數(shù)組空間空閑太大就會(huì)縮容(原來(lái)空間的1/2)
// 從數(shù)組中刪除index位置的元素,返回刪除的元素
public E remove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("Remove failed.Index is illegal");
}
E ret = data[index];
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
// loitering objects != memory leak 手動(dòng)釋放內(nèi)存空間
data[size] = null;
if(size == data.length / 2) {
resize(data.length / 2);
}
return ret;
}
3、數(shù)組整體代碼
public class Array<E> {
// 定義數(shù)組變量,data.length表示數(shù)組容量capacity
private E[] data;
// 定義數(shù)組中存放數(shù)據(jù)大小
private int size;
// 有參構(gòu)造方法,傳入數(shù)組的容量capacity構(gòu)造動(dòng)態(tài)數(shù)組
public Array(int capacity) {
data = (E[])new Object[capacity];
size = 0;
}
// 無(wú)參構(gòu)造方法,默認(rèn)初始容量為capacity=10
public Array() {
this(10);
}
// 獲取數(shù)組中元素個(gè)數(shù)
public int getSize() {
return size;
}
// 獲取數(shù)組的容量
public int getCapacity() {
return data.length;
}
// 判斷數(shù)組是否為空
public boolean isEmpty() {
return size == 0;
}
/* // 在數(shù)組末尾添加元素
public void addLast(E e) {
if (size == data.length)
throw new IllegalArgumentException("AddLast failed.Array is full.");
data[size] = e;
size++;
}*/
// 在數(shù)組末尾添加元素(復(fù)用add方法)
public void addLast(E e) {
add(size, e);
}
// 在數(shù)組頭部添加元素(復(fù)用add方法)
public void addFirst(E e) {
add(0, e);
}
// 數(shù)組指定位置添加元素
public void add(int index, E e) {
// if (size == data.length)
// throw new IllegalArgumentException("Add failed.Array is full.");
if (index < 0 || index > size)
throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size");
if (size == data.length)
resize(2 * data.length);
for (int i = size - 1; i >= index; i--)
data[i + 1] = data[i];
data[index] = e;
size++;
}
// 獲取index索引位置的元素
public E get(int index) {
if (index < 0) {
throw new IllegalArgumentException("Get failed.Index is illegal.");
}
return data[index];
}
// 修改index索引位置的元素
public void set(int index, E e) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("Set failed.Index is illegal.");
}
data[index] = e;
}
// 查找數(shù)組中是否存在元素e
public boolean contains(E e) {
for (int i = 0; i < size; i++) {
if (data[i] == e) {
return true;
}
}
return false;
}
// 查找數(shù)組中元素e所在的索引,如果不存在元素e,則返回-1
public int find(E e) {
for (int i = 0; i < size; i++) {
if (data[i] == e) {
return i;
}
}
return -1;
}
// 從數(shù)組中刪除index位置的元素,返回刪除的元素
public E remove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("Remove failed.Index is illegal");
}
E ret = data[index];
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
// loitering objects != memory leak 手動(dòng)釋放內(nèi)存空間
data[size] = null;
if(size == data.length / 2) {
resize(data.length / 2);
}
return ret;
}
// 刪除數(shù)組第一個(gè)元素,返回刪除的元素
public E removeFirst() {
return remove(0);
}
// 刪除數(shù)組最后一個(gè)元素
public E removeLast() {
return remove(size - 1);
}
// 刪除數(shù)組中指定元素e
public void removeElement(E e) {
int index = find(e);
if (index != -1) {
remove(index);
}
}
// 數(shù)組擴(kuò)容
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
// 重寫父類toString()方法
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("Array: size = %d , capacity = %d\n", size, data.length));
sb.append('[');
for (int i = 0; i < size; i++) {
sb.append(data[i]);
if (i != size - 1) {
sb.append(',');
}
}
sb.append(']');
return sb.toString();
}
}
4、數(shù)組測(cè)試代碼
public class ArrayTest {
public static void main(String[] args) {
// 測(cè)試toString()方法
Array<Integer> arr = new Array(10);
for (int i = 0; i < 10; i++) {
// 測(cè)試addLast(int e)方法
arr.addLast(i);
}
System.out.println("添加數(shù)組元素:");
System.out.println(arr);
// 測(cè)試add(int index, int e)方法
arr.add(1, 200);
System.out.println("在數(shù)組指定索引位置插入元素e:");
System.out.println(arr);
// 測(cè)試addFirst(int e)方法
arr.addFirst(-10);
System.out.println("在數(shù)組頭部位置插入元素e:");
System.out.println(arr);
}
}
測(cè)試結(jié)果如下所示:初始化數(shù)組空間大小為10,第一次插入10個(gè)元素到數(shù)組之后,然后再添加一個(gè)元素,此時(shí)數(shù)組會(huì)擴(kuò)容為原來(lái)空間的兩倍。
添加數(shù)組元素:
Array: size = 10 , capacity = 10 [0,1,2,3,4,5,6,7,8,9]
在數(shù)組指定索引位置插入元素e:
Array: size = 11 , capacity = 20 [0,200,1,2,3,4,5,6,7,8,9]
在數(shù)組頭部位置插入元素e:
Array: size = 12 , capacity = 20
補(bǔ)充:Java靜態(tài)數(shù)組和動(dòng)態(tài)數(shù)組的定義方式
數(shù)組的定義方式
靜態(tài):
//簡(jiǎn)化語(yǔ)法常用 定義和初始化同步完成
int [] a = {5,2,6,4,10};
動(dòng)態(tài):
//數(shù)組的定義和初始化同時(shí)完成,使用動(dòng)態(tài)初始化語(yǔ)法 int[] prices = new int[5];
補(bǔ)充:
//初始化數(shù)組時(shí)元素的類型是定義數(shù)組時(shí)元素類型的子類 Object[] books = new String[4];
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
MyBatis XML方式的基本用法之多表查詢功能的示例代碼
這篇文章主要介紹了MyBatis XML方式的基本用法之多表查詢功能的示例代碼,本文通過示例文字相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
解決使用httpclient傳遞json數(shù)據(jù)亂碼的問題
這篇文章主要介紹了解決使用httpclient傳遞json數(shù)據(jù)亂碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-01-01
java實(shí)現(xiàn)發(fā)送手機(jī)短信
這篇文章主要介紹了java實(shí)現(xiàn)發(fā)送手機(jī)短信,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
java中char類型轉(zhuǎn)換成int類型的2種方法
這篇文章主要給大家介紹了關(guān)于java中char類型轉(zhuǎn)換成int類型的2種方法,因?yàn)閖ava是一門強(qiáng)類型語(yǔ)言,所以在數(shù)據(jù)運(yùn)算中會(huì)存在類型轉(zhuǎn)換,需要的朋友可以參考下2023-07-07
idea springboot遠(yuǎn)程debug的操作方法
這篇文章主要介紹了idea springboot遠(yuǎn)程debug的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
java實(shí)現(xiàn)的2048游戲完整實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)的2048游戲,結(jié)合完整實(shí)例形式分析了java實(shí)現(xiàn)2048游戲功能的相關(guān)數(shù)值運(yùn)算、swing組件布局、事件響應(yīng)等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
SpringBoot配置Spring?Security的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot配置Spring?Security的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10

