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]+" ");​}}​//反转数组1public 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();}​}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个人可能代表一群人

最近有个小伙伴问他是做货代的&#xff0c;怎么能找到自己的客户&#xff1f;刚看到这个问题的时候&#xff0c;觉得这个不属于自己的范围&#xff0c;因为自己不是做货代的&#xff0c;怎么知道他们怎么工作&#xff0c;怎么去搜索客户呢&#xff1f; 但是仔细想来&#xff0…

【Java EE】日志框架(SLF4J)与门面模式

文章目录 &#x1f340;SLF4j&#x1f333;门面模式(外观模式)&#x1f338;门面模式的定义&#x1f338;门面模式的模拟实现&#x1f338;门面模式的优点 &#x1f332;关于SLF4J框架&#x1f338;引入日志门面 ⭕总结 &#x1f340;SLF4j SLF4J不同于其他⽇志框架,它不是⼀个…

跟TED演讲学英文:AI isn‘t as smart as you think -- but it could be by Jeff Dean

AI isn’t as smart as you think – but it could be Link: https://www.ted.com/talks/jeff_dean_ai_isn_t_as_smart_as_you_think_but_it_could_be Speaker: Jeff Dean Jeffrey Adgate “Jeff” Dean (born July 23, 1968) is an American computer scientist and software…

【服务器部署篇】Linux下快速安装Jenkins

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

微前端micro-app 子应用 调用父应用方法

参考&#xff1a;micro-app官方文档 场景描述 父应用存储一套vuex数据&#xff0c;其中包含登录信息token等&#xff0c;登录信息透传给子应用使用。 当子应用中的接口返回“登录失效”时&#xff0c;需要清空父应用vuex中的登录相关信息&#xff0c;并且跳转到登录页面。 原…

网站建设企业网站优化

近年来&#xff0c;随着互联网的迅速发展&#xff0c;企业网站已经成为了企业展示自我形象与实力的重要载体之一。然而&#xff0c;单单拥有一个美观、简洁的企业网站并不能让企业在竞争激烈的市场中脱颖而出。因此&#xff0c;在建设企业网站的过程中&#xff0c;我们需要将企…

【前端】对象的常用处理函数(深浅拷贝)

前言 浅拷贝会创建一个新对象&#xff0c;但只复制了原始对象的第一层属性&#xff0c;而不是递归地复制整个对象的所有嵌套属性。因此&#xff0c;新对象中的嵌套对象仍然是原始对象中嵌套对象的引用。这意味着修改新对象中的嵌套对象会影响原始对象中的相应嵌套对象 深拷贝…

C++常用的输入输出方法(ACM模式)

文章目录 前言一、输入输出方法1、cin2、getline()3、getchar() 二、算法案例1、一维数组1.1 输入固定长度1.2长度不固定 2、固定二维数组3、以非空格隔开的元素输入3、常见数据结构定义以及输入3.1 链表 前言 C中的输入输出函数有很多&#xff0c;我们本章只针对大部分算法题…

上位机图像处理和嵌入式模块部署(树莓派4b开机界面程序自启动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了如何在树莓派4b上面开发qt&#xff0c;也学习了如何用/etc/rc.local启动控制台程序&#xff0c;那今天我们继续学习一下如何利用树莓…

docker compose安装redis

一、安装准备 在docker hub查看redis镜像版本。查看地址如下&#xff1a; Dockerhttps://hub-stage.docker.com/_/redis/tags 二、拉取docker镜像 我这里用redis:6.2.14版本&#xff0c;先拉取镜像。命令如下&#xff1a; docker pull redis:6.2.14 查看刚刚下载的镜像&am…

链表的从尾到头打印(递归)

目录 链表的从尾到头打印&#xff08;递归&#xff09; 链表的从尾到头打印&#xff08;递归&#xff09; 递归打印链表 #include <bits/stdc.h> using namespace std;void coutls(list<int>::iterator iter, list<int>::iterator node_end){if (iter!node…

[python数据处理系列] 深入理解与实践基于聚类的过采样与欠采样技术:以K-Means为例

目录 一、过采样介绍 (一)什么是过采样 (二)过采样的优点 (三)过采样的缺点 二、欠采样介绍 (一)什么是欠采样 (二)欠采样的优点 (三)欠采样的缺点 三、基于聚类的欠抽样方法(K-Means欠采样/KMeans-Undersampling) (一)KMeans欠采样原理及其步骤介绍 (二)为什么不采…

clickhouse学习笔记05

ClickHouseSpringBoot2.XMybatisPlus整合搭建 添加需要的依赖&#xff1a; 添加clickhouse依赖&#xff1a; 配置数据库配置&#xff1a; 我们框架就搭建完了。 ClickHouse的项目案例统计需求讲解 ClickHouse的项目案例统计库表和数据准备 添加数据&#xff1a; 数据都插入进来…

js逆向进阶篇-某团酒店

提示!本文章仅供学习交流,严禁用于任何商业和非法用途,未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,如有侵权,可联系本文作者删除! 案例分析: 先来看看请求中有哪些参数是需要我们逆向,如下: mtgsig、fp、roh…

ERROR: [7df2405] missing Change-Id in commit message footer

git push origin HEAD:refs/for/[分支名] 使用“git push origin HEAD:refs/for/[分支名]”,报错信息见下图 报错信息:ERROR: [7df2405] missing Change-Id in commit message footer 解决办法 根据git的提示依次执行下面的语句即可 第一步:输入下面的语句,下载一个 g…

Java---数据类型与变量

1.字面常量 字面常量就是我们经常所说的常量&#xff0c;常量即在程序运行期间&#xff0c;固定不变的量。且常量是无法改变的&#xff0c;如果我们的代码有改变常量的操作&#xff0c;程序就会报错。 1.1字面常量的分类 字符串常量&#xff0c;整型常量&#xff0c;浮点数常…

FileLink内外网文件摆渡系统产品介绍

在现代企业中&#xff0c;往往存在着多个网络、系统之间的数据孤岛问题&#xff0c;数据难以互相访问和共享。 一、常用的内外网文件摆渡方式 传统的数据交换方式往往需要人工介入&#xff0c;效率低下且容易出错。如&#xff1a;U盘、FTP、VPN等&#xff0c;极易引发各种各样…

Mysql事务—隔离级别—脏读、不可重复读、幻读-遥遥领先版

事务的基本概念 事务就是一组原子性的操作&#xff0c;这些操作要么全部发生&#xff0c;要么全部不发生。事务把数据库从一种一致性状态转换成另一种一致性状态。 事务最经典也经常被拿出来说例子就是转账了。 假如小明要给小红转账1000元&#xff0c;这个转账会涉及到两个…

libcudart.so.10.2: cannot open shared object file: No such file or directory

文章目录 整体过程细节在虚拟环境中安装cuda 10.2在虚拟环境中安装cuda 12.1 整体过程 首先出现这个报错说明在/usr/local/cuda-11.5/lib64目录中确实没有libcudart.so.10.2这个文件&#xff0c;然后按照网上的教程&#xff0c;我在虚拟环境中安装了cuda10.2&#xff08;由于用…

mysql面试题九(SQL优化)

目录 1.一条 SQL 是如何执行的 2.索引失效的几种情况 3.EXPLAIN 4.Where 子句如何优化 5.超大分页或深度分页如何处理 6.大表查询如何优化 7.分库分表 基本概念 分库分表方法 水平拆分 垂直拆分 分库分表后的注意事项 1.一条 SQL 是如何执行的 在MySQL中&#xff0…