Java基础内容 (4) ---- 数组的基本使用,数组的常见算法
1.数组的基本使用
1.1定义数组
1.2访问数组
1.3数组中的常见异常
//1.1动态,静态定义数组
int[] arr0 = new int[6];
//数组类型与元素类型一致:int[] arr0 = new double[6]错于int类型数组不能存储double类型的数据
//[]表示数组:int arr0[]或者 int[] arr0都可以表示int类型数组
//new关键字在堆中为数组申请内存空间:int[] new = new int[6]错于标识符于关键字同名
//数组长度必须指定,指定后不能更改:int[] arr0 =new int[]错于没有指定数组长度
//
int[] arr0 = new int[]{0,1,2,3,4,5};
int[] arr0 = {0,1,2,3,4,5};
//数组动态定义指定长度不指定元素,静态定义自定长度的同时指定元素
//-------------------------------------------------------------------
//1.2获得数组长度,访问数组首末元素,为元素赋值
System.out.println(arr0.length);
int a = arr0[0];
int b = arr0[arr0.length-1];
arr0[0]=10;
//---------------------------------------------------------------------
//1.3 数组常见异常
//1.3.1ArrayIndexOutOfBoundsException数组越界异常
System.out.println(arr0[8]);
//arr0数组不存在[8]索引,访问越界
//1.3.2NullPointerException空指针异常
arr0 = null;
System.out.println(arr0[0]);
//arr0 = null; 变量arr0不再保存数组的内存地址,则不能继续对数组进行操作
1.4以数组为方法参数,方法返回数组
- 数组作为方法参数传递,传递的参数是数组内存的地址。
- 数组作为方法的返回值,返回的是数组的内存地址。
public class arrayCode0 {
public static void main(String[] args) {
//1.4数组作为方法的参数,方法返回数组
int[] arr = getArray();
System.out.println("方法返回arr的内存地址");
System.out.println(arr);
adrArray(arr);
}
public static int[] getArray(){
int arr[] = new int[]{1,2,3};
return arr;
}
public static void adrArray(int[] arr){
System.out.println("传递的参数是arr的内存地址");
System.out.println(arr);
}
}
方法返回arr的内存地址
[I@1b6d3586
传递的参数是arr的内存地址
[I@1b6d3586
2.数组的常见算法
2.1 遍历: 将数组中的每个元素分别获取出来,遍历数组是其他算法的基石。
2.2 最值:从数组的所有元素中找出最大(小)值。在遍历数组的基础上,元素一一与最值变量比较并更新最值变量实现。
2.3反转:数组中的元素颠倒顺序。在遍历数组的基础上,将对应位置一一对换元素实现。
public class arrayCode {
public static void main(String[] args) {
System.out.println("遍历数组");
//2.1 遍历数组--- 一一打印
int[] arr1 = new int[]{0, 2, 3};
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
//2.1遍历数组---循环打印
int[] arr2 = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+"\t");
}
System.out.println();
//---------------------------------------------------------------
System.out.println("查找数组最大值");
//2.2找最大值
int max = arr2[0];
for (int i = 1; i < arr2.length; i++) {
if (max < arr2[i]) {
max = arr2[i];
}
}
System.out.println(max);
//---------------------------------------------------------------
System.out.println("数组反转");
//2.3反转
for (int end = arr2.length - 1, head = 0; head<end ;end--, head++){
int mediate = arr2[head];
arr2[head] = arr2[end];
arr2[end] = mediate;
}
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i]+"\t");
}
System.out.println();
//方法二
//for(int i = 0; i<arr2.length/2; i++){
// mediate = arr2[i] ;
// arr2[i] = arr2[arr2.length-1-i];
// arr2[arr2.length-1-i] = mediate;
//}
}
}
遍历数组
0
2
3
0 2 3
查找数组最大值
8
数组反转
8 7 6 5 4 3 2 1
2.4复制(赋值):将数组1的元素(arr1[])复制给数组2(arr2[])。在遍历数组的基础上,将数组1的元素一一赋给数组2对应位置实现。
注意:区分“复制” 与 “将变量arr1的内存地址赋给变量arr2”。
package com.baishi.stage1.day05;
public class arrayCode1 {
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
System.out.println("数组1赋值给数组2");
//2.4复制(赋值)
int [] arr2 = new int[arr1.length];
for (int i = 0; i < arr2.length; i++) {
arr2[i] = arr1[i];
//将arr1的元素复制给arr2,arr1和arr2内存地址不同但是数组元素值相同
}
//
//对arr2做出的改变不影响arr1
for(int i=0; i < arr2.length; i++){
if(i%2==0){
arr2[i]=0;
}
}
//
//打印arr1和arr2对比
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+"\t");
}
System.out.println();
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i]+"\t");
}
System.out.println();
//2.4* 复制区别于两个应用变量指向同一内存地址
System.out.println("两个变量指向同一个数组");
arr2 = arr1;
//将arr1的内存地址赋给arr2,arr1与arr2指向同一个数组,修改arr2意味着arr1也会被修改
//
for(int i=0; i < arr2.length; i++){
if(i%2==0){
arr2[i]=1;
}
}
//
//打印arr1和arr2对比
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+"\t");
}
System.out.println();
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i]+"\t");
}
System.out.println();
}
}
数组1赋值给数组2
1 2 3 4 5 6 7 8
0 2 0 4 0 6 0 8
两个变量指向同一个数组
1 2 1 4 1 6 1 8
1 2 1 4 1 6 1 8
2.5 查找:在数组中找到指定元素的位置。
- 线性查找:在遍历数组的基础上,一一判断元素是否与指定的元素相等实现。
- 二分法查找:前提是有序数组。每次中间元素与指定元素比较,直接得到结果或者排除掉一半的元素。比较次数低于线性查找。
package com.baishi.stage1.day05;
public class arrayCode2 {
public static void main(String[] args) {
int[] arr2 = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
//2.5.1线性查找
for (int i = 0,count = 0; i < arr2.length; i++) {
count++;
if (arr2[i] == 5) {
System.out.println("5在第" + (i + 1) + "个位置");
System.out.println("共比较了"+count+"次");
}
}
System.out.println();
//2.5.2二分查找
//二分查找的前提是有序数组
int left = 0, right = arr2.length - 1;
int count = 0;
while (left <= right) {
int mid = (left + right) / 2;
count++;
if (arr2[mid] == 5) {
System.out.println("5在第" + (mid + 1) + "个位置");
System.out.println("共比较了"+count+"次");
break;
} else if (arr2[mid] < 5) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
}
5在第5个位置
共比较了5次
5在第5个位置
共比较了3次