数组
- 相同类型数据的集合,内存是连续的。
- 定义:
int[] array1={1,2,3,4,5};(静态初始化)
int[] array2=new int[]{1,2,3,4,5};(动态初始化)
int[] array3=new int[5];
-
引用:用来存放对象的地址
-
数组越界异常(运行期间)
-
数组名.length:数组长度。length不是方法,是一个属性。
字符串名.length():字符串长度。length是方法 -
foreach循环
for(int x:array1){
}
for(表达式1:表达式2){
}
//表达式1:数组当中的变量
//表达式2:数组名
for循环和foreach的区别?
foreach不能用下标来访问
- 当定义好数组之后,没有初始化,默认值为0;数组当中是引用类型,为NULL
- java 按值传递
java当中数组的内存分析:
划分区域:
-
java虚拟机栈:局部变量
-
本地方法栈:native方法:底层由c/c++实现,特点快
-
程序计数器:指令
-
堆:对象。new关键字
-
方法区: 静态变量 类信息
-
常量池:作用-》存放字符串常量的。
在jdk1.7之前,常量池在方法区当中
在jdk1.7之后,常量池被挪到了堆当中
注意:
- int[] array={};//长度为0
- [l@16d3586 地址的哈希码 ,这个地址是通过真实地址进行哈希过的
- null:是所有引用类型的初始值。和0没有关系
- 点号之前Null大概率情况下出现空指针异常
copy数组:
- 方法一:for循环
- 方法二:
System.arraycopy(array,0,array2,0,array.length);
速度快,被native所修饰的方法 - 方法三:
array2=Arrays.copyOf(array,array.length);
内部调用System.arraycopy(); - array2=array.clone();
对数组当中如果是简单类型来讲,就是深拷贝
如果数组当中存放的是引用类型,就是浅拷贝
- copyOf 是将数组进行了 深拷贝, 即又创建了一个数组对象, 拷贝原有 数组中的所有元素到新数组中. 因此,修改原数组,不会影响到新数组.
- 如果两个引用,同时指向一个对象,那么通过一个引用,修改当前对象的值后,那么另一个引用也会受到影响,这种拷贝就叫浅拷贝
二维数组:
不规则的二维数组:
int[][] array=new int[3][];
array[0]=new int[2];
array[1]=new int[3];
array[2]=new int[4];
int[][] array1={{1},{3,4},{5,6}};
//for循环打印会发生数组越界异常
//打印二维数组
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
System.out.print(array[i][j]);
}
}
Arrays工具类的使用
导入包java.util.Arrays;
alt+回车:自动导入包
-
以字符串形式输出一维数组:
Arrays.toString(int[] a)
-
以字符串形式输出二维数组
Arrays.deepToString(array)
-
拷贝部分数组:
int[] ret=Arrays.copyOfRange(int[] original, int from, int to);
-
比较两个数的值
Arrays.equals(int[] a, int[] a2);
int[] array={1,2,3,4};
int[] array1={1,2,3,4};
System.out.println(Arrays.equals(array,array1));//true
-
二分查找
Arrays.binarySearch(int[] a,int fromIndex,int toIndex,int key)
左闭右开 -
把整个数组全部填充成9
Arrays.fill(array,9)
-
从2号下标到7号下标填充成9
Arrays.fill(array,2,7,9)
-
对数组进行排序
Arrays.sort(array)
Arrays.sort底层是什么排序?
快排