数组定义:相同数据类型的集合。(在内存中是连续的。)
一、一维数组:
1.定义:
int[] arr1={1,2,3,4,5};
int[] arr2=new int[]{1,2,3,4,5};//new产生一个对象
int[] arr3=new int[5];
引用:用来存放对象的地址
2.使用
①访问数组中的元素
System.out.println(arr[1]);
②数组名.length表示数组的长度(length不是方法,是属性,字符串中是方法)
③遍历数组
for(int x:arr1){//x数组当中的变量 arr1数组名
System.out.println(x+" ")
}
for(int i=0;i<arr1.length;i++){
System.out.print(arr1[i]+" ");
}
3.注意:
①数组越界:异常(数组越界异常)
java.lang.ArrayIndexOutOfBoundsException
②for循环和foreach的区别:foreach不用下标访问
③定义好数组没有初始化,数组默认值为0(数组如果是引用类型,则为null)
重点:
①按值传递:不改变变量的值
按引用传递:传的是对象的地址,类似于指针
总结: 所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进 行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大)
②java中数组的内存分析:(JVM内存区域划分,线程拥有前三个)
java虚拟机栈(JVM Stack):局部变量(数组名arr1)
本地方法栈(Native Method Stack):native方法:底层由C++实现,特点:快
程序计数器(PC Register):指令
堆(Heap):对象,new关键字(数组对象)
方法区(Mathod Area): 静态变量 类的信息
常量池(Runtime Constant Pool):作用->存放字符串常量 String str=“hello”;
在JDK1.7之前,常量池在方法区中
从JDK1.7开始,常量池被挪到了堆当中
③null:是所有引用类型的初始值
java.lang.NullPointerException //空指针异常
int[] arr={};//数组长度为0;
System.out.println(arr1);//打印出的是地址的哈希码(是通过真实地址进行哈希过的)
④数组的常用方法:
数组转字符串
System.out.println(Arrays.toString(arr));//Array是java中的工具类,使用时需导入包
数组拷贝
System.arraycopy(arr,0,arr1,0,arr.length);//本地方法(被native修饰),速度快,无 返回值
arr1=Arrays.copyOf(arr,arr.length);//返回值为数组,不需要new,内部调用了System.arraycopy();
arr1=arr.clone();
深拷贝:数组当中存放的是内置类型或简单类型,需要新定义一个拷贝对象(存在新的数组中)
浅拷贝:数组当中是引用类型,如果是两个引用同时指向一个对象,那么通过一个引用修改当前的对象的值后,另一个引用也会受到影响。
数组排序
Arrays.sort(arr);
二、二维数组
打印二维数组:(两个for循环)
System.out.println(Arrays.deepToString(arr));
int[][] arr=new int[3];
arr[0]=new int[2];//第一行两列
arr[1]=new int[3];//第二行三列
Array工具类的常用方法:
copyOfRange(int[] original, int from, int to)
将指定数组的指定范围复制到新数组中。
equals(int[] a, int[] a2)
如果两个指定的int数组彼此 相等 ,则返回 true 。
fill(int[] a, int val)
将指定的int值分配给指定的int数组的每个元素。
fill(int[] a, int fromIndex, int toIndex, int val)
将指定的int值分配给指定的int数组的指定范围的每个元素。
sort(int[] a)
按照数字顺序排列指定的数组。
sort(int[] a, int fromIndex, int toIndex)
按升序排列数组的指定范围。
copyOf(int[] original, int newLength)
复制指定的数组,用零截取或填充(如有必要),以便复制具有指定的长度。