java day6 java数组2与面向对象1

数组

1.数组的Arrays类

//数组的工具类java.util.Arrays

API提供了一个Arrays供我们使用,对数据对象进行一种基本的操作

具有以下常用功能:

  1. 给数组赋值:fill方法
  2. 对数组排序:sort方法升序
  3. 比较数组:equals方法比较数组中元素是否相等
  4. 查找数组元素:binarySearch对排序好的数组进行二分查找

代码示例:

        int[] a = {6,4,8,2,9,45,21};
        int[] b = {50, 50, 50, 50, 50, 50, 50};
        System.out.println(Arrays.toString(a));//打印数组元素
        Arrays.sort(a);//排序升序
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.binarySearch(a,8));//查找
        Arrays.fill(a,50);//全部赋值
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.equals(a,b));//判断数组是否完全相等

除此之外,打开JDK帮助文档,搜索Arrays可以看到更多方法

点击跳转到JDK帮助文档
在这里插入图片描述

在这里插入图片描述

排序:总共有八大排序

1、冒泡排序

外层冒泡轮数,内层一次比较

时间复杂度为O(n*n)

代码:

    public static void main(String[] args) {
        int[] a = {4,2,1,87,54,90,65,43,23,44,65,78,54};
        System.out.println(a.length);
        sort(a);
        System.out.println(Arrays.toString(a));
    }
    //冒泡排序
    //1、比较数组中两个相邻的元素,如果第一个数大于第二个数,则交换两数
    //2、每一次比较都会产生一个最大或最小的数
    //3、下一轮则可以减少一次排序
    //4、依次循环,直到结束
    public static void sort(int[] a){
        int t = 0;
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = 0; j < a.length - 1 - i; j++) {
                if(a[j]>a[j+1]){
                    t = a[j+1];
                    a[j+1] = a[j];
                    a[j] = t;
                }
            }
        }

    }

输出结果:

13
[1, 2, 4, 23, 43, 44, 54, 54, 65, 65, 78, 87, 90]

思考:如何优化?

2、稀疏数组

1、需求

编写五子棋游戏中,有存盘退出和续上盘的功能

分析:该二维数组很多默认值是0,记录了很多没有意义的数据

解决:稀疏数组

稀疏数组介绍:

1、一个数组中大部分元素为0,或者为同一值的数组,可以使用稀疏数组来保存该数组

2、处理方式:记录数组几行几列,多少个不同值

3、把具有不同的元素和行列及值记录在一个小规模数组中,从而缩小程序的规模

代码实现:

//稀疏数组
public class ArrayDemo08 {
    public static void main(String[] args) {
        //创建一个二维数组11*11 0:无棋子  1:黑棋  2:白棋
        int[][] a = new int[11][11];
        a[1][2] = 1;
        a[2][3] = 2;
        //输出原始数组
        System.out.println("输出原始数组");
        for (int i = 0; i < a.length; i++) {
            for (int i1 = 0; i1 < a.length; i1++) {
                System.out.print(a[i][i1]+"\t");
            }
            System.out.println();
        }
        //转化为稀疏数组
        //获取有效值的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if(a[i][j]!=0){
                    sum++;
                }

            }
        }
        System.out.println("有效值的个数"+sum);
        //创建一个稀疏数组的数组
        int[][] b = new int[sum+1][3];
        b[0][0] = 11;
        b[0][1] = 11;
        b[0][2] = sum;
        //遍历二维数组,将非零的值存放到稀疏数组中
        int m = 1;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if(a[i][j]!=0){
                    b[m][0] = i;
                    b[m][1] = j;
                    b[m][2] = a[i][j];
                    m++;
                }

            }
        }
        for (int i = 0; i < b.length; i++) {
            for (int i1 = 0; i1 < b.length; i1++) {
                System.out.print(b[i][i1]+"\t");
            }
            System.out.println();
        }
        //还原稀疏数组
        int[][] c = new int[b[0][0]][b[0][1]];
        int n = 1;
        for (int i = 0; i < m-1; i++) {
            c[b[n][0]][b[n][1]] = b[n][2];
            n++;
        }
        for (int i = 0; i < c.length; i++) {
            for (int i1 = 0; i1 < c.length; i1++) {
                System.out.print(c[i][i1] + "\t");
            }
            System.out.println();
        }
    }
}

输出结果:

输出原始数组
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
有效值的个数2
11	11	2	
1	2	1	
2	3	2	
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0

分析:代码实现将原始数组转化为稀疏数组,稀疏数组第一列存储行,第二列存储列,第三列存储有效值

第一行是总的行列与有效值个数,其他是各个有效值所在的位置及有效值的值

面向对象编程(OOP)

1、初识面向对象

面向过程与面向对象

面向过程思想:

  1. 步骤清晰简单,第一步做什么,第二部做什么
  2. 面向过程适合处理一些较为简单的问题
  3. 面向对象思想:物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对分类进行独立思考。最后才对分类下的细节进行面向过程思考。面向对象适合处理复杂的问题,适合处理多人协作的问题
  4. 属性+方法=类
  5. 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统,但是,具体到微观操作,仍然需要面向过程的思路去处理
//方法在类里面,Demo01就是一个类,用class修饰
//一个真正的程序里面只有一个main方法
//return代表方法结束,返回一个结果,可能为空,也可能是其他类型

什么是面向对象:

  1. 面向对象编程(Object Oriented Programming)

  2. 本质:以类的方式组织代码,以对象的形式封装数据

  3. 抽象:

三大特性:
  1. 封装:将数据包起来,不暴露。留一个接口给外部访问

  2. 继承:子类得到父类的东西

  3. 多态:同一个事物有多重形态

2、方法回顾和加深

方法的定义

  1. 修饰符:public,static等等

  2. 返回类型

    break:跳出switch,结束循环

    return:代表方法结束

  3. 方法名:符合命名规范 见名知意

  4. 参数列表:参数类型,参数名,参数个数

  5. 异常抛出

    像之前的xception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 11 at com.wangchaohong.array.ArrayDemo01.main(ArrayDemo01.java:17)

    数组越界异常

  6. 方法的调用:递归,自己调用自己

  7. 非静态方法

    static与类一起加载的//修饰符有static的可以直接调用
    类实例化之后才存在

    先有对象后有类

            Demo03 demo03 = new Demo03();
            int sum = demo03.add(2,3);//非静态方法调用,new一个对象,2,3为实参
            System.out.println(sum);
        }
        public int add(int a, int b){//形参
    
            return a+b;
        }
    
    //静态方法,加static,非静态方法不加static
    public class Demo02 {
        public static void main(String[] args) {
            //实例化这个对象
            //对象类型 对象名
            Student student = new Student();
            student.say();                  
        }
        //static与类一起加载的
        //类实例化之后才存在
        //a与b不加static无法相互调用,当new了对象可以调用
        public void a(){
    
        }
        public void b(){
    
        }
    }
    

    我认为类进行实例化就是对象,相当于结构体与结构体变量

  8. 形参和实参

  9. 值传递和引用传递

    值传递:输出a的值没有发生改变

    package com.oop;
    //值传递
    public class Demo04 {
        public static void main(String[] args) {
            int a = 5;
            System.out.println(a);
        }
    
        public static void change(int a){
    
            a = 10;//没有返回值
        }
    }
    
    

    引用传递:

    //引用传递:对象,本质还是值传递
    public class Demo05 {//一个类里只能有一个public class
        public static void main(String[] args) {
               Person person = new Person();
            System.out.println(person.name);
            change(person);
            System.out.println(person.name);
        }
        public static void change(Person person){//传递对象改变了其值,传递的是地址
            person.name = "wangchaohong";//改变了其值,一个具体的人可以改变属性
        }
    
    }
    class Person {//定义一个person类,下面的一个属性
        String name;//null
    }
    //数组的工具类java.util.Arrays
    

    感觉值传递与引用就像是只传递值和传递了地址

  10. this关键字

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值