Java中数组的定义与使用(一)「建议收藏」

Java中数组的定义与使用(一)「建议收藏」如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下:inti1,i2,i3,…i100;但是这儿时候如果按照此类方式定义就会非常麻烦,…

大家好,又见面了,我是你们的朋友全栈君。

数组的基本概念

如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下:

int i1, i2, i3, ... i100;

但是这个时候如果按照此类方式定义就会非常麻烦,因为这些变量彼此之间没有任何的关联,也就是说如果现在突然再有一个要求,要求你输出这100个变量的内容,意味着你要编写System.out.println()语句100次。

其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配,而数组的定义语法有如下两类。

  • 数组动态初始化:
    • 声明并开辟数组:
      • 数据类型 [] 数组名称 = new 数据类型[长度];
      • 数据类型 [] 数组名称 = new 数据类型[长度];
    • 分布进行数组空间开辟(实例化)
      | Tables | Are |
      | ————- |:————-?
      | 声明数组: | 数组类型 数组名称[] = null; | | | 数组类型 [] 数组名称 =null; | | 开辟数组空间: | 数组名称 =new` 数组类型[长度]; |

那么当数组开辟空间之后,就可以采用如下的方式的操作:

  • 数组的访问通过索引完成,即:“数组名称[索引]”,但是需要注意的是,数组的索引从0开始,所以索引的范围就是0 ~ 数组长度-1,例如开辟了3个空间的数组,所以可以使用的索引是:0,1,2,如果此时访问的时候超过了数组的索引范围,会产生java.lang.ArrayIndexOutOfBoundsException 异常信息;
  • 当我们数组采用动态初始化开辟空间后,数组里面的每一个元素都是该数组对应数据类型的默认值;
  • 数组本身是一个有序的集合操作,所以对于数组的内容操作往往会采用循环的模式完成,数组是一个有限的数据集合,所以应该使用 for 循环。
  • Java 中提供有一种动态取得数组长度的方式:数组名称.length;

范例: 定义一个int型数组

public class ArrayDemo { 
   
	public static void main(String args[]) { 
   
		int data[] = new int[3]; /*开辟了一个长度为3的数组*/
		data[0] = 10; // 第一个元素
		data[1] = 20; // 第二个元素
		data[2] = 30; // 第三个元素
		for(int x = 0; x < data.length; x++) { 
   
			System.out.println(data[x]); //通过循环控制索引
		}
	}
}

数组本身除了声明并开辟空间之外还有另外一种开辟模式。

范例: 采用分步的模式开辟数组空间

public class ArrayDemo { 
   
	public static void main(String args[]) { 
   
		int data[] = null; 
		data = new int[3]; /*开辟了一个长度为3的数组*/
		data[0] = 10; // 第一个元素
		data[1] = 20; // 第二个元素
		data[2] = 30; // 第三个元素
		for(int x = 0; x < data.length; x++) { 
   
			System.out.println(data[x]); //通过循环控制索引
		}
	}
}

但是千万要记住,数组属于引用数据类型,所以在数组使用之前一定要开辟控件(实例化),如果使用了没有开辟空间的数组,则一定会出现 NullPointerException 异常信息:

public class ArrayDemo { 
   
	public static void main(String args[]) { 
   
		int data[] = null; 
		System.out.println(data[x]);
	}
}

这一原则和之前讲解的对象是完全相同的。

数组在开发之中一定会使用,但是像上面的操作很少。在以后的实际开发之中,会更多的使用数组概念,而直接使用,99%情况下都只是做一个 for 循环输出。

数组引用传递

既然数组属于引用数据类型,那么也一定可以发生引用传递。在这之前首先来研究一下数组的空间开辟。

范例: 观察一道程序

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = null;
		data = new int[3]; //开辟一个长度为3的数组
		data[0] = 10;
		data[1] = 20;
		data[2] = 30;
	}
}

新建数组变量

那么既然说到了引用数据类型了,就一定可以发生引用传递,而现在的引用传递的本质也一定是:同一块堆内存空间可以被不同的栈内存所指向。

范例: 定义一个程序

public class ArrayDemo { 
   
	public static void main(String args[]) { 
   
		int data[] = null;
		data = new int[3]; //开辟一个长度为3的数组
		int temp[] = null; //声明对象
		data[0] = 10;
		data[1] = 20;
		data[2] = 30;
		temp = data;  //int temp[] = data;
		temp[0] = 99;
		for(int i = 0; i < temp.length; i++) { 
   
			System.out.println(data[i]);
		}
	}
}

这里写图片描述

引用传递分析都是一个套路。同一块堆内存被不同的栈内存所指向。

数组静态初始化

在之前所进行的数组定义都有一个明显特点:数组先开辟内存空间,而后再使用索引进行内容的设置,实际上这种做法都叫做动态初始化,而如果希望数组在定义的时候可以同时出现设置内容,那么就可以采用静态初始化完成。

数组的静态初始化一共分为以下两种类型:

Tables Are
简化格式: 数据类型 数组名称 = {值, 值,…}
完整格式: 数据类型 数组名称 = new 数据类型[] {值, 值,…}

范例: 采用静态初始化定义数组

public class ArrayDemo { 
   
	public static void main(String args[]) { 
   
		int data[] = { 
   1, 2, 4, 545, 11, 32, 13131, 4444};
		for(int i = 0; i < data.length; i++) { 
   
			System.out.println(data[i]);
		}
	}
}

在开发之中,对于静态数组的初始化强烈建议使用完整语法模式,这样可以轻松地使用匿名数组这一概念。

public class ArrayDemo { 
   
	public static void main(String args[]) { 
   
		System.out.println(new int[] { 
   1, 2, 4, 545, 11, 32, 13131, 4444}.length);
	}
}

以后使用静态方式定义数组的时候一定要写上完整格式。

数组最大的缺陷:长度固定。

二维数组

在之前所使用的数组发现只需要一个索引就可以进行访问,那么这样的数组实际上非常像一个数据行的概念。

索引 0 1 2 3 4 5 6 7 8
内容 12 23 44 56 90 445 49 99 1010

现在痛过一个索引就可以取得唯一的一个记录。所以这样的数组可以简单理解为一维数组,而二维数组本质上指的是行列集合,也如果要确定某一个数据需要行索引和列索引来进行定位。

索引 0 1 2 3 4 5 6 7 8
0 12 23 44 56 90 445 49 99 1010
1 2 3 41 56 9 45 49 99 10

如果要想确定一个数据则数据使用的结构是“数组名称[行索引][列索引]”,所以这样的结构就是一个表的结构。

那么对二维数组的定义有两种声明形式:

  • 数组的动态初始化:数据类型 对象数组[][] = new 数据类型[行个数][列个数];
  • 数组的静态初始化:数据类型 对象数组[][] = new 数据类型[行个数][列个数]{
    {值, 值,…}, {值, 值,…},…};

数组的数组就是二维数组。

范例: 定义一个二维数组

public class ArrayDemo { 
   
	public static void main(String args[]) { 
   
		//此时的数组并不是一个等列数组
		int data[][] = new int[][] { 
   
			{ 
   1, 2, 3}, { 
   4, 5}, { 
   6, 7, 8, 9}};
		//如果在进行输出的时候一定要使用双重循环,
		//外部的循环控制输出的行数,而内部的循环控制输出列数
		for(int i = 0; i < data.length; i++) { 
   
			for(int j = 0; j < data[i].length; j++) { 
   
				System.out.print("data[" + i + "][" + j + "]=" + data[i][j] + "、");
			}
			System.out.println();
		}
	}
}

由于输出麻烦,所以可以忽略了,在进行开发之中,出现二位数组的几率并不高。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136927.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm中安装模块_pycharm怎么下载模块

    pycharm中安装模块_pycharm怎么下载模块pycharm如何安装python的模块包目录pycharm如何安装python的模块包1.打开Pycharm点击菜单设置2.然后进入设置界面,点击项目-》projectInterpreter3.然后点击+添加模块4.接着搜索matplotlib它会自动搜索,然后点击左下角安装,然后退出就可以了5.安装好后会自动出现这个包名假设我们安装matplotlib包1…

  • 外包公司怎么样「建议收藏」

    外包公司怎么样「建议收藏」其实大家每天心里都像明镜一样的明白“低技术含量的外包没有前途”,好多人都认为外包没有技术,其实这种思想不对,国外有大量的高端技术外包业务等着我们干,但是反问一句“你们能干吗?”,现在大部分的公司都是平均每个项目开发4个月,干完就再转一个组再做别的项目,从Java.NETCC++到你们没有听说过的RPG,一个有着7年开发经验的外包人员可以说自已会十几种开发语言做过几十个case,但是我们不…

  • pycharm的背景颜色设置_css中设置背景颜色

    pycharm的背景颜色设置_css中设置背景颜色1.打开PyCharm–>File–>Setting.2.更改为你想要的背景颜色

  • 了解DN、RDN和CN

    了解DN、RDN和CN了解DN、RDN和CNDN可以看做是到ActiveDirectory中某一对象的路径,ActiveDirectory中的每个对象都有完全唯一的DN。例如我们的用户JamesFine的DN就是”CN=JamesFine,OU=People,DC=contoso,DC=com”。实际上是这样的:DN是由对象本体开始:向上延伸到contoso.com域顶级的DNS命名空间的一串路

  • Linux下修改Mysql密码的多种方式「建议收藏」

    Linux下修改Mysql密码的多种方式「建议收藏」有时我们会忘记Mysql的密码,或者想改一个密码,以下将对这两种情况修改密码的三种解决方法做个总结本文都以用户为root为例;一、拥有原来的myql的root的密码;方法一:在mysql系统外,使用mysqladminmysqladmin-uroot-ppassword”test123″Enterpassword:【输入原来的密码】方法二:通过登录mysql系统,mysq

  • java构造函数返回值_java构造函数总结

    java构造函数返回值_java构造函数总结构造函数总结概念:创建对象时由JVM自动调用的函数作用:在创建对象的时候给对象的成员变量赋值;写法:修饰符:可以用访问权限修饰符(public、private等)修饰;不能用static修饰;返回值类型:没有返回值类型,连void都没有;函数名:必须和类名完全一样;参数列表:可以重载,具体根据要求而定;return语句:有,但是一般都不需要写;执行过程:创建对象时,JVM遇到new…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号