Java里的数组介绍
注意, 本文講的是數組(Array),? 非數組型線性表容器(ArrayList).
一. C語言的靜態數組和動態數組.
稍微接觸過c的程序猿都應該知道, c語言里的數組分為靜態數組和動態數組.
1.1 靜態數組
所謂靜態數組就是內存全部位于Stack(棧)內存里的數組.
簡單地講, 就是沒有用malloc動態分配內存定義的數組.
例如下面三種定義語句都是定義了1個長度為5靜態整形數組:
注意下面的是c代碼而不是java代碼.
內存分配是這樣的:
如上圖, 數組內所有內存都是存放在Stack內存中的.
靜態數組的特點是長度一旦分配就不能改變.
1.2 動態數組
所謂動態數組就是利用malloc方法動態分配內存的長度的數組.
動態數組的內存保存在Heap區中, 然后把Heap區內存的頭部指針放到Stack內存中.
例如下面定義的就是1個長度為5的整形動態數組.
#include <stdio.h> #include <stdlib.h>int main(){int * a = (int *)malloc(sizeof(int) * 5);a[0] = 0;a[1] = 1;a[2] = 2;a[3] = 3;a[4] = 4; }內存分配是這樣的:
真正的數組內容放在Heap內存, 然后把Heap內存的頭部地址放入Stack內存.
動態數組的好處就是可以利用realloc 函數來擴展長度(重新分配內存)啦
還可以跨函數使用內存啦.
壞處就是用完注意釋放啦.
二. Java里的數組都是動態數組
好了, 到了Java語言, Java是由C/C++ 發展而來的, 但是java已經是1個完全的面向對象語言.
Java里已經不存在靜態數組這玩意. 所有數組都是動態數組.
也就是說:
Java里的數組內容全部都是放在Heap內存, Stack內存只會存放數組的引用(數組名).
三. Java數組的定義方法
Java里定義1個數組跟C語言有點區別.
java里定義1個數組, 方括號可以寫作數組后面, 但是更加建議寫在類型后面, 例如: int[] a; //建議 //int a[]; //也可以
而且不能在定義1個數組名時制定長度了, 因為java不再支持Stack區靜態內存 int[5] a; //錯誤, 編譯失敗 int a[5]; //同上
當執行完定義語句, 數組a是還沒能被使用的, 因為java只是定義了1個數組的引用, 并沒有分配內存.
內存分配如下圖:
見上圖,
int[] a;這條語句只在Stack區分配了1個數組的引用內存, 這塊內存的長度是4字節(32bit 系統地址長度), 但是內存是空的.因為是動態分配, 我們還需為數組a分配內存.
a = new int[5];上面代碼的意思就是在heap區分配1個長度為5的整形內存, 然后把地址賦給a啊.
見到new, 就相當于見到c語言的malloc函數, 動態分配啊.
是不是跟C語言的動態分配內存很相似? 值得留意的是java會給分配內存格式化.. 全部賦予初始值0. 這也是跟c語言一個大區別.
接下來為數組每1個位置賦值. 跟c語言寫法類似:
a[0] = 0;a[1] = 1;a[2] = 2;a[3] = 3;a[4] = 4;
數組內存里就有值了, 如下圖:
完整的代碼如下:
另外, 下面這兩種寫法也可以,
int[] b = new int[]{1,2,3};int[] c = {1,2,3};但是它們的效果都跟第一種寫法一樣, 都是動態數組.
四. Java數組是不是類?
有人可能覺得這類的定義方法很類似啊,
都要用到new , 就如new1個對象出來.
而且上面代碼的showArr()方法, 還見到 a.length , 這不是類的寫法, length貌似是數組a的成員啊.
實際上答案是 java中數組不是類.
java變量有兩種
1就是基本類型 例如int char (等8種)
2就是引用類型
其中引用類型包括 類, 接口, 數組
它們都需要動態分配內存(new).
也就是說, 我們可以把數組看成是1個跟類與接口平行的東西, 一個特殊的引用類型.
而length也不是數組的屬性, 而是1個特別的指令, 它專用于返回數組的長度.
更不是a的方法, 寫成
a.length()是錯誤的.
五. Java基本類型數組和引用類型數組.
java數組也可以分成兩類,
5.1 基本類型數組
所謂基本類型數組就是存放 int char float等8個基本類型的數組, 上面的整形數組就是這種類型.
不再詳細介紹了.
5.2 引用類型數組
所謂引用類型數組就是存放對象的數組, 數組里不是存放對象本身, 而是存放各個對象的地址.
類似與c語言的指針類型數組.
例如下面的代碼:
package Array_kng;class Student{int id;private String name;public Student(int id, String name){this.id = id;this.name = name;}public String toString(){return this.id + ": " + this.name;} }public class Array2{public static void f(){Student[] sArr = new Student[3];sArr[0] = new Student(1,"Jack");sArr[1] = new Student(2,"Bill");sArr[2] = new Student(3,"Cindy");showArr(sArr);}public static void showArr(Object[] a){int i;for (i=0; i<a.length; i++){System.out.println(a[i]);}} }sArr數組在內存的分配如下圖:
也就是講引用類型數組有雙重的指針指向.
理解了這個, 二維數組(跟c語言類似,本文不再講解了)也不難理解了.
六. Java數組的一些操作方法.
Java本身提供了一些靜態方法方便我們對數組操作.
多數位于
java.util.Arrays類中.
最常用的莫過于靜態方法sort. 和 binarySearch
還有1個數組很常用的copy的方法.
它就是
System.arraycopy().??
注意arraycopy沒有大寫字母哦
具體使用方法請自行查閱JDK API...
總結
以上是生活随笔為你收集整理的Java里的数组介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 里的泛型简介.
- 下一篇: Java Stream简介, 流的基本概