JavaSE Day06
变量作用域
for循环和while循环的是先判断后执行的;所以如果局部变量没有初始值,而是在for循环或while中赋初值;那么无法在for循环或while循环外使用该变量;因为java认为不生效;
数组
容器,只能存储相同数据类型的一组数据;
可以存储 基本数据类型 和 引用数据类型;
栈
- 存储基本数据类型 和 引用名称。
- 空间小;
- 频繁创建和销毁的一种数据结构;(后进先出的数据结构)
- 栈帧 相当于方法名
堆
- 存储 对象的;
- 空间大;
- 不会频繁创建和销毁;
数组的存储方式:
- 声明数组的变量名
就是在栈内存中;开辟一个空间,命名为变量名arr; - 初始化时
就是在堆内存中,通过关键字 new,来开辟一个连续的内存空间,将这个空间的地址,赋值给栈内存中的arr;
数据的初始值
- 整数:0
- 浮点:0.0
- 布尔:false
- char:‘\u0000’
- String:null
package day6;
public class Demo2 {
public static void main(String[] args) {
// int n = 11;
// n = 22;
// System.out.println(n);// 声明数组
int[] arr;
// int[] a,b,c;
int a[], b, c;
// 初始化,数组是长度固定的;
// 动态初始化: 我们制定长度,系统分配初始值;
arr = new int[3];// 3表示数组的长度,
/*
* 初始值
* 整数: 0
* 浮点: 0.0
* 布尔: false
* char: ‘\u0000’
* String null
*/
System.out.println(arr[2]);
}
}
```
# 数组的使用
1. 初始化:动态、静态
2. 控制台输入赋值
3. 循环遍历输出
```java
package day6;
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 动态初始化
int[] arr = new int[3];
System.out.println("--输入三个数");
for (int i = 0; i < arr.length; i++) {
arr[i] = input.nextInt();
}
// arr[0] = 11;
// arr[1] = 22;
// arr[2] = 33;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println(arr);// 数组的地址;在堆内存中的地址;
}
}
```
```java
package day6;
public class Demo4 {
public static void main(String[] args) {
// 静态初始化;我们制定初始值,系统指定长度;
int[] arr = {11, 456, 7, 23}; // 只能是一行代码
System.out.println(arr.length);
int[] arr1 = new int[]{35, 64, 645};//可以分成两行的;但不能制定长度;
// 循环遍历输出
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
```
# 增强for
场合: 集合和数组
```java
for(数据类型 变量名:数组名){
}
package day6;
public class Demo5 {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
for (int i = 0; i < arr.length; i++) {
arr[i] += 2;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//增强for
// 场合:集合 和 数组
for (int a:arr) {
System.out.println(a);
};
for (int i = arr.length -1; i > 0 ; i--) {
System.out.println(arr[i]);
}
}
}
区别:
- 增强for只能顺序遍历;
- 增强for只能遍历所有元素,不能遍历区间
- 增强for不能改变元素的值;
常用的算法
最大数:
首先定义一个max,让max = arr[0],让max与数组中的每个元素比较;max小;则等于数组中的该数;
package day6;
public class Demo6 {
public static void main(String[] args) {
int[] arr = {453, 12, 7, 89, 3};
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
/*
if (max < arr[2]) {
max = arr[2];
}
if (max < arr[3]) {
max = arr[3];
}
if (max < arr[4]) {
max = arr[4];
}
if (max < arr[5]) {
max = arr[5];
}*/
System.out.println(max);
}
}
排序:
冒泡排序:
- 相邻两个数比较大小;
- 外循环控制轮数,内循环控制比较次数
- 外循环是(数组长度-1)轮,内循环比较(数组长度-1-轮数)次数;
package day6;
/*冒泡排序*/
public class Demo8 {
public static void main(String[] args) {
int[] arr = new int[]{32,53,67,12,4,23,5,64};
// 升序
for (int i = 0; i <arr.length-1; i++) {//轮数
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j] > arr[j+1]){ // 降序就是将>,该成<即可;
int tmp = 0;
tmp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
}
for (int a:arr) {
System.out.println(a);
}
}
}
选择:
- 从第一个位置开始,某个位置和后边的所有元素 比较。
- 外循环控制位置;内循环控制位置后的所有元素
- 最后一个位置,不需要参与比较;从外循环剥离;
package day6;
import java.util.Scanner;
/*选择排序*/
public class Demo9 {
public static void main(String[] args) {
int[] arr = new int[]{32, 54, 65, 12, 34, 1};
// 升序
for (int i = 0; i < arr.length - 1; i++) {// 位置
for (int j = i + 1; j < arr.length; j++) {// 位置后的所有元素
if (arr[i] > arr[j]) {//将> 该为< ,则就是降序;
int tmp = 0;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
for (int a : arr
) {
System.out.println(a);
}
boolean flag = true;
Scanner input = new Scanner(System.in);
System.out.println("--输入一个数字:");
int num = input.nextInt();
int start = 0;
int end = arr.length;
while (flag) {
int middle = (start + end) / 2;
if (arr[middle] == num){
flag = false;
System.out.println("存在");
break;
}else if (arr[middle] < num) {
start = middle + 1;
} else if (arr[middle] > num) {
end = middle - 1;
} else if (start > end) {
System.out.println("不存在");
flag = false;
}
}
}
}
插入:
- 某个位置 和前边的所有元素比较;
- 位置元素小于前边某个元素,那么就把此位置的元素 插入 到前边元素的位置;
package day6;
/* 插入排序*/
public class Demo10 {
public static void main(String[] args) {
int[] arr = new int[]{54,6,12,43,78,54,32};
for (int i = 1; i < arr.length ; i++) {// 位置
for (int j = 0; j < i; j++) {// 前边的元素
if (arr[i] < arr[j]){
int tmp = arr[i];//把此位置的元素保存起来
for (int k = i; k > j; k--) {
// 前边元素向后覆盖
arr[k] = arr[k-1];
}
// 把保存的位置元素覆盖到前边的元素
arr[j] = tmp;
}
}
}
for (int a:arr
) {
System.out.println(a);
}
}
}
二分查找法;
频繁的查看,首先排序,然后使用二分查找
package day6;
import java.util.Scanner;
/*二分查找*/
public class Demo12 {
public static void main(String[] args) {
int[] arr = new int[]{1, 5, 3, 9, 7};
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[i]) {
int tmp = arr[i];
for (int k = i; k > j; k--) {
arr[k] = arr[k - 1];
}
arr[j] = tmp;
}
}
}
for (int a : arr
) {
System.out.println(a);
}
Scanner input = new Scanner(System.in);
System.out.println("输入一个数字:");
int num = input.nextInt();
int start = 0;
int end = arr.length - 1;
int middle = (start + end) / 2;
while (arr[middle] != num) {
if (arr[middle] > num) {
end = middle - 1;
} else if (arr[middle] < num) {
start = middle + 1;
}
if (start > end) {
System.out.println("不存在");
middle = -1;
break;
}
middle = (start + end) / 2;
}
System.out.println(middle);
}
}
数组复制
- System.arraycopy
Src 源数组
srcPos 源数组开始复制的位置
Dest 目标数组
destPos 目标数组开始复制的位置
Length 复制长度 - Clone();克隆
- for 循环直接复制
- 浅拷贝
package day6;
import java.lang.Object;
/*数组复制*/
public class Demo13 {
public static void main(String[] args) {
int[] arr = new int[]{1,56,2,45,3};
// 方法 1
/*int[] arr1 = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
arr1[i] = arr[i];
}*/
// 方法2 :
/*int[] arr1 = new int[arr.length];
// 源数组 源数组起始位置,目标数组,目标数组起始位置,长度
System.arraycopy(arr,0,arr1,0,5);
*/
// 方法3
// int[] arr1 = arr; // 没有开辟堆内存
// 方法4:
int[] arr1 = arr.clone(); // 开辟了堆内存;
for (int a:arr1
) {
System.out.println(a);
}
}
}
对数组的:增、删、改、查询;
package day6;
import java.util.Scanner;
/*图书管理系统*/
public class BookManager {
public static void main(String[] args) {
// 存储图书信息
int[] no = new int[100];
String[] name = new String[100];
double[] price = new double[100];
// 先存储一本书
no[0] = 11;
name[0] = "计算机基础";
price[0] = 55.5;
//
Scanner input = new Scanner(System.in);
int menuNo;
System.out.println("--------菜单---------------");
System.out.println("1.添加;");
System.out.println("2.修改");
System.out.println("3.删除");
System.out.println("4.查询");
System.out.println("5.退出");
System.out.println("-------------------");
int bno;//将变量放在循环的外面,避免频繁的变量销毁;影响系统性能;
String bname;
double bprice;
do {
System.out.println("--请输入选择菜单编号:");
menuNo = input.nextInt();
switch (menuNo) {
case 1:
// 添加
System.out.println("请输入图书编号:");
bno = input.nextInt();
System.out.println("输入图书名称:");
bname = input.next();
System.out.println("请输入图书价格:");
bprice = input.nextDouble();
for (int i = 0; i < no.length; i++) {
if (no[i] == 0) {//向第一个为0的位置添加数据
// 添加数据
no[i] = bno;
name[i] = bname;
price[i] = bprice;
System.out.println("添加成功");
break;// 添加完成后,不需要循环了;否则就添加错误了
}
}
break;
case 2:
// 修改
System.out.println("请输入要修改图书的编号:");
bno = input.nextInt();
for (int i = 0; i < no.length; i++) {
if (no[i] == bno) {
System.out.println("请输入新图书的名称:");
name[i] = input.next();
System.out.println("--输入新图书的价格:");
price[i] = input.nextDouble();
System.out.println("修改成功");
break;// 修改完毕后,不需要继续循环了
}
}
break;
case 3:
// 删除
System.out.println("--输入要删除图书的编号:");
bno = input.nextInt();
for (int i = 0; i < no.length; i++) {
if (no[i] == bno) {
int j = i;
for (; j < no.length - 1; j++) {
if (no[i] == 0) {
break;
}
no[j] = no[j + 1];
name[j] = name[j + 1];
price[j] = price[j + 1];
}
if (no[no.length - 1] != 0) {
no[no.length - 1] = 0;
name[no.length - 1] = null;
price[no.length - 1] = 0.0;
}
System.out.println("删除完成");
break;
}
}
break;
case 4:
// 查询
System.out.println("编号\t名称\t\t\t单价\t");
for (int i = 0; i < no.length; i++) {
if (no[i] == 0) {//不显示空数据;
break;
}
System.out.println(no[i] + "\t" + name[i] + "\t\t" + price[i]);
}
break;
case 5:
System.exit(0);
}
} while (true);
}
}


浙公网安备 33010602011771号