一、数组概述
1.定义:数组是存储同一种数据类型多个元素的集合,可以看成是一个容器。
2.数组既可以存储基本数据类型,也可以存储引用数据类型。
注意:
1) 基本数据类型包括byte、short、int、long、float、double、boolean、char;
引用数据类型包括数组、类、接口、枚举。
其中基本数据类型分类:
整数类型:byte、short、int、long,默认初始值均为0
- byte:字节型,占1个字节,即8位。取值范围为-2^7~2^7-1,即-128~127
- short:短整型,占2个字节,即16位。取值范围为-2^15~2^15-1,即-32768~32767
- int:整型,占4个字节,即32位。取值范围位-2^31~2^31-1,即-2147483648~2147483647
- long:长整型,占8个字节,即64位。取值范围为-2^63~2^63-1,即−9223372036854775808~9223372036854775807
浮点类型:float、double,默认初始值为0.0
- float:单精度,占4个字节,默认值为0.0F.举例为Float f = 23.13f;
- double:双精度,占8个字节,默认值为0.0D. 举例为Double d = 12.345;
布尔类型:boolean 布尔型,值为true 或 false,默认值为false
字符类型:char 字符型,最小值为'\u0000',最小值为'\uffff',默认值为'\u0000'
2) 基本数据类型优先级比较
(byte、short、long) < int < long < float < double
优先级较低的可自动转换为优先级较高的,优先级较高的转换成优先级低的需进行强制类型转换。另外byte、short、char三者之间不存在隐式转换,只能进行强制类型转换。
3)基本数据类型与引用数据类型的值传递:
- 基本数据类型的值传递不改变原值,因为方法调用完毕会弹栈,局部变量会随之消失
- 引用数据类型的值传递改变原值,因为即使方法弹栈,但是new出来的数组对象还会存在堆内存,可以通过地址继续访问
4)Java中到底是传值还是传址?
- 说法1 既传值也传址,基本数据类型传递的是值,引用数据类型传递的是地址。
- 说法2 Java中只有传值,因为地址值也是值√
3.数组定义格式
1)一维数组
-
动态初始化:只指定初始长度,由系统给出初始值,初始值为0,格式为:
数据类型[] 数组名 = new 数据类型[数组长度]; 如:int[] arr1 = new int[5];
-
静态初始化:直接给出初始化值,系统判断长度,格式有二:
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3, ……}; 数据类型[] 数组名 = {元素, 元素2, 元素3, ……}; ——>简写形式 如:int[] arr3 = new int[]{11, 22, 33, 44, 55}; //静态初始化 int[] arr2 = {11, 22, 33, 44, 55}; //静态初始化简写形式
-
其他格式(不常用)
数据类型 数组名[] = new 数据类型[数组长度]; 数据类型 数组名[] = new 数据类型[]{元素1, 元素2, 元素3, ……}; 数据类型 数组名[] = {元素, 元素2, 元素3, ……}; 如:int arr4[] = new int[5]; int arr5[] = {11, 22, 33, 44, 55}; int arr6[] = new int[]{11, 22, 33, 44, 55};
注意:数组的初始化不允许动静结合,即int[] arr = new int[5]{11, 22, 33, 44, 55};这种写法绝对错误
-
直接打印数组为其地址值
如:[I@19bb25a中[代表的数组、有几个就代表几维数组;I代表是int类型;@是固定符号;19bb25a代表十六进制的地址值。
2)二维数组
-
动态初始化:
数据类型[][] 数组名 = new 数据类型[m][n]; 如:int[][] arr = new int[3][2];这是一个二维数组,其中包括3个一维数组,每个一维数组中有2个元素。
-
其他格式:
数据类型 数组名[][] = new 数据类型[m][n]; 数据类型[] 数组名[] = new 数据类型[m][n];
注意:int[] x,y[]; 这是定义了一个一维数组x和一个二维数组y
4.数组操作可能会出现的问题
-
越界:ArrayIndexOutOfBoundsException数组索引越界异常
原因:访问了数组中不存在的索引 -
空指针:NullPointerException空指针异常
原因:数组已经不再指向堆内存,而你还在用数组名去访问元素。即当数组引用赋值为null,再去调用数组中的元素就会出现空指针异常。
二、内存图
三、使用Arrays工具类操作数组常用方法
- public static String toString(int[] arr): 将int型数组转化为String,源码如下:
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder(); //因为是单线程,不需要考虑线程安全问题,所以可以使用StringBuilder效率高
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
- public static void sort(int[] arr): 将int型数组进行排序
- public static int binarySearch(int[] a, int key): 二分查找,前提条件a必须是一个有序数组,源码如下:
private static int binarySearch0(int[] a, int fromIndex, int toIndex,int key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
注意:Arrays工具类中所有的方法都是静态的,所以只能用类名.调用,即Arrays.方法
如有问题 请多多指教