数组基本知识整理

数组的引入

数组的概念:
数组是一个容器,存放一组相同数据类型变量的容器

回顾变量的初始化
a.声明: 告诉计算机开辟多大的内存空间
b.赋值: 编译器翻译变量所对应的地址值,通过地址值,将数据保存到地址对应的位置去
c.使用: 读取变量对应的地址,取出数值使用

数组
a.声明:告诉计算机开辟多大的连续的内存空间
b.赋值: 系统会默认赋值也可以自己赋值
c.使用

初始化格式
数据类型[] 数组名 = new 数据类型[数组的大小];
数据类型可以是八大基本数据类型,也可以是引用类型
数组名满足变量的命名规则,一般都是复数
new 开辟内存空间,在堆区开辟空间
数组大小: 容器的大小

访问数组中的元素:
数组名[下标/索引];
下标从0开始~数组的长度-1
java.lang.ArrayIndexOutOfBoundsException: 3
异常名称: 数组越界
产生原因: 访问数组的下标不在 0~数组的长度-1之间
解决办法: 检查范围

java.lang.NullPointerException
异常名称: 空指针异常
产生原因: 对象没有new,就访问对象成员
解决办法: 找对null值对象并且创建对象

数组的内存分析
声明一个变量就是在内存空间划出一块合适的空间,类似声明一个数组就是在内存空间划出一串连续的空间
在这里插入图片描述
这里需要注意的是:
1.标识符:数组的名称,用于区分不同的数组
2.数组元素:在数组中存放的数据
3.元素下标:对元素进行编号,从零开始,数组中的每个元素都可以通过下标来访问
4.元素类型:数组元素的数据类型

数组的特点

	a.数组本身也是一个变量,既然是变量(局部变量),那么在栈区开辟空间,先声明再赋值再使用
	b.数组的数据类型可以是八大基本数据类型和引用类型,数组本身是引用类型
	c.创建数组我们需要使用到new,那么new出来的在堆区开辟,所以数组会同时在栈区和堆区开辟空间
	d.如果一个数组没有指向堆区某块内存地址,这个时候数组变量为null,如果使用这个变量会出现空指针异常
	e.如果一个数组访问了不存在的索引,会出现数组越界

数组的使用

声明数组
作用:告诉计算机数据类型是什么
格式:
数据类型 数组名[ ] ;
数据类型[ ] 数组名 ; (推荐格式)
注意:声明数组时不规定数组长度
例子:
int[ ] score1; //Java成绩
int score2[ ]; //android成绩
String[ ] name; //学生姓名

数组的初始化

数组的初始化
静态初始化
		格式一: 数据类型[] 数组名 = {元素1,元素2,元素3,元素4,元素5,...元素n};
		格式二: 数据类型[] 数组名 = new int[]{元素1,元素2,元素3,元素4,元素5,...元素n};
	动态初始化
		数据类型[] 数组名 = new 数据类型[数组的大小];
		可以采用以下三种方式初始化
	1.逐个初始化
		2.通过键盘输入
		3.通过随机数初始化

静态初始化和动态初始化的区别?
静态初始化: 初始化的同时为每一个元素给出初始值,不需要指定数组的长度,系统会根据元素的个数去动态计算数组的长度
动态初始化: 初始化的系统来为数组赋初始值,默认值是堆区的特点的默认值,但是必须由我们指定数组的长度
当形式参数是引用类型的时候的传递过程
八大基本类型传递满足类型转换
引用类型
数组

接口

值传递和引用传递
1.值传递的本质传递的是数值本身,引用传递的本质传递的是地址
2.如果传递的是地址,那么通过地址改变了堆区空间的数值,将会影响到所有指向该堆区的引用

分配空间
作用:告诉计算机分配几个连续的空间
格式:数据类型[ ] 数组名 = new 数据类型[大小] ;
声明数组并分配空间
例子:
1.score = new int[30]; 内存图如下:
在这里插入图片描述
2.avgAge = new int[6];
3.name = new String[30];
赋值
作用:向分配的格子里放数据
例子:score[0] = 89;
score[1] = 79;
score[2] = 76;
在这里插入图片描述
这种方式复制太慢
快速赋值法:
方法1: 边声明边赋值
int[ ] score = {89, 79, 76};
int[ ] score = new int[ ]{89, 79, 76};
注意:这里右边不能声明数组的长度
方法2:动态地从键盘录入信息并赋值
Scanner input = new Scanner(System.in);
for(int i = 0; i < 30; i ++){
score[i] = input.nextInt();
}
处理数据
计算5位学生的平均分
定义这样个数组:
int [ ] score = {60, 80, 90, 70, 85}; 内存中结构如下图:
在这里插入图片描述
方式一:通过数组下表直接访问
double avg;
avg = (score[0] + score[1] + score[2] + score[3] + score[4])/5;
方式二:数组的length属性
int sum = 0;
double avg;
for(int i = 0; i < score.length; i++){
sum = sum + score[i];
}
avg = sum / score.length;

数组常见错误

1.编译出错,没有写明数组的大小
2.编译出错,数组越界
3.编译出错,创建数组并赋值的方式必须在一条语句中完成

数组内存图
在这里插入图片描述
1.类加载
2.JVM调用main()方法

数组的内存分配

	内存分为:
		a.栈区: 先进后出,类似于子弹夹,一般用来给局部变量开辟空间
		b.堆区: 用于存储new出来的对象
			堆区创建出来的对象都会有地址值,而数组变量就是用来存放这个地址的
			凡事new出来的对象都有默认值
				byte short int long 0
				float double 0.0
				char '\u0000'
				boolean false
				引用类型 null
			堆区一旦被赋值为null的时候,原来的内存空间不会被立刻回收,而是在垃圾回收器空闲的时候回收
				int[] arr = new int[5];
				arr = null;
		c.方法区
			静态区
			常量池

数组的遍历
遍历: 获取数组中的每一个元素

public static void printArr(int[] arr){
			for(int i= 0; i < arr.length; i++){
				System.out.println(ar[i]);
			}
		}

数组的动态快速初始化 (键盘输入 + 数组的动态初始化 + 数组的遍历)

Scanner input = new Scanner(System.in);
		System.out.println("请输入学生的人数:");
		double num = input.nextDouble();
		double[] arr = new double[num];
		for(int i = 0; i < arr.length; i++){
			System.out.print("请输入第" + (i+1) + "个学生的成绩");
			arr[i] = input.nextDouble();
		}
		input.close();

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSP(China Standardized Programming Contest)初赛是中国计算机学会主办的一项编程竞赛,旨在选拔优秀的程序设计人才。为了帮助参赛者更好地备战CSP初赛,以下是一些基础知识的整理: 1. 编程语言:CSP初赛一般使用C++、Java或Python作为编程语言。掌握其中一种语言的基本语法和常用库函数是必要的。 2. 数据结构与算法:CSP初赛注重对数据结构和算法的理解和应用。常见的数据结构包括数组、链表、栈、队列、树、图等;常见的算法包括搜索、排序、贪心、动态规划等。熟悉各种数据结构和算法的原理和实现方法是必备的基础知识。 3. 输入输出:CSP初赛中,对于输入输出格式的处理要求较高。需要学会读取和解析标准输入、标准输出,以及处理文件输入输出。 4. 数学知识:CSP初赛中会涉及一些基本的数学知识,如数论、概率论、统计学等。了解相关概念和公式,并能够应用到具体问题中是必要的。 5. 算法设计与分析:CSP初赛会考察参赛选手的算法设计能力和问题分析能力。需要能够独立思考问题,设计出高效的算法,并分析算法的时间复杂度和空间复杂度。 6. 编程技巧:在CSP初赛中,高效的编程技巧往往能够提高代码的质量和效率。例如,合理使用数据结构、优化算法、处理边界情况等。 以上是CSP初赛基础知识的整理,希望对您备战CSP初赛有所帮助。祝您取得好成绩!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值