day09
1、数组的概述
数组:是引用数据类型(类,数组,接口)
数组是底层的护具结构,几乎任何语言都有。
数组中的元素的数据类型必须一致
2、数组的应用场景
数组数组用来存储多个数据结构,比如单个成绩可以用单个变量来存储,多个就可以使用数组。
3、数组的特性
可以看作一个多种相同数据类型的一个容器,进行统一管理。
数组占用两块数据空间,栈内存保存地址,堆内存保存数据。
可以保存任意数据的元素,但同一个之内的类型必须相同。
长度不能直接更改,意味着数组一旦确定,不能添加和删除。除非新建一个数组,将内容复制进去,复制途中可以进行增加删除。
数组有一个length属性,保存数组的长度。
每个元素独有一个独一无二的下标,查找元素时只需要使用下标即可。
4、数组的声明
1、静态声明:在知道数组中每个元素的值的时候使用静态声明
数据类型 变量 [ ] = {};
int is [ ]={1,2,3}; 一维数组
int is [ ] [ ] ={{1},{1,2,3},{1,2}};
2、动态声明:在预先不知道元素的值的时候使用,需要指定电影长度。并使用默认值占位。
数据类型 变量 [ ] =new 数据类型 [ 长度 ];
int is [ ] = new int [10];
3、第三种声明方式
数据类型 变量 [ ] =new 数据类型 [ 长度 ]{数值};
5、基本操作
1、获取数据(查)
输出数组的长度:System.out.println(is.length);
输出指定元素:System.out.println(is.[下标值]);
输出尾元素:System.out.println(is.[length-1]);
2、设置数据(改)
is [1]=1; 把下标为1的第二位改为1.
3、遍历
for(int i = 1;i<is.length;i++){
System.out.println(is[ i ]);
}
6、常见异常
1、下标越界异常
比如一共就三个元素,你来个5.就是下标越界异常。
2、空指针异常
使用的null值。找不到地址所以会发现空指针异常。
注意:null和0是两个概念。
7、数组传递
传值和传引用的差别:
传值:基本类型传递,传出去之后不论怎么改变都不会影响
引用:引用类型传递,传出去的是地址,会受到改变的影响。
8、数组的复制
模拟插入式复制
-
插入式复制,肯定需要更改长度大小,所以只能新建数组
-
所以 需要把新数组返回
-
1 新数组长度
-
2 复制逻辑
-
目标数组 起始位置和之前的数据 先复制到新数组中
-
把源数组起始位置开始 复制length个,到新数组中
-
目标数组 起始位置之后的数据 复制到新数组中
-
3 返回新数组
9、接收命令行输入
public class Array_12 {
public static void main(String[] args){
//接收用户输入
Scanner a = new Scanner(System.in);
//程序执行到这里,就会进入等待状态等待用户输入数据
//并把输入的数据返回给b,多个数据以空格隔开
int b = a.nextInt();
System.out.println(b);
}
}
10、模拟计算器案例
public class Array_13 {
public static void main(String[] args){
Scanner s = new Scanner(System.in);
double a =s.nextDouble();
String b = s.next();
double c = s.nextDouble();
sum1(a,b,c);
}
public static void sum1(double n1,String n2,double n3){
double sum;
switch(n2){
case "+":
sum=n1+n3;
System.out.println(sum);
break;
case "-":
sum=n1-n3;
System.out.println(sum);
break;
case "*":
sum=n1*n3;
System.out.println(sum);
break;
case "/":
sum=n1/n3;
System.out.println(sum);
break;
}
}
}
11、交换变量的值
1、 中间变量(开发常用)
int x = 10; int y = 20; int temp = x; x = y; y = temp;
2 位移运算(面试常用) 转换为对应的二进制,然后每位进行异或 , 相同为0 不同为1 x = 2; y = 3; x = x ^ y; y = x ^ y; x = x ^ y; System.out.println(x+" : "+y);
3、加减运算 x = 10; y = 20; x = x + y; y = x - y; x = x - y; System.out.println(x+" : "+y);
12、冒泡排序
1 比较相邻的两个元素,如果第一个比第二个大,就交换位置
2 对每一对相邻的元素做 相同的比较工作,这样比较完一轮之后,最后一个元素一定是最大的
3 再重复执行上面的步骤,除了最后一个元素(比较次数依次递减)
4 一直到没有任何一对元素,终止
public class Array_15 {
public static void main(String[] args) {
int[] arr = {1,5,4,2,3};
bubbleSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void bubbleSort(int[] arr){
int count = 0;
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i ; j++) {
count++;
if (arr[j] < arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("执行了 : "+count);
}
}
13、选择排序
每次都把当中最小的放到左边
先拿出第一个,假设是最小的,然后挨个和后面所有比较,全部比较完之后,就找到了最小的元素,放到前面
public static void main(String[] args) {
int[] arr = {1,5,4,2,3};
selectSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void selectSort(int[] arr){
for (int i = 0; i < arr.length; i++) {
int min = i;
for (int j = i+1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
if (min != i) {
int temp = arr[min];
arr[min] = arr[i];
arr[i]=temp;
}
}
}