java 学习3(数组)

news2024/10/3 0:33:58

java ——数组

✍作者:电子科大不知名程序员

🌲专栏:java学习指导

各位读者如果觉得博主写的不错,请诸位多多支持;如果有错误的地方,欢迎在评论区指出

数组是一组相同类型元素按一定顺序排列的集合

数组相关的概念:

1.数组名

2.数组元素

3.数组的特点:数组是有序排列的

4.角标、下标、索引

数组的概述

1.数组属于引用数据类型的变量;数组的元素既可以是基本数据类型,也可以是引用数据类型;

2.数组的长度一旦确定以后就不能修改

3.数组的分类

​ —>按照维数:一维数组、二维数组…

​ —>按照数组元素的类型,基本数据类型元素的数组、引用数据类型元素的数组

一维数组的使用

1.一维数组的声明和初始化

int[]ids; //声明(ids为数组名),而int[]代表要创建一个int类型的数组
//静态初始化:数组的初始化和数组元素的赋值操作同时进行
ids=new int[]{1,2,3,4};
//动态初始化:数组的初始化和数组元素的赋值分开进行
String [] names=new String[5];

总结:数组一但初始化完成,其长度就确定了

2.如何调用数组的指定位置的元素:通过角标的方式调用

​ 数组的角标从0开始,到数组的长度-1结束

3.如何获取数组长度:

​ 属性:length

System.out.println(ids.length);

4.如何遍历数组

for(int i=0;i<ids.length;i++){
    System.out.println("ids[i]");
}

5.数组元素的默认初始化值

​ —>数组元素是整型,默认初始化值为0;

​ —>数组元素是浮点型,默认初始化值为0.0;

​ —>数组元素是char型,默认初始化值为0或’\u0000’,而非’0’

​ —>数组元素是boolean型,默认初始化值为false;

​ —>数组元素是引用数据类型(String),默认初始化值为null;

6.数组的内存解析

​ 内存结构的简单说明:

image-20220914151846894

(放在方法中的变量叫做局部变量)

img

栈区&堆区

多维数组

1.二维数组的声明和初始化:

int[] arr=new int[]{1,2,3};
int[][] arr1=new int[][]{{1,2,4},{2,3,4},{3,4,5}};   //二维数组的静态初始化

动态初始化:

String[][] arr2=new String[3][2];     

动态初始化时:必须要对行初始化,列不一定需要初始化

String[][] arr2=new String[3][2];        //right

赋值不带长度,带长度时不赋值

2.如何调用数组的指定位置的元素

//首先我们声明并初始化一个二维数组:
String[][] arr=new String[3][]      //这里未对列进行初始化
//然后我们访问指定位置的元素
System.out.println(arr[1][1]);      //null  这里就会出现空指针

我们这里只声明了有三行,因此在堆区生成了三行都是空的一个数组,未生成列

因此我们在第二行声明列即可:

arr[1]=new String[4];
System.out.println(arr[1][1]);
//这样就在这个数组的第二行生成了一个能存4个元素的新数组

3.获取数组的长度

int[][] arr1=new int[][]{{2,4},{2,3,4},{3,4,5}}; 
System.out.println(arr1.length);    //3

arr1指的就是一个一维数组,只是这个一维数组的元素又是一个数组,所以才是二维数组

下面我们来研究这种情况:

System.out.println(arr[0].length);   //代表arr数组保存的第一个元素{2,4}的长   2
System.out.println(arr[1].length);   //{2,3,4}   3

4.如何遍历二维数组

public class Two_dimensional_Array_Traversal {
	public static void main(String[] args) {
		int[][] arr=new int[][]{{1,2},{1,2,3},{1,2,3,4}};
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr[i].length;j++) {
				System.out.print(arr[i][j]);
			}
		System.out.println();
		}
	}
}

5.二维数组的使用

规定:二维数组分为外层数组的元素,内层数组的元素

对于int型:

int[][] arr=new int[4][3];    //动态初始化
//外层元素:arr[0],arr[1]    等
//内层元素:arr[0][0],arr[1][2]等
public class Two_dimensional_Array_Initialization {
	public static void main(String[] args) {
		int[][] arr=new int[4][3];  
		System.out.println(arr[0]);
		System.out.println(arr[0][0]);
	}
}

运行结果如下:

image-20220916190309469

我们因此可以看到:第一个初始化是地址,第二个才是0

这是怎么回事呢,因为在外层数组元素是数组,指向的是内层元素

对于float型:

System.out.println(arr[0]);   //仍是地址值
System.out.println(arr[0][0]);//0.0

对于String型:

System.out.println(arr[0]);   //地址值
System.out.println(arr[0][0]);//null

另一种初始化方式:

double[][] arr1=new double[4][];
System.out.println(arr1[0]);   //null
System.out.println(arr1[0][0]);//报错:空指针异常

【总结】:对于初始化方式一,外层元素的初始化值为地址值,内层元素的初始化值与一维数组初始化情况相同;对于初始化方式二,外层元素的初始化值为null,外层元素的初始化值会报错:不能调用

6.二维数组的内存

image-20220916192106299

栈空间保存arr1,右边是堆空间

实例:使用二维数组打印杨辉三角

public class Print_Yang_Hui_Triangle {
	public static void main(String[] args) {
		//声明并初始化数组
		int[][] Triangle_Array=new int[10][]; 		//十行,但由于每一行的列数都不一样
		//给数组元素赋值
		//先搭建10行
		for(int i=0;i<Triangle_Array.length;i++) {  //这里通过.length来获取数组的长度
			Triangle_Array[i]=new int[i+1];         //i是从0开始的,所以i所在的行其实有i+1列
			//给首末元素赋值
			Triangle_Array[i][0]=1;
			Triangle_Array[i][i]=1;
			//给其它元素赋值
			if(i>1) {
				for(int j=1;j<Triangle_Array[i].length-1;j++) {
					Triangle_Array[i][j]=Triangle_Array[i-1][j-1]+Triangle_Array[i-1][j];
				}
			}
		}
		//遍历二维数组(打印出来)
		for(int i=0;i<Triangle_Array.length;i++) {
			for(int j=0;j<Triangle_Array[i].length;j++) {
				
				System.out.print(Triangle_Array[i][j]+" ");
			}
			System.out.println();
		}
	}
}

【总结】:编写杨辉三角时我们需要明白,我们创建的二维数组并不是10*10的传统二维数组,而是每一行对于的列数都不相同,因此这里我们采用动态初始化的方式,来先确定行;然后到下一步我们来初始化数组的列,而对于列来说,i表示的行本质实在第i+1行,因此有i+1列,因此i对应行的来表示列的数组有i+1个元素;最后根据杨辉三角的规律给每一个元素赋值:每一行首元素和末元素都是1,剩余的遵循数学规律,而在自己做的时候忽略掉的一点就是其实可以用.length来计算数组的元素个数(即是数组的元素个数)

数组中涉及到的算法

1.数组元素的赋值

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

public class Random_numbers_Compare {
	public static void main(String[] args) {
		//生成随机数
		//公式:(int)(Math.random()*(99-10+1)+10)
	int[] arr=new int[10];
	for(int i=0;i<arr.length;i++) {
		arr[i]=(int)(Math.random()*(99-10+1)+10);
		}
	//显示生成的随机数组
	for(int i=0;i<arr.length;i++) {
		System.out.print(arr[i]+" ");
	}
	System.out.println();
	//求最大值:
	int maxValue=arr[0];//这里最好不要初始化为0,以防数组中的元素全是负数,这里让它为数组中任意一个元素即可
	for(int i=0;i<arr.length;i++) {
		if(maxValue<arr[i]) {
			maxValue=arr[i];
		}
	}
	System.out.println("最大值为:"+maxValue);
	//求最小值
	int minValue=arr[0];
	for(int i=0;i<arr.length;i++) {
		if(minValue>arr[i]) {
			minValue=arr[i];
		}
	}
	System.out.println("最小值为:"+minValue);
	//求平均值
	int sum=0;
	for(int i=0;i<arr.length;i++) {
		sum+=arr[i];
	}
	double averageValue=(sum*1.0)/arr.length;
	System.out.println("平均值为:"+averageValue);
	
	}
}

3.数组的复制

public class Copy_Arrays {
	public static void main(String[] args) {
		int[] array1,array2;
		array1 =new int[]{2,3,5,7,11,13,17,19};
		for(int i=0;i<array1.length;i++) {
			System.out.print(array1[i]+" ");
		}
		System.out.println();
		//赋值array2变量等于array1
		//array2=array1;    //对array1进行初始化后,new的堆空间地址赋值给array2
		//上面的操作不能称为数组的复制,只是在栈空间的array1和array2指向同一块堆空间的地址(唯一的一个数组实体)
		//若真正的实现array1到array2数组的复制:
		array2=new int[array1.length];
		for(int i=0;i<array2.length;i++) {
			array2[i]=array1[i];
		}
		
		//修改偶索引元素的值使其等于其索引值
		for(int i=0;i<array2.length;i++) {
			if(i%2==0) {
				array2[i]=i;
			}
		}
		//遍历array1和array2
		for(int i=0;i<array2.length;i++) {
			System.out.print(array1[i]+" ");
		}
		System.out.println();
		for(int i=0;i<array2.length;i++) {
			System.out.print(array2[i]+" ");
		}
	}
}

4.数组的反转

public class Inversion_Arrays {
	public static void main(String[] args) {
		String[] arr=new String[] {"N","I","V","E","K"};
		//数组的翻转
		for(int i=0;i<arr.length/2;i++) {
			String temp=arr[i];
			arr[i]=arr[arr.length-1-i];//这里需要注意数组下标为arr.length-1代表的是最后一个元素
			arr[arr.length-1-i]=temp;
		}
		//遍历
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]+" ");
		}
	}
}

【注意】:这里的数组翻转并不是反过来打印,而是要真正改变数组的元素的值;而第二个需要注意的是,在交换时循环条件的控制上并不能讲整个数组都遍历完,这样会交换一次后有交换回来,只用遍历到一半即可实现交换(对于奇数个偶数个都是一样的)

5.数组的查找:线性查找、二分法查找

public class Linear_Lookup {
	//线性查找
	public static void main(String[] args) {
		String[] arr=new String[]{"N","I","V","E","K"};
		String target="E";
		boolean isFlag=true;
		for(int i=0;i<arr.length;i++) {
			if(target.equals(arr[i])) {
				System.out.println("找到了指定元素,位置为:"+i);
			isFlag=false;
			}
		}
		//没有查找到时我们给予提示,但如果直接输出找到和未找到都会输出
		//而且我们不能在循环内部添加,因为查找时一定要让循环走完
		if(isFlag) {
			System.out.println("未找到指定元素");
		}
	}
}

注意:target.equals(arr[i])

这里我们如果要比较整型数值的大小,直接使用==即可,而这里我们需要比较两个字符串是否相同,用到的语法为:

target.equals(arr[i]);

target和arr[i]是要比较的两串字符串

public class Dichotomy_Lookup {
	//二分法查找
	//前提:所要查找的数组必须有序
	public static void main(String[] args) {
		int[] arr=new int[] {-32,-15,-10,2,30,45,90};      //有序
		int target=30;
		//首索引和末索引
		int left=0;
		int right=arr.length-1;
		boolean isFlag=true;
		while(left<=right) {
			int mid=(left+right)/2;
			if(target==arr[mid]) {
				System.out.println("找到了,元素的位置为:arr["+mid+"]");
				isFlag=false;
				break;
			}
			else if(target<arr[mid]){
				right=mid;
			}
			else {
				left=mid;
			}
		}
		if(isFlag) {
			System.out.println("未找到该元素");
		}
	}
}

6.数组的排序

例如我们在使用二分法时,要求数组是有序的,因此数组的排序意义重大

评价排序算法的优劣:时间、空间、稳定性

稳定性:若两个记录A和B关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的

排序的分类:外部排序和内部排序

冒泡排序:

public class Bubbling_Sorting {
	public static void main(String[] args) {
		//冒泡排序
		int[] arr=new int[] {-12,22,45,-87,-22,56,78,23,-66};
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr.length-1-i;j++) {
				if(arr[j]<arr[j+1]) {
					int tem=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=tem;
				}
			}
		}
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]+" ");
		}
	}
}

Arrays工具类

import java.util.Arrays;

public class Arrays_tool_class {
	public static void main(String[] args) {
		//1.boolean equals(int[] a,int[] b):判断两个数组是否相等
		int[] arr1=new int[] {1,2,3,4};
		int[] arr2=new int[] {1,3,2,4};
		boolean isEquals=Arrays.equals(arr1, arr2);
		System.out.println(isEquals);   //false(数组是有顺序的)
		
		//2.String toString(int[] a):输出数组信息
		System.out.println(Arrays.toString(arr1));  //[1, 2, 3, 4]
		
		//3.void fill(int[] a,int val):将指定值(val)填充到数组中
		Arrays.fill(arr1, 10);
		System.out.println(Arrays.toString(arr1));  //[10, 10, 10, 10]
	
		//4.void sort(int[] a):对数组进行排序
		Arrays.sort(arr2);
		System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4]
		
		//5.int binarySearch(int[],int key):二分查找(数组要先有序)
		int[] arr3=new int[] {1,2,4,5,8};
		int index=Arrays.binarySearch(arr3, 5);
		System.out.println(index);       //3   这个3代表的数组的下标
		//若返回值为负数:没有找到
	}
}

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

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

相关文章

[MatLab]变量与数据结构

在开始工程之前&#xff0c;需要先指定工程目录&#xff0c;按住下图红框按钮进行选择。 Matlab分为编辑器和命令窗口&#xff0c;编辑器用来编写代码文件&#xff0c;而命令窗口可以实时交互。 在窗口中输入clc即可清除命令窗口&#xff1b;clear all可以清除工作区中所有变量…

【论文笔记】Long Tail Learning via Logit Adjustment

摘要 Our techniques revisit the classic idea of logit adjustment based on the label frequencies, either applied post-hoc to a trained model, or enforced in the loss during training. Such adjustment encorages a large relative margin between logits of rare …

项目管理系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;企业项目管理系统是为了使企业项目能够按照预定的成本、进度、质量顺利完成&#xff0c;而对人员、产品、过程和项目进行分析和管理的活动&#xff0c;系统主要包括项目基本信息操作、项目规划管理&#xff0c;合同管理&#xff0c…

一步一步教你如何使用 Visual Studio Code 编译一段 C# 代码

以下是一步一步教你如何使用 Visual Studio Code 编写使用 C# 语言输出当前日期和时间的代码&#xff1a; 1、下载并安装 .NET SDK。您可以从 Microsoft 官网下载并安装它。 2、打开 Visual Studio Code&#xff0c;并安装 C# 扩展。您可以在 Visual Studio Code 中通过扩展菜…

VMware NSX 4.1 发布 - 网络安全虚拟化平台

请访问原文链接&#xff1a;VMware NSX 4 - 网络安全虚拟化平台&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org VMware NSX 提供了一个敏捷式软件定义基础架构&#xff0c;用来构建云原生应用程序环境。NSX 专注于为具有异…

【SPSS】两配对样本T检验分析详细操作教程(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【微服务】-认识微服务

目录 1.1 单体、分布式、集群 单体 分布式 集群 1.2 系统架构演变 1.2.1 单体应⽤架构 1.2.2 垂直应⽤架构 1.2.3 分布式架构 1.2.4 SOA架构 1.2.5 微服务架构 1.3 微服务架构介绍 微服务架构的常⻅问题 1.4 SpringCloud介绍 1.4.1 SpringBoot和SpringCloud有啥关…

【Flutter入门到进阶】Flutter基础篇---介绍与环境

1 Flutter介绍 Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量 App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux等。 Flutter基于谷歌的dart语言&#…

NLTK与StanfordNLP工具包结合使用

(一) 概述 1.NLTK NLTK是一款著名的python自然语言处理工具包&#xff0c;其内收集了NLP领域大量的公开数据集以及常用模型&#xff0c;涵盖了分词&#xff0c;词性标注&#xff0c;命名实体识别&#xff0c;句法分析&#xff0c;依存分析等各种NLP领域的子任务。 2.Stanfor…

【Linux】动静态库-概念制作

文章目录前置知识:库的命名C标准库动静态库安装C/C静态库完整的库需要的东西制作静态库制作使用一个小疑惑:制作动态库制作使用总结:前置知识: 一般库分为两种:动态库和静态库 静态库和动态库本质就是文件&#xff01;也有inode 库的命名 库文件的命名一般为: libXXXXX.so 或…

基于部标JT808的车载视频监控需求与EasyCVR视频融合平台解决方案设计

一、方案背景 众所周知&#xff0c;在TSINGSEE青犀视频解决方案中&#xff0c;EasyCVR视频智能融合共享平台主要作为视频汇聚平台使用&#xff0c;不仅能兼容安防标准协议RTSP/Onvif、国标GB28181&#xff0c;互联网直播协议RTMP&#xff0c;私有协议海康SDK、大华SDK&#xf…

谷歌seo做的外链怎样更快被semrush识别

本文主要分享做谷歌seo外链如何能让semrush工具快速的记录并能查询到。 本文由光算创作&#xff0c;有可能会被剽窃和修改&#xff0c;我们佛系对待这种行为吧。 谷歌seo做的外链怎样更快被semrush识别&#xff1f; 答案是&#xff1a;多使用semrush搜索目标网站可加速爬虫抓…

SOLIDWORKS Premium 2023 SP1.0 三维设计绘图软件

SOLIDWORKS 中文完美正式版提供广泛工具来处理最复杂的问题,并提供深层技术完成关键细节工作。新功能可助您改善产品开发流程,以更快地将创新产品投入生产。Solidworks 是达索公司最新推出的三维CAD系统,它可让设计师大大缩短产品的设计时间,让产品得以快速、高效地投向市场…

2023年/2024届 暑期实习 【汇总+更新】

文章目录百度2024届暑期实习生招聘米哈游2023春季校园招聘正式启动&#xff08;含暑期实习&#xff09;拼多多2024届暑期实习生招聘百度2024届暑期实习生招聘 百度2023届校园招聘春季补录仍在持续进行中&#xff0c;本周日&#xff08;3月5日&#xff09;截止网申&#xff0c;…

ARM基础

文章目录1.ARM成长史1.1 ARM发展的里程碑11.2 ARM发展的里程碑21.3 ARM发展的里程碑31.4 ARM发展的里程碑42.ARM的商业模式和生态系统3.先搞清楚各种版本号3.1 ARM 的型号命名问题3.2 ARM 的几种版本号3.3 ARM型号的发展历程4.SoC和CPU的区别 & 外设概念的引入4.1 SoC和CPU…

面试问到不会的技术问题?大小公司?程序员、校招面试技巧

大家好&#xff0c;欢迎来到停止重构的频道。本期我们分享一下程序员面试的相关经验。可能是3月离职高峰&#xff0c;又或者毕业生准备找工作的缘故&#xff0c;最近有一些朋友问我们关于面试方面的经验。问题五花八门&#xff1a;面试总是紧张&#xff1f;项目、工作经验怎么介…

2023功能测试真的没有出路了吗?不会自动化测试的我留下了悔恨的泪水...

直接抛出我的结论&#xff1a;手工做业务类测试&#xff0c;没有前途。10K的工资已经是天花板 个人建议赶紧从业务测试跳出来&#xff0c;立即学习代码&#xff0c;走自动化测试方向。目前趋势&#xff0c;业务测试需要用自动化做。 为了让大家能够信服我的观点&#xff0c;本…

python-爬虫-字体加密

直接点 某8网 https://*****.b*b.h*****y*8*.com/ 具体网址格式就是这样的但是为了安全起见,我就这样打码了. 抛出问题 我们看到这个号码是在页面上正常显示的 F12 又是这样就比较麻烦,不能直接获取.用requests库也是获取不到正常想要的 源码的,因为字体加密了. 查看页面源代码…

开发一个会员管理系统

背景 由于现在公司内客户量剧增&#xff0c; 简单的靠电话及笔记本记录&#xff0c;来维护客户有些困难&#xff0c;但又不想去花钱购买那些专业版的会员管理系统&#xff0c;只能自己动手撸一个相对简易的会员系统来使用了。 开发语言及使用技术 后端&#xff1a;java、mys…

滑动窗口(同向)同向双指针 leetcode713 3 1004 1234

同向双指针的理解 双指针从同一侧开始走一般是right进行无脑遍历&#xff0c;left控制边界&#xff08;导致模板化&#xff09;深刻理解题目概念以及**&#xff08;right - left 1&#xff09;** 的含义多思考画图 模板 class Solution { public:int numSubarrayProductLess…