进击java-day06

day06

数组中的常见算法

1. 数组元素的赋值

比如:杨辉三角、回形数、随机生成彩票

2. 求数值型数组中元素的最大值、最小值、平均数、总和等

package com.atguigu.homework;

/**
 * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,和值,
 * 平均值,并输出出来。
 * 要求:所有随机数都是两位数。
 * <p>
 * 提示:如何获取指定范围的随机数[10,99]
 * (int)(Math.random() * 90 + 10)
 */
public class Exer02 {
    public static void main(String[] args) {
        //1. 创建数组,并按照要求给数组元素赋值
        int[] arr = new int[10];

        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 90) + 10;

        }
        System.out.print("获得的随机数为:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();

        //2. 计算数组中的特征值
        int sum = 0;
        int max = 0;
        int mix = 100;
        double ave;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];//计算总和
        }

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max)  //判断最大值
                max = arr[i];
        }

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < mix)  //判断最小值
                mix = arr[i];
        }

        ave = (double)sum / arr.length;

        System.out.println("最大值" + max);
        System.out.println("最小值" + mix);
        System.out.println("所有数的和" + sum);
        System.out.println("平均值" + ave);

    }
}

3.数组的复制、反转、查找(线性查找、二分法查找)

public class ArrayTest {
    public static void main(String[] args) {
        int[] array1 = new int[]{2, 3, 5, 7, 11, 13, 17, 19};
        //数组的复制
        int[] array2 = new int[array1.length];
        for (int i = 0; i < array1.length; i++) {
            array2[i] = array1[i];
        }

        //数组的反转
        //方式一:
//        for(int i = 0;i < array1.length / 2;i++){ // i   array1.length - 1 - i
//            int temp = array1[i];
//            array1[i] = array1[array1.length - 1 - i];
//            array1[array1.length - 1 - i] = temp;
//        }
        //方式二:
        for(int x = 0,y = array1.length - 1;x < y;x++,y--){
            int temp = array1[x];
            array1[x] = array1[y];
            array1[y] = temp;
        }

        //数组的遍历
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + " ");
        }

        //线性查找
        int[] array3 = new int[]{2, 3, 5, 7, -11, 13, 0, 17, 19,0};
        int value = 0;//查找的目标数据
        boolean flag = true;//定义一个是否找到了指定数据的标识
        for(int i = 10;i < array3.length;i++){
            if(value == array3[i]){
                System.out.println("在索引为" + i + "的位置上找到了指定的元素");
                flag = false;
                break;
            }
        }
        if(flag){
            System.out.println("未找到指定的元素");
        }

        //二分法查找:要求此数组必须是有序的。
        int[] arr3 = new int[]{-99,-54,-2,0,2,33,43,256,999};
        boolean isFlag = true;
        int number = 256;
        number = 25;
        int head = 0;//首索引位置
        int end = arr3.length - 1;//尾索引位置
        while(head <= end){
            int middle = (head + end) / 2;
            if(arr3[middle] == number){
                System.out.println("找到指定的元素,索引为:" + middle);
                isFlag = false;
                break;
            }else if(arr3[middle] > number){
                end = middle - 1;
            }else{//arr3[middle] < number
                head = middle + 1;
            }
        }

        if(isFlag){
            System.out.println("未找打指定的元素");
        }

    }
}

4.数组元素的排序算法

  • 十大排序算法
选择排序
	直接选择排序、堆排序
交换排序
	冒泡排序、快速排序
插入排序
	直接插入排序、折半插入排序、Shell排序
归并排序
桶式排序
基数排序

  • 冒泡排序
public class BubbleSortTest {
    public static void main(String[] args) {

        int[] arr = new int[]{34,76,-8,0,56,-45,6,21};

        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 temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }

        }

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");

        }
    }
}

Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。

package com.atguigu.java;

import java.util.Arrays;

public class ArraysTest {
    public static void main(String[] args) {

        int[] arr1 = new int[]{1,2,3,4,5};
        int[] arr2 = new int[]{1,2,3,4,5};
        // == : 比较两个数组的地址值是否相同。即:比较两个引用是否指向堆空间中的同一个数组
        System.out.println(arr1 == arr2);//false
        //equals():比较两个数组的内容是否相等。
        System.out.println(Arrays.equals(arr1,arr2));//true

        //toString():输出数组的元素信息
        System.out.println(Arrays.toString(arr1));

        //fill():将指定的值填充到数组中的所有位置上
        Arrays.fill(arr1,10);
        System.out.println(Arrays.toString(arr1));

        int[] arr3 = new int[]{34,76,-8,0,56,-45,6,21};
        System.out.println(Arrays.toString(arr3));
        //sort():排序
//        Arrays.sort(arr3);
        System.out.println(Arrays.toString(arr3));
        //binarySearch():对排序后的数组进行二分法检索指定的值。
        //如果找到了,返回找到的元素所对应索引位置。
        //如果没找到,返回负数。
        int index = Arrays.binarySearch(arr3, 76);
        if(index >= 0){
            System.out.println("找到了指定元素。位置为:" + index);
        }else{
            System.out.println("没找到指定元素");
        }
    }
}

数组中的常见异常

package com.atguigu.java;

/**
 *  数组中的常见异常:
 *  1. ArrayIndexOutOfBoundsException:数组角标越界异常
 *  2. NullPointerException:空指针异常
 */
public class ArrayExceptionTest {

    public static void main(String[] args) {
        //1. ArrayIndexOutOfBoundsException:数组角标越界异常
        int[] arr = new int[10];//角标范围:0,1,2,。。。,9
//        System.out.println(arr[10]);//报错

//        System.out.println(arr[-1]);//报错

        //2. NullPointerException:空指针异常
        //情况一:
        String[][] arr2 = new String[5][];
//        System.out.println(arr2[0][0]);

        //情况二:
        int[] arr3 = new int[10];
//        arr3 = null;
        System.out.println(arr3[0]);

        //情况三:通过对象调用内部的方法时,如果此对象是null,则空指针异常
        String[] arr4 = new String[10];
        System.out.println(arr4[0].toString());

    }
}

面向对象的理解

1. 面向过程 vs 面向对象

二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。

2. 类与对象的理解

面向对象中的两大核心概念
* 1. 类(class):对一类事物的描述,是抽象的、概念上的定义。
* 2. 对象(object\instance):由类派生(new)出的一个个的实体。

3. 学习的三条主线

面向对象编程的学习三条主线:
* 1. 类及类中的成员:属性、方法、构造器;内部类、代码块
* 2. 面向对象的三个特征:封装、继承、多态、(抽象)
* 3. 其它关键字的使用:this\super\import\package\static\final\abstract\interface\....

说明:

类的内部成员:
*   属性 = 成员变量 = field
*   方法 = 成员方法 = (成员)函数 = method

知识点5:类及对象的创建过程

* 1. 设计类,就是设计类的内部成员。。
*
* 2. 设计类、创建对象、调用功能的步骤:
* 第1步:创建类(实际上,就是创建类的成员:属性、方法)
* 第2步:创建类的对象 (或 创建类的实例、类的实例化)
* 第3步:通过"对象.属性"或"对象.方法"的方式,调用对象的内部结构
  • 代码说明
public class PhoneTest {  //测试类
    public static void main(String[] args) {
        //数据类型  变量名 = 变量值
        Scanner scan = new Scanner(System.in);
//        int number = scan.nextInt();

        //创建Phone类的对象
        Phone iphone = new Phone();

        //通过"对象.属性"或"对象.方法"的方式,调用对象的内部结构
        iphone.name = "苹果手机";
        iphone.price = 8999;

        System.out.println("name:" + iphone.name + ", price:" + iphone.price);

        iphone.call();
        iphone.sendMessage("有内鬼,停止交易!");
        String info = iphone.takePhoto();
        System.out.println(info);

        //##################
        Phone iphone1 = new Phone();
        iphone1.name = "华为P40 pro";
        iphone1.price = 4999;
        System.out.println("name:" + iphone1.name + ", price:" + iphone1.price);
        System.out.println("name:" + iphone.name + ", price:" + iphone.price);

        //##################
        Phone iphone2 = iphone;
        iphone2.price = 6999;

        System.out.println("name:" + iphone.name + ", price:" + iphone.price);

        //##############
        iphone.sendMessage("你好!很高兴认识你");
    }
}


class Phone{
    //1. 设计属性
    String name;//手机名称
    int price;//价格

    //2. 设计方法
    public void call(){
        System.out.println("手机可以拨打电话");
    }
    public void sendMessage(String message){
        System.out.println("发送信息:" + message);
    }

    public String takePhoto(){
        //System.out.println("拍照");
        return "拍照成功";
    }
}

内存解析:

如果创建了类的多个对象,则每个对象拥有一套类的属性。当我们修改其中一个对象的属性时,不影响其它对象
* 此属性的值。
*
*  如果将对象引用p1赋给新的变量p2,则p1和p2就共同指向了堆空间中唯一的一个对象实体。当我们通过其中一个引用
*  修改对象的属性的话,则会导致另外引用对同一个属性的值的调用。

成员变量vs局部变量

测试类中属性的定义
*
* 1. 回顾:变量的分类
* ① 按照数据类型来分: 基本数据类型(8种)  vs  引用数据类型(类、数组、接口)
*
* ② 按照类中声明的位置: 成员变量(或属性)   vs  局部变量
*   说明:成员变量:在类中直接定义的变量
*        局部变量:在方法内、构造器内、代码块内等定义的变量
*
* 2.  成员变量(或属性)   vs  局部变量
* 相同点:
*       1. 变量声明的格式相同:数据类型 变量名 = 变量值
*       2. 凡是变量,都需要先声明,后使用
*       3. 都有其作用域。超出作用域,不可调用
*
* 不同点:
*      1. 声明位置的不同。
*          > 成员变量:在类中直接定义的变量
*          > 局部变量:在方法内、构造器内、代码块内等定义的变量
*      2. 是否可以使用权限修饰符进行修饰。
*          > 权限修饰符有:private \ 缺省 \ protected \ public
*          > 成员变量可以使用权限修饰符进行修饰 ;
*            局部变量不可以使用权限修饰符进行修饰
*          > 暂时,我们在定义成员变量时,大家都使用缺省即可。(讲封装性时再说)
*      3. 是否有默认初始化值的情况
*          > 成员变量都有默认初始化值
*                  ① 如果成员变量是整型(byte\short\int\long),则默认值为:0
*                  ② 如果成员变量是浮点型(float \ double),则默认值为:0.0
*                  ③ 如果成员变量是boolean型,则默认值为:false
*                  ④ 如果成员变量是char型,则默认值为:0 或 '\u0000'
*                  ⑤ 如果成员变量是引用数据类型,则默认值为:null
*
*          > 局部变量都没有默认初始化值。则意味着在调用局部变量之前,一定要显式的赋值。
*
*      4. 在内存中存储的位置不同
*          >成员变量存储在堆空间中
*          >局部变量存储在栈空间中
*
* @author shkstart
* @create 2020-06-30 16:19
*/
  • 代码演示
public class PersonTest {
    public static void main(String[] args) {
        Person p1 = new Person();

        System.out.println(p1.name +"," + p1.age + "," + p1.gender);

        p1.sleep();
        p1.eat("湖南臭豆腐");

        Person p2 = new Person();
        System.out.println(p2.age);
    }
}

class Person{
    //声明成员变量(属性)
    String name;
    int age = 1;
    boolean gender;//性别

    public void sleep(){
        int hour = 6; //局部变量
        System.out.println("人每天应该至少保证" + hour + "小时的睡眠");
    }

    public void eat(String food){//food:局部变量
        System.out.println("我喜欢吃:" + food);
    }

}


class Person{
    //声明成员变量(属性)
    String name;
    int age = 1;
    boolean gender;//性别

    public void sleep(){
        int hour = 6; //局部变量
        System.out.println("人每天应该至少保证" + hour + "小时的睡眠");
    }

    public void eat(String food){//food:局部变量
        System.out.println("我喜欢吃:" + food);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值