一维数组的使用:
声明和初始化
//一维数组的声明和初始化
//1.1静态初始化:数组的初始化和数组元素的初始化同时进行
int[] ids;
ids = new int[]{1001, 1002, 1003};
//1.2动态初始化:分开进行
String[] names = new String[5];
调用指定位置元素
//2.使用指定位置的元素:通过下标/索引:[0,length-1]
names[0] = "yyy";
names[1] = "zs";
names[2] = "ls";
names[3] = "wxm";
names[4] = "wkm";
数组长度和遍历
//3.获取数组长度:属性length
System.out.println(ids.length + " " + names.length);// 3 5
//4.遍历数组
for(int i = 0; i < names.length; i++)
System.out.println(names[i]);
数组元素初始化默认值
基本数据类型:
- 整型(int\short\byte\long):0
- 浮点(float\double):0.0
- 字符(char):0(“\u0000”)
- 布尔(boolean):false
引用数据类型,目前已学的:
- String:null
数组的内存解析
内存结构规范在JVM中,包括:
- 栈:局部变量
- 堆:new出来的结构(对象、数组)
- 方法区:常量池、静态域、
int[] arr = new int[]{1,2,3};
String[] arr1 = new String[4];
arr1[1] = "刘德华";
arr1[2] = "xxx";
String[] arr1 = new String[3];
以上一段代码为例,说明内存解析的具体过程(此处地址值只为说明问题,不具有严格准确性):
- 声明arr局部变量在栈(假设此段代码在main方法中声明),int数组各个元素保存在堆区,未初始化的初始值为0,同时栈区的arr保存地址0x34ab。在此处静态初始化三个元素分别为1、2、3。
- 同理,arr1变量本身在栈区,其元素在堆区的0x12ab,此地址值也保存在栈arr1中。String未初始化时是null,3、4句初始化了两个元素。
- 再次对arr1变量声明时,就是重新在堆区找了一块能够存放3个String的区域,地址为0x5566,此值替换了原先的0x12ab。所以在此之后,不可能通过arr1访问到0x12ab的四个元素的具体内容。
多维数组的使用
同一维数组的六个注意点:
package com.coderleo.arraytest;
public class TwodimArray {
public static void main(String[] args) {
//1.声明与初始化
//1.1标准静态初始化:
int[][] arr11 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//1.2标准动态初始化:
String[][] arr12 = new String[3][2];
//或者:
String[][] arr13 = new String[3][];//不写列号
//也可以这么写:
int[] arr4[] = new int[][]{{1,2,3},{4,5},{6,7,8}};//一个[]放在类型名称后
int[] arr5[] = {{1,2,3}, {4,5,9,10}, {6,7,8}};//省略new int关键字和[][]
//2.调用元素
System.out.println(arr11[1][1]);//5
System.out.println(arr12[2][1]);//null
/*对于arr13,还没有确定列号,即每行也是一个未确定个数的一维数组,
所以在访问前要先申请,否则就会报错:空指针异常*/
arr13[1] = new String[4];
System.out.println(arr13[1][3]);//null
//3.获取数组的长度
System.out.println(arr4.length);//3
System.out.println(arr5[1].length);//4
//4.遍历二维数组:双重循环
//5.默认初始化1
System.out.println(arr11[1]);//外层元素的地址:[I@15db9742
System.out.println(arr12);//二维数组地址:[[Ljava.lang.String;@6d06d69c
//默认初始化2,不带列号的情况
System.out.println(arr13[2]);//null
//6.内存解析
}
}
Arrays类简介
java.util.Arrays:操作数组的工具类,包含了很多操作数组的方法
这里简介几个方法:
package com.coderleo.arraytest;
import java.util.Arrays;
public class ArraysMethods {
public static void main(String[] args) {
/*1.boolean equals(int[] a, int[] b)
judge whether two arrays are equal?*/
int[] arr1 = {1,2,3,42};
int[] arr2 = {12, 48, 3, -6};
System.out.println(Arrays.equals(arr1,arr2));//false
int[] arr3 = {1,2,3,4};
int[] arr4 = {1,2,3,4};
System.out.println(Arrays.equals(arr3, arr4));//true
/*2.String toString(int[] a):output the array by String
* */
System.out.println(Arrays.toString(arr1));//[1, 2, 3, 42]
/*3.void fill(int[] a,int val):fill the "val" with array "a"
* */
Arrays.fill(arr1, -3);
System.out.println(Arrays.toString(arr1));//[-3, -3, -3, -3]
/*4.void sort(int a):sort this array
* */
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));//[-6, 3, 12, 48]
/*5.int binarySearch(int[] a, int key):
* */
int[] arr5 = {-98,-34,2,34,54,66,79,105,211,333};
System.out.println(Arrays.binarySearch(arr5, 79));//index is 6
System.out.println(Arrays.binarySearch(arr5, 78));//index is negative
}
}