数组简单介绍
-
数组是一种引用类型
-
数组是一种简单的数据结构,线性的结构
-
数组是一个容器,可以用来存储其他元素,数组可以存储任意数据类型的元素
- 数组中存储的元素的类型是统一的。
-
数组分为:一维数组、多维数组
-
数组长度不可以改变
- 数组一旦创建,对应的长度是固定的,不可变的。
-
数组的索引效率较高,增删元素的效率较低(涉及到元素的移动)
一维数组初始化
初始化以为数组有两种方式:
-
静态初始化
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);
}
}
以上