聲明Java數組時,會在內存中開闢一塊連續指定大小的空間,用來存儲固定大小的同類型元素java
在java中定義個名爲scores,長度爲8,類型爲int類型的數組以下:git
public static void main(String[] args) {
int[] scores = new int[8];
}
複製代碼
爲了便於理解,咱們看下它在內存的中的分佈示意圖:github
圖中的一個個小格子是用來存放數組的元素,小格子上方的0-7
數字,是數組中每一個元素的下標(也能夠叫索引),若是咱們要查詢數組中指定位置的元素,咱們能夠經過數組名[索引]
來獲取,好比圖中的scores[2]
數組
在圖中咱們還能夠看到,數組的起始下標是從0
開始的(也就是第一個元素),最後一個元素的下標是7
(也就是數組的長度8
減1
)由此類推,數組長度如果n
,那麼數組最後一個元素的下標是n-1
(數組的起始下標老是從0
開始的)數據結構
各位不要閒嘮叨哈,爲了照顧全部人(其實個人心裏是很糾結的。。。😆)函數
使用data
屬性表示存放數組的元素,測試
使用capacity
屬性表示數組的容量(等價於數組的長度),可是真正自定義數組類的時候咱們不須要顯示聲明,由於隱示等價於(Array.length
)this
使用size
屬性表示數組中真正存放元素的個數(注意和capacity
概念的區分)。spa
咱們畫出示意圖:code
下面咱們來完成初始代碼
public class ArrayExample {
/** * 存放數組的元素 */
private int data[];
/** * 數組中元素的個數 */
private int size;
/** * 根據指定capacity容量初始化數組 * * @param capacity 容量 */
public ArrayExample(int capacity) {
data = new int[capacity];
size = 0;
}
/** * 無參構造函數,指定默認數組容量capacity=10 */
public ArrayExample() {
this(10);
}
/** * 獲取數組中元素的個數 * * @return */
public int getSize() {
return size;
}
/** * 獲取數組容量 * * @return */
public int getCapacity() {
return data.length;
}
}
複製代碼
假設如今數組的形態是這樣,咱們須要將77
元素插入到索引爲1
的位置
思路分析:把當前索引爲1
的位置元素以及後面的元素都向後挪一個位置,而後將77
這個元素放到索引爲1
的位置(注意:挪位置的時候,咱們應該從最後一個元素100
向後挪一個位置,換句話說從後往前挪),完成以後,維護一下size
的索引,進行size++
操做(size
是始終指向數組中下一個沒有元素的位置)
下面咱們基於前面寫的代碼,來完成數組元素的添加操做
/** * 在index位置插入元素 * * @param index 指定索引 * @param element 插入的元素 */
public void add(int index, int element) {
// 簡單的邊界判斷
if (size == data.length) {
throw new IllegalArgumentException("數組添加失敗,數組已滿");
}
if (index < 0 || index > size) {
throw new IllegalArgumentException("index索引不合法");
}
// 從最後一個元素一直到size位置的元素,日後挪動一位
for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
// 位置賦值
data[index] = element;
// 維護size大小
size++;
}
複製代碼
因爲方面你們查看,只貼出添加數組元素的代碼,本文文末,會貼出完成的代碼示例地址
如今若是咱們想把一個元素添加到數組頭部的位置或者尾部的位置,咱們能夠這麼作
/** * 向數組頭的位置添加元素 * * @param element 元素 */
public void addFirst(int element) {
add(0, element);
}
/** * 向數組尾的位置添加元素 * * @param element 元素 */
public void addLast(int element) {
add(size, element);
}
複製代碼
你們必定要注重代碼的複用性哈
/** * 獲取index索引位置的元素 * * @param index 索引 * @return */
public int get(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("獲取失敗,索引不合法");
}
return data[index];
}
複製代碼
/** * 修改index索引位置的元素爲element * * @param index 索引 * @param element 元素 */
public void set(int index, int element) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("獲取失敗,索引不合法");
}
data[index] = element;
}
複製代碼
/** * 查找數組中是否有元素element * * @param element * @return */
public boolean contains(int element) {
return Arrays.stream(data).filter(x -> x == element).findAny().isPresent();
}
複製代碼
這裏使用了Java8的lambda表達式,不知曉的盆友,能夠自行去了解一下
/** * 查找數組中元素element所在的索引,若是不存在元素element,則返回-1 * * @param element * @return */
public int find(int element) {
for (int i = 0; i < data.length; i++) {
if (data[i] == element) {
return i;
}
}
return -1;
}
複製代碼
如今咱們要刪除索引爲1
的元素77
思路分析:咱們知曉了數組的插入思路,那麼數組的刪除思路,恰好和數組的插入思路相反,若是要刪除索引爲1
位置的元素77,咱們只須要,從索引2
開始,將索引2
位置的元素向左
移動到索引爲1
的位置,也就是將索引2
位置的元素的值賦值給索引爲1
位置的元素(等價於data[1]=data[2]
),依次類推,將索引爲3
位置的元素,移動到索引爲2
位置的元素,一直到最後一個元素,好比圖中的元素100
,完成以後,這時候,咱們須要再次維護一下size
的大小,咱們要進行size--
操做
重要
size
既表示數組中元素的大小,又表示始終指向數組中第一個沒有元素的位置
代碼完成數組的刪除操做
/** * 刪除索引index位置的元素,並將刪除的元素返回 * * @param index * @return */
public int remove(int index) {
// 簡單判斷數組索引的合法性
if (index < 0 || index >= size) {
throw new IllegalArgumentException("刪除數組元素失敗,索引不合法");
}
// 存放刪除指定索引的位置元素
int result = data[index];
// 從刪除指定索引的後一個位置,一直往前挪一位,直到最後一個元素
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
// 維護size的位置
size--;
return result;
}
複製代碼
完成了數組元素的刪除操做,咱們還能夠便捷地爲數組添加刪除數組中第一個元素的方法和刪除數組中最後一個元的方法。
刪除數組中第一個元素的方法
/** * 刪除數組中第一個元素,並將刪除的元素進行返回 * * @return */
public int removeFirst() {
return remove(0);
}
複製代碼
刪除數組中最後一個元素的方法
/** * 刪除數組中最後一個元素,並將刪除的元素進行返回 * * @return */
public int removeLast() {
return remove(size - 1);
}
複製代碼
至此,咱們已經完成了數組的增刪改查操做,下面咱們寫個測試類,來使用一下咱們本身寫的簡單版數組
public class ArrayExampleTest {
@Test
public void testAdd() {
// 初始化數組容量大小爲5,目前數組中沒有任何元素
ArrayExample arrayExample = new ArrayExample(5);
System.out.println(arrayExample);
// 向數組中歐添加第一個元素
arrayExample.addFirst(1);
System.out.println(arrayExample);
// 向數組中添加最後一個元素
arrayExample.addLast(2);
System.out.println(arrayExample);
// 向數組中索引爲0的位置添加元素
arrayExample.add(0, 10);
System.out.println(arrayExample);
}
// TODO 其它測試方法,讀者能夠自行測試
}
複製代碼
運行結果
ArrayExample{data=[0, 0, 0, 0, 0], size=0,capacity=5}
ArrayExample{data=[1, 0, 0, 0, 0], size=1,capacity=5}
ArrayExample{data=[1, 2, 0, 0, 0], size=2,capacity=5}
ArrayExample{data=[10, 1, 2, 0, 0], size=3,capacity=5}
複製代碼
完整版代碼GitHub倉庫地址:Java版數據結構-數組 歡迎你們關注和Star
本次咱們完成的是靜態數組的實現,每每靜態數組不夠靈活,後面筆者會在代碼倉庫中實現動態數組,就不做爲一個篇幅來說解了,接下來,筆者還會一一的實現其它常見的數組結構。
持續更新中,歡迎你們關注公衆號:小白程序之路(whiteontheroad),第一時間獲取最新信息!!!