【重学Javase】—— 数组(从头剖析一维数组,二维数组,array常用工具类以及数组的两种常见异常)

news2024/11/25 14:29:57

 目录

数组的概述

1、数组的理解:

2、数组的特点:

3、数组的分类:

一维数组

1、一维数组的声明与初始化

2、一维数组元素的引用:通过角标的方式调用

3、数组的属性:length

4、一维数组的遍历(for循环)

5、一维数组元素的默认初始化值

6、一维数组的内存解析

二维数组

1、如何理解二维数组?

2、二维数组的声明与初始化

3、特殊写法: 

4、多维数组的使用​编辑

5、二维数组内存解析​编辑

 6、复制与赋值

Arrays工具类的使用

数组排序

数组使用中的常见异常

数组脚标越界异常(ArrayIndexOutOfBoundsException)

空指针异常(NullPointerException)

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                 ——By 作者:大耳朵宋宋 


数组的概述

1、数组的理解

是多个相同类型数据按一定顺序排列的集合, 并使用一个名字(数组名)命名, 并通过编号(下标)的方式,对这些数据进行统一管理。其中,数组中元素的个数称为数组长度。

2、数组的特点:

  1. 数组是序排列的
  2. 数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型(int,double,char……),也可以是引用数据类型(string)
  3. 创建数组对象会在内存中开辟一整块连续的空间, 而数组名中引用的是这块连续空间的首地址。
  4. 数组的长度一旦确定,就不能修改。

3、数组的分类:

 ① 照维数:一维数组、二维数组、。。。
 ② 照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组


一维数组

1、一维数组的声明与初始化

        一维数组的声明方式:
        type var[] 或 type[] var;

Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法

        int num;//声明
		num = 10;//初始化
		int id = 1001;//声明 + 初始化
		
		int[] ids;//声明
		//1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行
		ids = new int[]{1001,1002,1003,1004};
		//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
		String[] names = new String[5];

	    int[] arr4 = {1,2,3,4,5};//类型推断


//错误的方式:
//		int[] arr1 = new int[];
//		int[5] arr2 = new int[5];
//		int[] arr3 = new int[3]{1,2,3};

2、一维数组元素的引用:通过角标的方式调用

定义并用运算符new为之分配空间后,才可以引用数组中的每个元素,否则会报“空指针异常”

        数组的角标(或索引从0开始的,到数组的长度-1结束)

    ids[0] = 1;
    ids[1] = 2;
    ids[2] = 3;
//这里[]里面的就叫做数组的下标

3、数组的属性:length

        每个数组都有一个属性length指明它的长度,例如: a.length 指明数组a的长度(元素个数)

System.out.println(names.length);//5
System.out.println(ids.length);//3

注意: 

        这里的数组一旦初始化之后,其长度就是确定的。

                数组名.length

        数组长度一旦确定,就不可修改。

4、一维数组的遍历(for循环)

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


5、一维数组元素的默认初始化值

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

  •     > 数组元素是整型:                0
  •     > 数组元素是浮点型:           0.0
  •     > 数组元素是char型:    0或'\u0000',而非'0'
  •     > 数组元素是boolean型:     false
  •     > 数组元素是引用数据类型: null

6、一维数组的内存解析

内存布局

 数组名和地址会存放在栈区,而数组是在堆区,如果是String型的话,是会被放在常量区


二维数组

1、如何理解二维数组?

数组属于引用数据类型,数组的元素也可以是引用数据类型;

一个一维数组arr的元素如果还是一个一维数组类型的,则此数组称为二维数组。

对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实, 从数组底层的运行机制来看,其实没有多维数组。

2、二维数组的声明与初始化

        int[] arr = new int[]{1,2,3};//一维数组

		//静态初始化
		int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};

		//动态初始化1
		String[][] arr2 = new String[3][2];

		//动态初始化2
		String[][] arr3 = new String[3][];//可以省略列数,但是不能省略行数
            //二维数组中有3个一维数组。
            //每个一维数组都是默认初始化值null (注意:区别于格式1)
            //可以对这个三个一维数组分别进行初始化
            //arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
        
	    //自动类型推断(也是正确的写法)
		int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
		int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};//类型推断

3、特殊写法: 

一维数组:int[] x,int x[]

二维数组:int[][] y , int[] y[] , int y[][]

4、多维数组的使用

5、二维数组内存解析

 6、复制与赋值

我们先来看一串代码:

int[] array1, array2;
array1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };
array2 = array1;

很明显,这里是属于赋值 ,内存里面array1和array2指向的是同一块内存(创建快捷方式)

赋值过程中要么类型相同,要么有自动类型提升的操作,否则会报错。


Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类, 包含了用来操作数组(比如排序和搜索) 的各种方法。

数组排序

java.util.Arrays类的sort()方法提供了数组元素排序功能:
 

import java.util.Arrays;
public class SortTest {
    public static void main(String[] args) {
        int [] numbers = {5,900,1,5,77,30,64,700};
        Arrays.sort(numbers);
        for(int i = 0; i < numbers.length; i++){
            System.out.println(numbers[i]);
        }
    }
}

数组使用中的常见异常

数组脚标越界异常(ArrayIndexOutOfBoundsException)

        int[] arr = new int[2];
        System.out.println(arr[2]);
        System.out.println(arr[-1]);
访问到了数组中的不存在的脚标时发生。(0 ~ arr.length-1)

空指针异常(NullPointerException)

        int[] arr = null;
        System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时调用

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                 ——By 作者:大耳朵宋宋 

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

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

相关文章

mysql 备份还原数据库,java使用Runtime对象执行mysqldump备份数据库

为了提高系统可用性,通过java写定时任务每天晚上定时备份mysql数据库,然后把备份的.sql文件(建议在压缩一次上传,减少文件体积提高传输效率)调用文件上传服务器提供的文件上传接口上传到文件服务器,达到数据库服务器损坏后快速还原数据库的目的。以windows系统为例。linux注…

high-resolution image synthesis with latent diffusion models

如何通俗理解扩散模型&#xff1f; - 知乎泻药。实验室最近人人都在做扩散&#xff0c;从连续到离散&#xff0c;从CV到NLP&#xff0c;基本上都被diffusion洗了一遍。但是观察发现&#xff0c;里面的数学基础并不是模型应用的必须。其实大部分的研究者都不需要理解扩散模型的数…

理解linux虚拟网络设备veth

理解linux虚拟网络设备veth 上一章介绍了linux network namespace,接着来讨论一下如何让一个独立的网络命名空间的和主机的网络相互通信,这里我们需要用到linux虚拟网络设备veth。 veth设备 veth设备总是成对出现,通常就是用来连接不同网络命名空间(下面开始简称…

基于线性表的图书管理系统实验报告

目录 基于线性表的图书管理系统实验报告 1、成员分工 2、数据字典 3、抽象数据类型定义 4、图书存储结构描述 5、基本操作的算法描述 6、测试 6.1测试数据集 6.2测试程序运行结果截图 7、存在的问题与思考 基于线性表的图书管理系统实验报告 组长&#xff1a;xxx 组…

2022年学习机器人和人工智能的一些体会

前些日子开会&#xff0c;很受启发&#xff0c;比如有大佬指出&#xff1a; 总结&#xff1a;一般是高屋建瓴&#xff0c;通常是级别高的总揽全局&#xff0c;小虾虾不适用&#xff1b;感想和体会&#xff1a;小虾虾们学习完大佬讲话之后&#xff0c;自己的收获。 这才发现写博…

CRM能给企业带来什么价值

对于任何企业而言&#xff0c;客户都是企业生存下去的根本&#xff0c;管理客户也是企业一直在做的事情&#xff0c;有的企业尝试采用CRM来管理客户&#xff0c;有的企业还在观望CRM能给企业带来什么价值。 前言 对于任何企业而言&#xff0c;客户都是企业生存下去的根本&…

如何增加3d渲染的逼真感?提高3d渲染真实感的技巧

照片写实主义是一种艺术&#xff0c;它需要图形媒体来创造独特的艺术品&#xff0c;看起来非常有说服力。专业艺术家研究图像并使用照片写实技术从中创作艺术品。真实感可以在 2D 和 3D 渲染中实现&#xff0c;该过程称为真实感渲染。专业人士倾向于使用智能渲染过程&#xff0…

管理员权限功能和开机自启功能

前言 开机启动功能在Window下是很重要的一个功能&#xff0c;很多程序它都需要这样的功能 一.VS的配置选项&#xff08;以管理员权限启动程序&#xff09; 作用&#xff1a;用户在点击任务栏窗口等需要管理员权限时不会没有响应。 二.开机自启动&#xff08;注册表&#xff…

解决Navicat打开表的速度慢的问题

前言 最近使用Navicat打开表或者设计表都很慢&#xff0c;需要等十几秒才能打开&#xff0c;一开始我以为是我电脑老了&#xff0c;配置比较差&#xff0c;慢点就慢点吧&#xff0c;好像慢的也比较合理&#xff0c;想到这里我也就没有追究先忍了。 但是这几天公司给我配置的新…

PriorityQueue详解

目录标题前言PriorityQueue特点API构造操作API底层显示&#xff1a;数组offer(E e)前言 PriorityQueue是优先队列&#xff0c;作用是保证每次取出的元素都是队列中权值最小的&#xff0c;这里涉及到了大小关系&#xff0c;元素大小的评判可以通过元素自身的自然顺序&#xff0…

手把手教你搭建环境和内核编译

环境搭建--安装Debian7.3 本系列文章假设读者已对linux有一定的了解&#xff0c;其实学习linux内核不需要有很深的关于linux的知识&#xff0c;只需要了解以下内容&#xff1a;linux基础知识及基本shell命令&#xff1b;现代操作系统的基本概念&#xff1b;C语言和gcc基本使用…

Python操作数据库及Python实现mysql数据库连接池源代码

简介 pymysql&#xff1a;纯Python实现的一个驱动。因为是纯Python编写的&#xff0c;因此执行效率不如MySQL-python。并且也因为是纯Python编写的&#xff0c;因此可以和Python代码无缝衔接。 MySQL Connector/Python&#xff1a;MySQL官方推出的使用纯Python连接MySQL的驱动…

react-router-dom v6.5.0实现路由守卫RouterBeforeEach及缓存

一、概述 最近留意下react-router-dom有更新到6.6.1的版本&#xff0c;在这个版本增加了不少的功能。研究了下&#xff0c;可以利用其提供的API实现一个类似Vue的路由守卫&#xff0c;从而简便达到路由鉴权的业务场景。这里我是使用npm的包&#xff0c;是react-router-dom v6.5…

leetcode 124. 二叉树中的最大路径和-java题解

题目所属分类 二叉树的最大值 dfs 原题链接 路径 被定义为一条从树中任意节点出发&#xff0c;沿父节点-子节点连接&#xff0c;达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中…

Web Services 基于Apache Axis2 生成客户端代码示例

webservice 一种古老的技术&#xff0c;现在基本上已经弃用&#xff0c;但也有许多古董项目在用&#xff0c;整理并记录下自己的使用过程&#xff0c;避免更多的人踩坑。 Web Services 生成客户端代码步骤1 Apache Axis2下载安装1.1 认识Apache Axis21.2 下载Apache Axis22 通过…

当地的新员工入职培训

香港 (Xinwengao.com) — 在中国生活和工作的所有外国人都面临文化冲击。在他们的入职前期&#xff0c;学校管理层通常会让他们接受广泛的入职培训。这些培训项目旨在为外籍教师提供文化和专业培训。在外籍教师开始他们的教学之旅之前&#xff0c;向他们灌输文化同理心的美德非…

天气后报网爬虫及数据分析(python)

从天气后报网&#xff08;http://www.tianqihoubao.com&#xff09;中爬取绵阳市某一年的历史天气信息&#xff0c;包括每天最高气温、最低气温、天气状况、风向等&#xff0c;完成以下功能&#xff1a; &#xff08;1&#xff09;将获取的数据信息存储到“data.csv”文件中&a…

微服务(三)——远程调用

目录前言1. RestTemplate1. 导入依赖2. 代码3. 常用方法2. jodd-http1. 引入依赖2. 代码3. 测试3. Feign1. 引入依赖2. 使用过程3. 自定义配置4. 优化前言 微服务都是独立部署的&#xff0c;要实现一个业务可能需要多个服务之间的通信&#xff0c;所以远程调用必不可少&#x…

html标签分类及其他知识

1、标签按照类型可以划分为三种类型&#xff1a; block&#xff1a;div、p、ul、li、h1… 1、独占一行2、支持所有样式3、不写宽的时候&#xff0c;跟父元素的宽相同4、所占区域是一个矩形 inline&#xff1a;span、a、em、strong、img… 1、挨在一起2、有些样式不支持&#x…

编译原理——求后缀表达式、三元式、四元式

一、求后缀表达式 可能就是一填空题&#xff0c;考试应该也不会太复杂&#xff0c;要会&#xff0c;掌握着由外到内求解思想即可&#xff1b; 其实就是二叉树的后序遍历&#xff0c;左右根&#xff1b;拆分的顺序就是由左到右顺序进行&#xff0c;小括号内的最后拆&#xff0…