JAVASE 数组相关知识

递归

  • A方法调用B方法,我们很容易理解

  • 递归就是:A方法调用A方法,即自己调用自己

  • 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

  • 递归结构包括两个部分:

    递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。

    ◆递归体:什么时候需要调用自身方法。

    示例(计算阶乘):

package Method; 
//递归 
public class Demo02 {    
public static void main(String[] args) {
    int result = f(20);
//需要注意的是,递归算法一定要注意空间问题以及越界问题,比如此处已经结果不规范        System.out.println(result);//结果为:-2102132736
   }   
 //计算阶乘
    public static int  f(int n){ 
       if (n==1){ 
           return 1;     
  }else {   
         return n*f(n-1); 
      }  
 } 
}​

数组定义

数组是相同类型数据的有序集合

数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成

其中每一个数据称作数组的一个元素,每个数组元素可以通过一个下标来进行访问

数组的声明创建

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

  
    dataType[] arrayRefVar;//首选的方法
    或者
    dataType arrayRefVar[];//效果相同

java语言使用new操作符来创建数组,语法如下:

  
    dataType[] arrayRefVar = new dataType[ arraySize];

数组的元素是通过索引访问的,数组索引从0开始。

获取数组的长度:array.length

数组基础的内存分析

java中的基本内存:堆、栈、方法区

堆:

存放new的对象和数组,可以被所有的线程共享,不会存放别的对象引用

栈:

存放基本变量类型(会包含这个基本类型的具体数值),引用对象的变量(会存放这个引用在堆里面的具体地址)

方法区:

可以被所有的线程共享,包含了所有的class和static变量

数组下标越界错误:

ArrayIndexOutOfBoundsException

数组的三种初始化

1、静态初始化 int[] a={1,2,3}; Man[] mans = {new Man(1,1),new Man(2,2)};

2、动态初始化 int[] a = new int[2]; a[0]=1; a[1]=2; 3、数组的默认初始化 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化,

 package Method;
  ​
    public class Demo03Array {
        //变量的类型 变量的名字 = 变量的值
        //数组类型   数组名  =  数组内容
        //int nums1[];也可以定义,不推荐
        public static void main(String[] args) {
            int[] nums = new int[10];//声明并创建数组
            System.out.println(nums.length);//数组长度
        int j=1;
            for (int i = 0; i <=nums.length; i++) {
                nums[i]=j;
                        j++;
                System.out.println("nums["+i+"]:"+nums[i]);
                System.out.println(nums[11]);
            }
        }
    }

数组的基本特点

  • 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

  • 其元素必须是相同类型,不允许出现混合类型。

  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型.

  • 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量.

    数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型数组对象本身是在堆中的。

数组边界

  • 下标的合法区间:[0,length-1],如果越界就会报错;

  public static void main(String[] args){
      int[] a=new int[2];
      System.out.println(a[2]);
  }
  • ArraylndexOutOfBoundsException:数组下标越界异常!

  • 数组是相同数据类型(数据类型可以为任意类型)的有序集合数组也是对象。数组元素相当于对象的成员变量数组长度的确定的,不可变的。如果越界,则报:ArrayIndexOutofBounds.

数组使用

For-Each循环

数组作为方法参数

数组作为返回值

 package Method;
  ​
  public class Demo04Array {
      public static void main(String[] args) {
          int[] a = {1,2,3,4,5};
          //利用增强for循环遍历
          for (int i : a) {
              System.out.println(i);
          }
      }
      
       printArray(a);//打印数组
       int[] a1=reverse(a);
          printArray(a1);
  }
  //利用方法遍历数组
  public static void  printArray(int[] array){
          for (int i = 0; i <array.length ; i++) {
              System.out.print(array[i]+" ");
  ​
          }
      }
  ​
  //反转数组1
      public static void  printArrayReturn(int[] array){
          for (int i = array.length-1; i >=0; i--) {
              System.out.print(array[i]+" ");
  ​
          }
      }
  //反转数组2,调用之后返回一个数组,在定义一个新的数组接收该数组,遍历新数组即可
  public static int[]  reverse(int[] array){
          int[] result =new int[array.length];
          for (int j = result.length-1,i=0; i <array.length; j--,i++) {
              result[i]=array[j];
  //            System.out.println(result[j]);
          }
          return result;
      }

多维数组

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。


  int a[][]= new int[2][5];
  //以上二维数组a可以看成一个两行五列的数组
  
  package Method;
  //二维数组相关
  public class Demo05Array {
      public static void main(String[] args) {
          int a[][]={{1,2},{3,4},{5,6},{7}};
  //        System.out.println(a[1][1]);
  //        printArray(a[1]);
          for (int i = 0; i < a.length; i++) {
              for (int j = 0; j < a[i].length; j++) {
                  System.out.println(a[i][j]);
              }
              
          }
      }
      //打印数组
      public static void  printArray(int[] array){
          for (int i = 0; i <array.length ; i++) {
              System.out.print(array[i]+" ");
  ​
          }
      }
      //嵌套循环遍历数组
  ​
  }

Array类

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

  • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。

  • 查看JDK帮助文档

  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用“使用对象来调用(注意:是"不用"而不是"不能")

  • 具有以下常用功能:

    • ◆给数组赋值:通过 fi 方法。

    • 对数组排序:通过 sort 方法,按升序

    • 比较数组:通过 equals 方法比较数组中元素值是否相等。

    • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作

冒泡排序

冒泡排序相对来说是比较著名且重要的排序,共有八大排序!

冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。

我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(n2)。

 package Method;
  //冒泡排序
  ​
  import java.util.Arrays;
  ​
  public class Demo07 {
      public static void main(String[] args) {
          int[] a={1,4,3,54,234,12};
          int[] b=sort1(a);
  //        System.out.println(b);
          printArray(b);
          System.out.println(Arrays.toString(sort1(a)));
      }
  ​
      //冒泡排序,比较两个相邻元素的大小,较大或者较小的元素前移或者后移
      public static int[] sort1(int[] array){
          //定义一个标志位,减少没必要的比较
          boolean flag = false;
          //定义一个临时变量
          int temp =0;
          //外层循环,判断需要循环多少次
          for (int i = 0; i < array.length - 1; i++) {
              for (int j = 0; j < array.length-1-i; j++) {
                  //内层循环,比较两个数字的大小,如果后一个数字比前一个数字大,则交换位置
                  if (array[j+1]>array[j]){
                      temp= array[j+1];
                      array[j+1]= array[j];
                      array[j]= temp;
                      flag = true;
                  }
              }
              if (flag= false){
                  break;
              }
          }
          return array;
  ​
      }
      //打印数组
      public static void  printArray(int[] array){
          for (int i = 0; i <array.length ; i++) {
              System.out.print(array[i]+" ");
  ​
          }
      }
  }

稀疏数组

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

  • 稀疏数组的处理方式是:

    • 记录数组一共有几行几列有多少个不同值

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

  
  package Method;
  //稀疏数组
  //五子棋游戏
  public class Demo08Array {
      public static void main(String[] args) {
        //1.创建一个二维数组 11*11    0:没有棋子  1:黑棋    2:白棋
        int[][] array1=new int[11][11];
        array1[1][0] = 1;
        array1[2][4] = 2;
        //输出原始数组
          System.out.println("输出原始数组:");
          for (int[] ints : array1){
              for (int anInt : ints){
                  System.out.print(anInt+"\t");
              }
              System.out.println();
          }
          //转换为稀疏数组保存
          //获取有效值的个数
          int sum = 0;
          for (int i = 0; i < 11; i++) {
              for (int j = 0; j < 11; j++) {
                  if (array1[i][j]!=0){
                      sum++;
                  }
              }
          }
          System.out.println("有效值的个数:"+sum);
  ​
          //2.创建一个稀疏数组
          int[][] array2=new int[sum+1][3];
          array2[0][0]=11;
          array2[0][1]=11;
          array2[0][2]=sum;
          //遍历二维数组,将有效值存放到稀疏数组中
          int count = 0;
          for (int i = 0; i < array1.length; i++) {
              for (int j = 0; j < array1[i].length; j++) {
                  if (array1[i][j]!=0){
                      count++;
                      array2[count][0]=i;
                      array2[count][1]=j;
                      array2[count][2]=array1[i][j];
                  }
              }
          }
          for (int i = 0; i <array2.length; i++) {
              System.out.println(array2[i][0]+"\t"+
                                  array2[i][1]+"\t"+
                                  array2[i][2]+"\t");
          }
          System.out.println("还原原来数组:");
          //1.读取稀疏数组
          int[][] array3 = new int[array2[0][0]][array2[0][1]];
          //2.给其中的元素还原他的值
          //i是从1开始的
          for (int i = 1; i < array2.length; i++) {
              array3[array2[i][0]][array2[i][1]] = array2[i][2];
          }
          //3.打印
          System.out.println("输出原数组:");
          for (int[] ints : array3){
              for (int anInt : ints){
                  System.out.print(anInt+"\t");
              }
              System.out.println();
          }
  ​
      }
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/583327.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux开发 第十二篇】搭建JavaEE环境

搭建开发环境 搭建javaEE环境 搭建javaEE环境 在Linux下开发JavaEE需要安装软件包&#xff1a; 安装jdk 安装步骤&#xff1a; 在opt目录下创建jdk目录通过xftp上床到jdk目录中进入到jdk目录中&#xff0c;解压jdk压缩包在/usr/local下创建java目录将解压完成的jdk文件移动…

SpringBoot框架学习笔记(一):依赖管理和自动配置

本文为个人笔记&#xff0c;仅供学习参考之用&#xff0c;如有不当之处请指出。 本文基于springboot2.5.3版本&#xff0c;开发环境需要是 jdk 8 或以上&#xff0c;maven 在 3.5 1 SpringBoot 基本介绍 1.1 官方文档 &#xff08;1&#xff09; 官网 : https://spring.io/pr…

张朝阳对话华为Fellow陈海波:万物智联时代,鸿蒙如何实现“换道超车”?

随着智能终端设备的普及和万物智联时代的加速到来&#xff0c;鸿蒙生态的高速发展正引发全行业的关注。 搜狐创始人、董事局主席兼CEO、物理学博士张朝阳与华为Fellow、基础软件首席科学家陈海波带来了一场关于鸿蒙生态的公开课。鸿蒙技术架构有哪些领先性?HarmonyOS发布5年来…

compose调用系统分享功能分享图片文件

compose调用系统分享功能图片文件 简介UI界面提供给外部程序的文件访问权限创建FileProvider设置共享文件夹 通用分享工具虚拟机验证结果参考 本系列用于新人安卓基础入门学习笔记&#xff0c;有任何不同的见解欢迎留言 运行环境 jdk17 andriod 34 compose material3 简介 本案…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置&#xff1a;2C&#xff0c;2G内存&#xff0c;50G存储 3、集群架构 从表格中&#xff0c;可以看出&#xff0c;Hadoop集群&#xff0c;主要有2部分&#xff0c;一个是HDFS服务&#xff0c;一个是YARN服务 …

[系统安全] 六十.威胁狩猎 (1)APT攻击检测及防御与常见APT组织的攻击案例分析

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

四、管道与重定向

四、管道与重定向 1 重定向 0,标准输入(键盘) 1,标准输出 2,标准错误&#xff0c; 3,进程在执行过程中打开的其他文件。 &:表示正确错误混合输出1.1 输出重定向 (覆盖&#xff0c;追加) > ----覆盖 >> ----追加 正确输出&#xff1a; 1> 1>> 等价…

Git 仓库内容操作

Git 仓库内容操作 | CoderMast编程桅杆Git 仓库内容操作 添加文件到暂存区 使用如下指令将工作区的文件添加到暂存区&#xff0c;告诉 Git 在下次 commit 时哪些文件做出了修改。 commit 指令详看后续 添加一个或多个文件到暂存区&#xff1a; 添加指定目录到暂存区 添加当前目…

ffmpeg与sdl的个人笔记

说明 这里的ffmpeg基础知识和sdl基础知识仅提及与示例代码相关的知识点, 进阶可学习雷神的博客。 https://blog.csdn.net/leixiaohua1020 当然&#xff0c;如代码写的有问题或有更好的见解&#xff0c;欢迎指正&#xff01; 音视频基础知识 在学习音视频理论知识时&#xff…

CSS中设置透明度的2个属性:opacity,RGBA以及它们的区别

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

试用了三个Ai音乐工具,我的偶像河图要完蛋了

试了三个生成音乐的ai工具&#xff0c;分别是爆火的suno,后期新秀udio&#xff0c;还有我们国内的天工。 先说感受&#xff0c;suno和天工我觉得稍微靠前&#xff0c;udio可能我的配置风格有问题&#xff0c;啪啪啪连选了好几个风格&#xff0c;生成的东西有点怪。 我随手写了…

【机器学习基础1】什么是机器学习、预测模型解决问题的步骤、机器学习的Python生态圈

文章目录 一. 什么是机器学习1. 概念2. 机器学习算法分类 二. 利用预测模型解决问题的步骤三. 机器学习的Python生态圈 一. 什么是机器学习 1. 概念 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一门多领域的交叉学科&#xff0c;涉及概率论、统计学、…

深度学习 --- stanford cs231学习笔记(一)

stanford cs231学习笔记(一) 1&#xff0c;先是讲到了机器学习中的kNN算法&#xff0c;然后因为kNN分类器的一些弊端&#xff0c;引入了线性分类器。 kNN算法的三大弊端&#xff1a; (1)&#xff0c;计算量大&#xff0c;当特征比较多时表示性差 (2)&#xff0c;训练时耗时少…

01 - 安装Kettle

下载安装包 我这边提供的安装包是绿色版的&#xff0c;开箱即用 Kettle.exe 阿里云盘分享 提取码: 8sd5 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 启动步骤 解压 双击Spo…

注意力机制(四)(多头注意力机制)

​&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习基础知识》 相关专栏&#xff1a; ⚽《机器学习基础知识》 &#x1f3d0;《机器学习项目实战》 &#x1f94e;《深度学习项目实…

Python | Leetcode Python题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; class Solution:def canJump(self, nums: List[int]) -> bool:n, rightmost len(nums), 0for i in range(n):if i < rightmost:rightmost max(rightmost, i nums[i])if rightmost > n - 1:return Truereturn False

闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子

前言 一个在实际应用中 EF Core 集成 FluentValidation 进行数据校验的例子。 Step By Step 步骤 创建一个 Asp.Net Core WebApi 项目 引用以下 Nuget 包 FluentValidation.AspNetCore Microsoft.AspNetCore.Identity.EntityFrameworkCore Microsoft.EntityFrameworkCore.Re…

Unity 合并子物体获得简化Mesh

合并子物体获得简化Mesh &#x1f959;环境&#x1f96a;Demo &#x1f959;环境 PackageManager安装Editor Coroutines 导入插件&#x1f448; &#x1f96a;Demo 生成参数微调&#xff1a;Assets/EasyColliderEditor/Scripts/VHACDSettings/VHACDSettings.asset

TDengine高可用架构之TDengine+Keepalived

之前在《TDengine高可用探讨》提到过&#xff0c;TDengine通过多副本和多节点能够保证数据库集群的高可用。单对于应用端来说&#xff0c;如果使用原生连接方式&#xff08;taosc&#xff09;还好&#xff0c;当一个节点下线&#xff0c;应用不会受到影响&#xff1b;但如果使用…

Kafka 3.x.x 入门到精通(03)——Kafka基础生产消息

Kafka 3.x.x 入门到精通&#xff08;03&#xff09;——对标尚硅谷Kafka教程 2. Kafka基础2.1 集群部署2.2 集群启动2.3 创建主题2.4 生产消息2.4.1 生产消息的基本步骤2.4.2 生产消息的基本代码2.4.3 发送消息2.4.3.1 拦截器2.4.3.1.1 增加拦截器类2.4.3.1.2 配置拦截器 2.4.3…