数组的定义
数组:相同类型数据元素的集合,内存是连续的
数组初始化
int[] array1={1,2,3,4,5};
int[] array2=new int[]{1,2,3,4,5};
int[] array3=new int[5]; new产生一个对象。
“引用”:用来存放对象的地址
注意:
1.当数组越界之后:数组越界异常 运行期间
java.lang.ArrayIndexOutOfBoundsException;
2.数组名.length:数组的长度。length不是方法,是一个属性;
3.使用 [ ] 按下标取数组元素。需要注意, 下标从 0 开始计数;
4.使用 [ ] 操作既能读取数据, 也能修改数据;
5.当定义好数组之后,没有初始化,默认值为0;
数组中如果是引用,则默认为NULL。
JVM内存区域划分
1.Java虚拟机栈:局部变量
2.本地方法栈:native方法:底层由c/c++实现,特点:快
3.程序计数器:指令
4.堆:对象(关键字)
5.方法区:静态变量 类的信息
常量池:作用-》存放字符串常量的 String str=“hello”;
在JavaJDK之前,常量池在方法区中
从JDK1.7开始,常量池被挪到了堆当中
null:是所有引用类型的初始值。
int[] array=null;//长度为0
System.out.println(array.length);
java.lang.NullPointerException;空指针异常
System.out.println(Array.toString(array));将数组以字符形式进行输出
注意:
(1)局部变量和引用保存在栈上, new 出的对象保存在堆上.
(2)堆的空间非常大, 栈的空间比较小.
(3)堆是整个 JVM 共享一个, 而栈每个线程具有一份(一个 Java 程序中可能存在多个栈)
遍历数组方法
1.for循环
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
2.for-each循环
for (int x : arr) {
System.out.println(x);
}
打印数组
1.for循环
for (int x : a) {
System.out.println(x);
}
2.toString()方法(以字符串形式打印数组)
System.out.println(toString(arr));
拷贝数组
1.System.arraycopy();
2.Array.copyOf() 方法内部调用了System.arraycopy();
3.数组名.clone():数组名:拷贝的数组-》原数组
4.for();
以上4种拷贝方式,对数组当中如果是简单类型,那么就是深拷贝
如果数组当中存放的是引用类型,那么这4种拷贝方式,就是浅拷贝
如果是两个引用,同时指向一个对象,那么通过一个引用,修改当前对象的值后,那么另一个引用,也会受到影响,这就是浅拷贝。
关于数组的一些方法
求数组中最大的元素
public static int findMax(int[] array){
int max=array[0];
for(int i=0;i<array.length;i++){
if(max<array[i]){
max=array[i];
}
}
return max;
}
求数组中最小的元素
public static int findMin(int[] array){
int min=array[0];
for(int i=0;i<array.length;i++){
if(min>array[i]){
min=array[i];
}
}
return min;
}
求数组元素的平均值
public static int average(int[] array){
int sum=0;
for(int i=0;i<array.length;i++){
sum+=array[i];
}
return sum/array.length;
}
数组逆序
public static int[] reverse(int[] array) {
int left=0;
int right=array.length-1;
while(left<right){
int temp=array[left];
array[left]=array[right];
array[right]=temp;
left++;
right--;
}
return array;
}
查找数组中指定元素
//无序数组
public static int find(int[] arr, int key){
for(int i = 0; i < arr.length; i++){
if(arr[i] == key){
return i;
}
}
return -1;//未找到
}
//有序数组
public static int binarySearch(int[] arr, int key){
int left = 0;
int right = arr.length - 1;
while(left < right){
int mid = (left + right) >> 1;
if(key < arr[mid]){
right = mid - 1;
}
else if(key > arr[mid]){
left = mid + 1;
}
else{
return mid;
}
}
return -1;
}