Java0608-node
1 数组
1.1概念
数组是指内存中一块连续的空间,数量固定且存储类型相同
特点:
- 长度:指数组中最多可以存储几个数据
- 数组名:链接到数组第一个值的存储地址,可以据此快速找到数组中的数据
- 元素:数组中存储的数据
- 数组的数据类型:数组中所存储的数据的数据类型
- 下标:索引数组内下标位置的值(从0开始到数组长度-1),若超过数组长度,会引发数组下标越界异常
1.2 数组的使用
/**
* 声明数组
*/
//数据类型[] 数组名
int[] names;//推荐
//数据类型 数组名[]
String strs[];
//申请空间
names = new int[7];//长度从0~6
strs = new String[3];
//边声明,边申请空间
char[] char1 = new char[2];
/**
* 数组的使用
*/
//获取长度(name.length)
int len = char1.length;
System.out.println(len);//2
//获取元素(name[下标])
//系统会给素组分配默认值:int——0、double——0.0、
//boolean——false、String——null(null是引用类型的默认值)
int num1 = names[0];
System.out.println(num1);//0
//存储数据——赋值
//单个赋值
names[0] = 123;
names[2] = 124;
//简便赋值(长度根据具体值量给定)——只能写在一行
int[] array = {1,2,3,4,5};
System.out.println(array.length);//5
System.out.println(array[3]);//4
//可以写在多行
char[] char2;
char2 = new char[]{'1','b'};
//通过键盘输入输入
Scanner input = new Scanner(System.in);
for(int i=0;i<=array.length-1;i++){
System.out.print("请输入:");
array[i] = input.nextInt();
}
//增强for foreach
//依次从array内取值,赋值给n
//优点:没有数组下标,不会越界(ArrayIndexOutOfBoundsException)
//局限:为遍历而生,不能修改数组内值
for(int n:array){
System.out.print(n+" ");
}
//int[] a
//int[] b都是引用类型的变量
a = b;//将b里存的数组的地址,赋值给a,对a进行修改时,会影响b查找时的值
1.3使用场景
多个相同类型的数组的存储
1.4应用
- 查找
12、23、34、45、56——34
二分查找
Arrays.binarySearch(数组名,需要查找的值/变量);
找不到时,返回的值不固定//二分查找实现 import java.util.Scanner; public class Test04 { public static void main(String[] args) { int[] array = new int[100]; int left = 0;//数组最左边 int len = array.length;//数组长度 int right = len-1;//数组最右边 int mid = (left+right)/2;//数组中间 Scanner input = new Scanner(System.in); System.out.print("输入您要找的值:"); int num = input.nextInt(); for(int i=0;i<len;i++) { array[i]=i*i-34;//y=x*x-34的值输入数组 } for(int n:array) { System.out.print(n+" ");//数组的值输出 } while(left<=right) { if(array[mid]==num) { System.out.println("已找到"+num); break; }else if(array[mid]>num){ right = mid-1; mid = (left+right)/2; }else { left = mid+1; mid = (left+right)/2; } } if(left>right) { System.out.println("未找到"+num); } } }
求最值
冒泡排序(升序)
相邻两数比较,小的在前,大的在后,不符合时,交换,直到不需要交换为止//冒泡排序实现 import java.util.Scanner; public class Test01 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入10个数:"); int[] nums = new int[10]; int len = nums.length;//数组长度 int frequency = len-1;//比较趟数 for (int i = 0; i < len; i++) {//向数组输入数据 nums[i] = input.nextInt(); } //升序 for(int i=0;i<frequency;i++) {//范围:[0,len-2]及比较1~len-1趟 boolean flag = false;//true:交换过、false:没有交换过 for(int j=0;j<frequency-i;j++) {//范围:[0,(len-2)-i]及比较1~len-1-i次 if(nums[j]>nums[j+1]) { int temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; flag = true; } } System.out.println("执行趟数:"+(i+1)); if(!flag) {//若某一趟没有交换过数据,就是有序的,退出 break; } } for (int i : nums) {//输出排序结果 System.out.print(i+" "); } System.out.println("--------------------------"); //降序 for(int i=0;i<frequency;i++) { boolean flag = false;//true:交换过数据、false:为交换过 for(int j=0;j<frequency-i;j++) { if(nums[j]<nums[j+1]) { int count = nums[j]; nums[j] = nums[j+1]; nums[j+1] = count; flag = true; } } System.out.println("执行趟数:"+(i+1)); if(!flag) { break; } } for (int i : nums) {//输出排序结果 System.out.print(i+" "); } } }
插入
选择排序
插入排序
java提供的现成方法
Arrays.sort(nums);//升序
2 二维数组
2.1二维数组的创建
//方法一:为每一维分配空间
int[][] num1 = new int[5][5];
for(int i=0;i<nums.length;i++) {
for(int j=0;j<nums[i].length;j++) {
nums[i][j] = input.nextInt();
}
}
//方法二:直接赋值
//先定义每一维的数组,然后创建二位数组
int[] nums1 = new int[5];
int[] nums2 = new int[5];
int[] nums3 = {0,0,1,1,1};
int[] nums4 = {4,5,6,7,8};
int[] nums5 = {4,5,6,7,8};
int[][] num2 = {nums1,nums2,nums3,nums4};
//NullPointerExecption空指针异常
int[][] num = new int[4][];
//Arrays的常用方法
int[] nums6 = {0,1,2};
int[] nums7 = {3,4,5};
int[] nums8 = {6,7,8};
int[][] num3 = {nums6,nums7,nums8};
//toString()
System.out.println(Arrays.toString(nums6));//[0, 1, 2]
System.out.println(num3);//[[I@15db9742
System.out.println(Arrays.toString(num3));//[[I@6d06d69c, [I@7852e922, [I@4e25154f]
//deepToString()
System.out.println(Arrays.deepToString(nums));//[[0, 1, 2], [3, 4, 5], [6, 7, 8]]