Fork me on GitHub

JavaSE Day06


变量作用域

for循环和while循环的是先判断后执行的;所以如果局部变量没有初始值,而是在for循环或while中赋初值;那么无法在for循环或while循环外使用该变量;因为java认为不生效;

数组

容器,只能存储相同数据类型的一组数据;
可以存储 基本数据类型 和 引用数据类型;

  1. 存储基本数据类型 和 引用名称。
  2. 空间小;
  3. 频繁创建和销毁的一种数据结构;(后进先出的数据结构)
  4. 栈帧 相当于方法名

  1. 存储 对象的;
  2. 空间大;
  3. 不会频繁创建和销毁;

数组的存储方式:

  1. 声明数组的变量名
    就是在栈内存中;开辟一个空间,命名为变量名arr;
  2. 初始化时
    就是在堆内存中,通过关键字 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]);
        }
    }
}

区别:

  1. 增强for只能顺序遍历;
  2. 增强for只能遍历所有元素,不能遍历区间
  3. 增强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. 相邻两个数比较大小;
  2. 外循环控制轮数,内循环控制比较次数
  3. 外循环是(数组长度-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);
        }
    }
}

选择:

  1. 从第一个位置开始,某个位置和后边的所有元素 比较。
  2. 外循环控制位置;内循环控制位置后的所有元素
  3. 最后一个位置,不需要参与比较;从外循环剥离;
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;
            }
        }
    }
}

插入:

  1. 某个位置 和前边的所有元素比较;
  2. 位置元素小于前边某个元素,那么就把此位置的元素 插入 到前边元素的位置;
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);

    }
}

数组复制

  1. System.arraycopy
    Src 源数组
    srcPos 源数组开始复制的位置
    Dest 目标数组
    destPos 目标数组开始复制的位置
    Length 复制长度
  2. Clone();克隆
  3. for 循环直接复制
  4. 浅拷贝
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);

    }
}

posted @ 2018-10-03 00:49  耳_东  阅读(121)  评论(0)    收藏  举报