2021大数据学习之旅 JavaSE·数组&IDEA使用

本文详细介绍了Java中的数组,包括定义、初始化、访问、内存原理及常见问题。通过实例展示了数组的动态和静态初始化,解释了数组在内存中的存储方式,并提供了数组遍历、获取最值和翻转的操作示例。同时,提到了数组越界和空指针异常的处理。文章适合初学者,旨在帮助理解数组基础和避免常见错误。
摘要由CSDN通过智能技术生成


前言

系列文章比较适合非科班的同学, 由浅及深, 循序渐进, 从基础开始走上大数据之路

让我们一起努力, 达成目标, 实现理想

最后恳请留下你的小❤, 点赞给我一个小小的鼓励吧


一、数组的定义和访问

1.1 容器概述

案例分析

现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有50名员工,用前面所学的知识,程序首先需要声明50个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦,而且错误率也会很高。因此我们可以使用容器进行操作。将所有的数据全部存储到一个容器中,统一操作。

容器概念

  • 容器: 是将多个数据存储到一起,每个数据称为该容器的元素。
  • 生活中的容器: 水杯,衣柜,教室

1.2 数组概念

数组是存储数据的容器

特点

  • 数组的长度固定
  • 数组可以存储任意类型的数据,但是一个数组只能存储同一类型的多个数据
  • 数组有索引,从0开始,最大索引为数组的长度-1

1.3 数组的定义

方式一

数据类型 【】 变量名;

方式二

数据类型 变量名 【】;


1.4 数组的初始化

方式一:动态初始化

 	//动态初始化
 	// 数据类型 【】 变量名 = new 数据类型 【长度】;
 	int [] arr_01 = new int [3]; // 推荐
 	int arr_02 [] = new int [3];
  • 数组定义格式详解:
    • 数组存储的数据类型: 创建的数组容器可以存储什么数据类型
    • [] : 表示数组
    • 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组
    • new:关键字,创建数组使用的关键字
    • 数组存储的数据类型: 创建的数组容器可以存储什么数据类型
    • [长度]:数组的长度,表示数组容器中可以存储多少个元素
    • 注意:数组有定长特性,长度一旦指定,不可更改
      (和水杯道理相同,买了一个2升的水杯,总容量就是2升,不能多也不能少)

方式二:静态初始化

	//静态初始化
	// 数据类型 【】 变量名 = new 数据类型 【】 {元素1,元素2,...};
	// 简化写法 数据类型 【】 变量名 = {元素1,元素2,...};
	int [] arr_03 = new int [] {100,200,300};
	int [] arr_04 = {500, 600, 700};

1.5 数组的访问

索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。

数组名 【索引值】


数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1

例子:

public static void main(String[] args) {
  	int [] arr = new int [] {1,2,3,4,5};
  	//打印数组的属性,输出结果是5
  	System.out.println(arr.length);
}

索引访问数组中的元素:

  • 数组名[索引]=数值,为数组中的元素赋值
  • 变量=数组名[索引],获取出数组中的元素
public static void main(String[] args) {
    int[] arr = {1,2,3,4,5}; //定义存储int类型数组,赋值元素1,2,3,4,5
    arr[0] = 6; //为0索引元素赋值为6
    int i = arr[0]; //获取数组0索引上的元素
    System.out.println(i);
    System.out.println(arr[0]); //直接输出数组0索引元素
}


二、数组原理内存图

2.1 内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。


2.2 Java虚拟机的内存划分

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

JVM的内存划分:

区域名称作用
寄存器给CPU使用,和我们开发无关。
本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区存储可以运行的class文件。
堆内存存储对象或者数组,new来创建的,都存储在堆内存。
方法栈方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

在这里插入图片描述

  • 堆内存和方法区内存各有1个,一个线程一个栈内存
  • 方法调用的时候,该方法所需要的内存空间在栈内存中分配(压栈),执行结束后栈内存空间释放(弹栈)
  • 栈中主要存储方法体当中的局部变量
  • 方法的代码片段以及整个类的代码片段存储在方法区内存中,在类载入的时候会一同载入
  • 执行过程中使用new运算符创造的Java对象,存储在堆内存当中,对象内部有实例变量,也在堆内存当中

2.3 数组在内存中的存储

一个数组内存图

public static void main(String[] args) {
  	int[] arr = new int[3];
  	System.out.println(arr);//[I@123456a
}

以上方法执行,输出的结果是[I@123456a,这个是什么呢?是数组以16进制记录的在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。

输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素
在这里插入图片描述


两个数组内存图

public static void main(String[] args) {
    int[] arr = new int[3];
    int[] arr2 = new int[2];
    System.out.println(arr);
    System.out.println(arr2);
}

在这里插入图片描述


两个变量指向一个数组

public static void main(String[] args) {
    int[] arr = new int [] {1,2,3}; // 静态定义数组,存储3个元素
    //输出3个索引上的元素值
    System.out.println(arr[0]);
    System.out.println(arr[1]);
    System.out.println(arr[2]);
    //定义数组变量arr2,将arr的地址赋值给arr2
    int[] arr2 = arr;
    arr2[1] = 9;
    System.out.println(arr[1]);
}

在这里插入图片描述



三、数组操作的常见问题

3.1 数组越界异常

观察一下代码,运行后会出现什么结果

public static void main(String[] args) {
    int[] arr = {1,2,3};
    System.out.println(arr[3]);
}

创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。


3.2 数组空指针异常

观察一下代码,运行后会出现什么结果。

public static void main(String[] args) {
    int[] arr = {1,2,3};
    arr = null;
    System.out.println(arr[0]);

arr = null这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出NullPointerException 空指针异常。在开发中,数组的空指针异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

空指针异常在内存图中的表现
在这里插入图片描述



四、数组练习

4.1 数组遍历

数组遍历: 就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。

参考

public static void main (String[] args) {
	int [] arr = {10, 20, 30, 40, 50};
	for (int i = 0, i < arr.length; i++) {
		System.out.println (arr[i]);
	}
}

4.2 数组获取最值

最值的获取:从数组的所有元素中找出最值

实现思路

  • 定义变量,保存数组0索引上的元素,作为初始值
  • 遍历数组,获取出数组中的每个元素
  • 将遍历到的元素和保存数组0索引上值的变量进行比较
  • 如果数组元素的值大于/小于了变量的值,变量更新为新的值
  • 数组循环遍历结束,变量保存的就是数组中的最值

参考

public static void main(String[] args) {
	int[] arr = {654, 324, 54, 897, 231, 7894, 452, 1};
	int max = arr[0];
	int min = arr[0];
	for (int i = 0; i < arr.length; i++) {
		if (arr[i] > max) {
			max = arr[i];
		}
		if (arr[i] < min) { //求助,这里有没有不用两个if的判断方法
			min = arr[i];
		}
	}
	System.out.println("数组最大值是:" + max);
	System.out.println("数组最小值是:" + min);
}

4.3 数组翻转

数组翻转:将数组中的元素翻转(不借助新的数组)

实现思路

  • 直接将对应位置赋值的话,其中一个位置的数值会被覆盖
  • 找一个中间量记录数组其中一个值
  • 将对应位置的值赋值给当前位置
  • 将中间量的值赋值给对应位置
  • 数组循环遍历结束

在这里插入图片描述
参考

public static void main(String[] args) {
	int[] arr = {654, 324, 54, 897, 231, 7894, 452, 1}; //局部变量,可以自定义
	for (int i = 0; i < arr.length / 2; i++) {
		int x = arr[i];
		arr[i] = arr[arr.length - 1 - i];
		arr[arr.length - 1 - i] = x;
	}
	for (int i = 0; i < arr.length; i++) { //打印结果检查
		System.out.print(arr[i]+"  ");
	}
}


五、IDEA的安装

前往官网选择你喜欢的版本 --> 传送门:https://www.jetbrains.com/zh-cn/idea/download/other.html

安装

  1. 欢迎界面
    在这里插入图片描述
  2. 选择安装路径
    在这里插入图片描述
  3. 配置安装选项
    在这里插入图片描述
  4. 开始菜单
    在这里插入图片描述
  5. 安装完毕
    在这里插入图片描述


总结


左上角主页里面有所有系列文章喔!

消除贫穷的最好办法就是和我一起学大数据,加油,奥利给!

看到这里点个赞吧!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值