Java中的数组

数组

定义

  • 数组是相同类型数据的有序集合
  • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成的
  • 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问他们

声明和创建

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

dataType[] arrayRefVar;	//首选的方法
或
dataType arrayRefVar[];	//效果相同,但不是首选方法
//Java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRefVar = new dataType[arraySize];

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

获取数组长度

arrays.length
package com.kuang.array;/*** @version:java version 1.8* @Author:Mr Cao* @Description:* @Date:2024-02-01 2:10*/
public class ArrayDemo01 {//变量的类型 变量的名字   =   变量的值//数组类型public static void main(String[] args) {int[] nums; //1.声明一个数组
//        int nums2[];nums = new int[10]; //2.创建一个数组int[] nums2 = new int[10];//3.给数组元素中赋值nums[0]=1;nums[1]=2;nums[2]=3;nums[3]=4;nums[4]=5;nums[5]=6;nums[6]=7;nums[7]=8;nums[8]=9;nums[9]=10;//计算所有元素的和int sum=0;//获取数组长度:arrays.lengthfor (int i = 0; i < nums.length; i++) {sum+=nums[i];}System.out.println("总和为:"+sum);//数组下标越界错误System.out.println(nums[10]);   //java.lang.ArrayIndexOutOfBoundsException: 10}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三种初始化状态

静态初始化

int[] a = {1,2,3};
Man[] mans = {new Man(1,1),new Man(2,3)};

动态初始化

int[] a = new int[2];
a[0]=1;
a[1]=2;

数组的默认初始化

数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

数组的四个基本特点

  • 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
  • 其元素必须是相同类型,不允许出现混合类型。
  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
  • 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

数组边界

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

public static void main(String[] args){int[] a = new int[2];System.out.println(a[2]);	java.lang.ArrayIndexOutOfBoundsException: 数组下标越界异常
}
小结
  • 数组是相同数据类型(数据类型可以为任意类型)的有序集合
  • 数组也是对象。数组元素相当于对象的成员变量
  • 数组长度是确定的,不可改变的。如果越界,则报:java.lang.ArrayIndexOutOfBoundsException:

数组的使用

普通for循环

package com.kuang.array;import org.omg.CORBA.ARG_OUT;/*** @version:java version 1.8* @Author:Mr Cao* @Description:* @Date:2024-02-01 3:30*/
public class ArrayDemo03 {public static void main(String[] args) {int[] arrays = {1,2,3,4,5};//打印全部的数组元素for (int i = 0; i < arrays.length; i++) {System.out.println(arrays[i]);}System.out.println("=============");//计算所有元素的和int sum = 0;for (int i = 0; i < arrays.length; i++) {sum+=arrays[i];}System.out.println("sum="+sum);System.out.println("=============");//查找最大元素int max=arrays[0];for (int i = 1; i < arrays.length; i++) {if(arrays[i]>max){max=arrays[i];}}System.out.println("max="+max);}
}

增强for循环

  • 普通的for循环
  • For-Each循环
  • 数组作方法入参
  • 数组作返回值
package com.kuang.array;/*** @version:java version 1.8* @Author:Mr Cao* @Description:* @Date:2024-02-01 3:35*/
public class ArrayDemo04 {public static void main(String[] args) {int[] arrays = {1,2,3,4,5};//增强for循环//JDK1.5,没有下标for (int array : arrays) {System.out.println(array);}//打印数组元素printArray(arrays);int[] reverse = reverse(arrays);System.out.println();printArray(reverse);}public static void printArray(int[] arrays){for (int i = 0; i < arrays.length; i++) {System.out.print(arrays[i]+"");}}//反转数组public static int[] reverse(int[] arrays){int[] result=new int[arrays.length];//反转的操作for (int i = 0,j= result.length-1; i < arrays.length; i++,j--) {result[j] = arrays[i];}return result;}
}

多维数组

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

二维数组

int a[][] = new int[2][5];	//可以看成一个两行五列的数组

在这里插入图片描述
在这里插入图片描述

package com.kuang.array;/*** @version:java version 1.8* @Author:Mr Cao* @Description:* @Date:2024-02-02 2:31*/
public class ArrayDemo05 {public static void main(String[] args) {/*[4][2]1,2 array[0]2,3 array[1]3,4 array[2]4,5 array[3]*/int[][] array = {{1,2},{2,3},{3,4},{4,5}};System.out.println(array[0]);printArray(array[0]);System.out.println(array[0][0]);for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.println(array[i][j]);}}}public static void printArray(int[] arrays){for (int i = 0; i < arrays.length; i++) {System.out.print(arrays[i]+"");}}
}

Arrays类

  • 数组的工具类java.util.Arrays
  • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作
  • 查看JDK帮助文档
  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是‘不用’而不是“不能”)
  • 具有以下功能
    • 给数组赋值:通过fill方法
    • 对数组排序:通过sort方法,按升序
    • 比较数组:通过equals方法比较数组中元素值是否相等。
    • 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作
package com.kuang.array;import java.util.Arrays;/*** @version:java version 1.8* @Author:Mr Cao* @Description:* @Date:2024-02-02 3:04*/
public class ArrayDemo06 {public static void main(String[] args) {int[] a = {1,2,3,4,9090,31231,543,21,3,23};System.out.println(a);  //[I@1b6d3586//打印数组元素System.out.println(Arrays.toString(a));printArray(a);Arrays.sort(a); //数组进行排序System.out.println(Arrays.toString(a));Arrays.fill(a,0);   //数组填充printArray(a);Arrays.fill(a,2,4,1);   //数组填充  // [2,4)=>2,3printArray(a);}// 不要重复造轮子public static void printArray(int[] a){for (int i = 0; i < a.length; i++) {if(i==0){System.out.print("[");}if(i==a.length-1){System.out.print(a[i]+"]");}else{System.out.print(a[i]+", ");}}System.out.println();}
}

冒泡排序

  • 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序
  • 冒泡排序的代码还是相当简单的,两层循环,外层冒泡轮数,内层依次比较,人尽皆知。
  • 我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(n^2)
  • 如何优化?
package com.kuang.array;import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;/*** @version:java version 1.8* @Author:Mr Cao* @Description:* @Date:2024-02-02 3:27*/
public class ArrayDemo07 {public static void main(String[] args) {int[] a = {1,7,8,2,1,3,5,4,6,8};int[] sort=sort(a); // 调用完我们自己写的排序算法以后,返回一个排序后的数组System.out.println(Arrays.toString(sort));}// 冒泡排序// 1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置// 2.每一次比较都会产生出一个最大或者最小的数字// 3.下一轮则可以少一次排序// 4.依次循环,直到结束public static int[] sort(int[] array){// 临时变量int temp = 0;// 外层循环,判断我们这个要走多少次for (int i = 0; i < array.length-1; i++) {boolean flag = false;   // 通过flag标志位较少没有意义的比较// 内层循环,比较判断两个数,如果第一个数,比第二个数大,则交换位置for (int j = 0; j <array.length-1-i; j++) {if(array[j+1]>array[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;}
}

稀疏数组

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

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

解决:稀疏数组

稀疏数组介绍

  • 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组
  • 稀疏数组的处理方式是:
    • 记录数组一共有几行几列,有多少个不同值
    • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
  • 如下图:左边是原始数组,右边是稀疏数组

在这里插入图片描述

package com.kuang.array;/*** @version:java version 1.8* @Author:Mr Cao* @Description:* @Date:2024-02-02 4:03*/
public class ArrayDemo08 {public static void main(String[] args) {//1.创建一个二维数组 11*11  0:没有棋子,1:黑棋,2:白棋int[][] array1 = new int[11][11];array1[1][2] = 1;array1[2][3] = 2;// 输出原始数组System.out.println("输出原始数组");for (int[] ints : array1) {for (int anInt : ints) {System.out.print(anInt+"\t");}System.out.println();}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];}}}// 输出稀疏数组System.out.println("输出稀疏数组");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("=============");System.out.println("还原");//还原// 1.读取稀疏数组int[][] array3 = new int[array2[0][0]][array2[0][1]];// 2.给其中的元素还原他的值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.hqwc.cn/news/513255.html

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

相关文章

Spring 面试题及答案整理,最新面试题

Spring框架中的Bean生命周期是什么&#xff1f; Spring框架中的Bean生命周期包含以下关键步骤&#xff1a; 1、实例化Bean&#xff1a; 首先创建Bean的实例。 2、设置属性值&#xff1a; Spring框架通过反射机制注入属性。 3、调用BeanNameAware的setBeanName()&#xff1a…

Android minigbm框架普法

Android minigbm框架普法 引言 假设存在这么一个场景&#xff0c;我的GPU的上层实现走的不是标准的Mesa接口&#xff0c;且GPU也没有提专门配套的gralloc和hwcompoer实现。那么我们的Android要怎么使用到EGL和GLES库呢&#xff0c;并且此GPU驱动是支持drm实现的&#xff0c;也有…

小米澎湃和华为原生鸿蒙,那个更有发展前景?

小米的澎湃系统暂时不了解&#xff0c;但华为的鸿蒙系统值得一说。 就目前鸿蒙而言&#xff1b;24年初鸿蒙星河版面向开发者开放申请。其底座全线自研&#xff0c;去掉了传统的 Linux 内核以及 AOSP 安卓开放源代码项目等代码&#xff0c;仅支持鸿蒙内核和鸿蒙系统的应用。星河…

亚马逊卖家做市场分析业务可以用静态IP代理完成吗?

亚马逊作为全球最大的电商平台之一&#xff0c;其庞大的销售数据和用户行为数据成为了许多商家和市场研究人员进行市场分析和竞争研究的重要来源。而使用IP代理则能够为亚马逊市场分析带来许多帮助&#xff0c;下面就来一一介绍。静态IP代理可以为市场分析带来哪些帮助&#xf…

android开发文档下载,你的技术真的到天花板了吗

Android 基础 1.Activity 1、 什么是 Activity&#xff1f; 2、 请描述一下 Activity 生命周期 …… 2.Service 3.Broadcast Receiver32 4.ContentProvider 5.ListView 6.Intent 7.Fragment 1.Fragment 跟 Activity 之间是如何传值的 2.描述一下 Fragment 的生命周期 3.Fragme…

数据结构与算法:堆排序和TOP-K问题

朋友们大家好&#xff0c;本节内容来到堆的应用&#xff1a;堆排序和topk问题 堆排序 1.堆排序的实现1.1排序 2.TOP-K问题3.向上调整建堆与向下调整建堆3.1对比两种方法的时间复杂度 我们在c语言中已经见到过几种排序&#xff0c;冒泡排序&#xff0c;快速排序&#xff08;qsor…

Nodejs 第四十九章(lua)

lua Lua是一种轻量级、高效、可嵌入的脚本语言&#xff0c;最初由巴西里约热内卢天主教大学&#xff08;Pontifical Catholic University of Rio de Janeiro&#xff09;的一个小团队开发而成。它的名字"Lua"在葡萄牙语中意为"月亮"&#xff0c;寓意着Lua…

浏览器中的HTTP请求原理

一.浏览器的多进程架构(Chrome) Chrome打开一个页面需要启动多少进程&#xff1f;我们可以点击Chrome浏览器右上角的“选项”菜单&#xff0c;选择“更多工具”子菜单&#xff0c;点击“任务管理器”&#xff0c;这将打开Chrome的任务管理器的窗口&#xff1a; Chrome任务管…

Java_优先级队列(堆)(Priority Queue)

文章目录 一、优先级队列1.概念 二、优先级队列的模拟1.堆的概念2.堆的存储方式3.堆的创建1、堆向下调整2、堆的创建代码实现3、建堆的时间复杂度 2.堆的插入与删除1、堆的插入2、堆的删除3、完整的堆代码4、练习 一、PriorityQueue常用接口介绍1.PriorityQueue的特性2.Priorit…

如何使用程序调用通义千问

之前分享了&#xff0c;使用程序调用文心一言。但是很快文心一言就要收费了。阿里的提供了暂时免费版的基础模型&#xff0c;效果还算可以。所以再分享一下&#xff0c;如何使用程序来调用通义千问的模型。 整体很简单&#xff0c;分三步&#xff1a;导入依赖&#xff1b;获取A…

基于springboot+vue的酒店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

MySQL的三大范式

文章目录 简介第一范式第二范式第三范式&#xff1a; 简介 在MySQL的使用中&#xff0c; 要根据实际灵活设计表&#xff0c;一般来说我们通常遵循三大范式&#xff08;啥是范式&#xff1a;是一些约束、规范、规则&#xff0c; 来优化数据库表的设计和存储&#xff09;,三大范…