數組簡單介紹
-
數組是一種引用類型
-
數組是一種簡單的數據結構,線性的結構
-
數組是一個容器,可以用來存儲其他元素,數組可以存儲任意數據類型的元素
- 數組中存儲的元素的類型是統一的。
-
數組分爲:一維數組、多維數組
-
數組長度不可以改變
- 數組一旦創建,對應的長度是固定的,不可變的。
-
數組的索引效率較高,增刪元素的效率較低(涉及到元素的移動)
一維數組初始化
初始化以爲數組有兩種方式:
-
靜態初始化
int[] a1 = {1, 2 3, 5};
-
動態初始化
- 會先再堆內存中分配這個數組,並且數組中的每一個元素都採用默認值
- byte short int long
0
- float double
0.0
- boolean
false
- char
\u0000
- 引用
null
- byte short int long
- 會先再堆內存中分配這個數組,並且數組中的每一個元素都採用默認值
// 動態初始化一維數組, 最多可以存儲4個元素
int[] a2 = new int[4];
什麼時候使用動態初始化,什麼時候使用靜態初始化?
- 無論是靜態初始化還是靜態初始化,最終在內存的分佈都是一樣的
- 在創建數組的時候,如果已經知道數組中存儲什麼數據,當然採用靜態初始化
- 在創建數組的時候,無法預測到數組中存儲什麼數據,只是開闢空間,則使用動態初始化
深入一維數組:
- 創建一個數組,使得該數組既可以存儲Dog,又可以存儲Cat
public class Test02 {
public static void main(String[] args) {
// 需求: 創建一個數組,這個數組既可以存儲Dog,又可以存儲Cat
Animal[] as = new Animal[4];
Dog d1 = new Dog();
Dog d2 = new Dog();
Cat c1 = new Cat();
Cat c2 = new Cat();
as[0] = d1;
as[1] = d2;
as[2] = c1;
as[3] = c2;
for(Animal a: as) {
if(a instanceof Dog) {
Dog d = (Dog)a;
d.eat();
}else if(a instanceof Cat) {
Cat c = (Cat)a;
c.move();
}
}
}
}
class Animal{
}
class Dog extends Animal{
public void eat() {
System.out.println("Dog eat");
}
}
class Cat extends Animal{
public void move() {
System.out.println("Cat move");
}
}
- 數組的參數傳遞
public class Test03 {
public static void main(String[] args) {
int[] arr = new int[4];
arr[0] = 23;
arr[1] = 223;
arr[2] = 766;
arr[3] = 43;
m1(new int[] {1,2,4,23});
m1(arr);
}
private static void m1(int[] a) {
for (int item : a) {
System.out.println(item);
}
}
}
main()
方法中的參數列表String[] args
參數詳解
-
String[] args
是專門用來接收命令行參數的// Test04.java public class Test04 { public static void main(String[] args) { System.out.println("args 元素的個數:" + args.length); } }
-
運行過程
java Test04 abc dfd ggf
輸出結果爲:3
JVM 在調用Test04的 main方法之前,先將 “abc dfd ggf” 這個字符串以“空格”的方式分割,然後存儲在 args 數組中, 等價爲:
JVM { String[] args = {"abc", "dfd", "ggf"}; Test04.main(args); }
-
數組的拷貝
System類中有 arraycopy方法,可以用來實現數組的拷貝:
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
// arraycopy 方法底層是由C++ 實現的
數組拷貝舉例:
public class Test05 {
public static void main(String[] args) {
// System.arraycopy(src, srcPos, dest, destPos, length);
int[] src = {1,2,3,4,5,6,7};
int[] dest = {10, 20, 30, 40, 50, 60, 70, 80};
System.arraycopy(src, 2, dest, 4, 2);
for (int i = 0; i < dest.length; i++) {
System.out.print (dest[i] + " ");
}
}
}
輸出:
10 20 30 40 3 4 70 80
二維數組分析
二維數組是特殊的一維數組,二維數組的每一個元素都是一個一維數組
靜態初始化二維數組
int[][] a = {
{1,2,3},
{4},
{54,34,2}
}
- 二維數組的每一個元素的長度可以不同
遍歷二維數組
for(int i=0; i<a.length; i++){
for(int j=0; j<a[i].length; j++){
System.out.print(a[i][j] + " ");
}
System.out.println();
}
動態初始化二維數組
int[][] a = new int[3][4];
遍歷二維數組
for(int i=0; i<a.length; i++){
for(int j=0; j<a[i].length; j++){
System.out.print(a[i][j] + " ");
}
System.out.println();
}
數組(Arrays
)工具類
java.util.Arrays;
-
排序
import java.util.Arrays; public class Test07 { public static void main(String[] args) { int[] a = {1,2,3,4,21,4,1,5,2,63,25,63,23,52}; System.out.println(a); Arrays.sort(a); for(int i=0; i< a.length; i++) { System.out.print(a[i] + " "); } } }
-
二分查找
import java.util.Arrays; public class Test08 { public static void main(String[] args) { //int[] a = {1,2,3,4,21,4,1,5,2,63,25,63,23,52}; // 二分查找要求數組是已經排好序的 int[] a = {1, 1, 2, 2, 3, 4, 4, 5, 21, 23, 25, 52, 63, 63}; int index = Arrays.binarySearch(a, 63); System.out.println(index); } }
-
填充數組
public class Test09 { //程序入口 public static void main(String[] args) { int[] a = {1,4,3,2,5}; Arrays.fill(a, 3); for(int i=0; i<a.length; i++) { System.out.print(a[i] + " "); } } } // 輸出:3 3 3 3 3
接收用戶鍵盤輸入
java.utils.Scanner;
System.in; // java中的標準輸入流
舉例
import java.util.Scanner;
public class Test06 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String msg = s.next();
System.out.println("你輸入的是:" + msg);
}
}
以上