一.数组—引用数据类型<堆>
自恋的老司机说有点难,所以我的小可爱们要认真仔细的学哦!
ok ,那就一起来看一下我们今天要学一些什么
按照惯例,我们一起来看一下本章目标:
-
理解数组的作用
-
掌握数组的定义
-
掌握数组的基本使用
-
掌握数组的常用操作:求:最大/小值、排序等。
1.理解数组的作用
什么是数组?
有限个相同类型的变量所组成的一个集合,数组中的每个变量可以成为一个元素,数组在内存中是顺序存储的,需要开辟连续的内存空间.
2.数组的定义
- Java 语言中提供的数组是用来存储固定大小的同类型元素。
- 数组属引用数据类型 ,它的数据是存储在jvm中的堆中的。基本数据类型一般都是存储在栈中。
那说了这么多,这个数组到底是干什么的呢?他能帮助我们做些什么? 他和变量有什么区别?
如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下:
int i1, i2, i3, ... i100;
但是这个时候如果按照此类方式定义就会非常麻烦,因为这些变量彼此之间没有任何的关联,也就是说如果现在突然再有一个要求,要求你输出这100个变量的内容,意味着你要编写System.out.println()语句100次。
其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配,而数组的定义语法有如下两类。
3.掌握数组的基本使用
变量:
-
数据类型
-
数组名(变量名)
-
变量值
数组:
-
数据类型
-
数组的长度( 一个数组定义了长度就无法更改)
-
数组的元素 数组元素不赋值也有默认值
String等引用数据类型默认值为:null (表示没有引用)
-
数组的下标(索引)
ps:数组的访问通过索引完成,即:“数组名称[索引]”,但是需要注意的是,数组的索引从
0
开始,所以索引的范围就是0 ~ 数组长度-1,例如开辟了3个空间的数组,所以可以使用的索引是:0,1,2,
如果此时访问的时候超过了数组的索引范围,会产生java.lang.ArrayIndexOutOfBoundsException
(数据的索引越界)异常信息;两类语法:
数据类型[] 数组名 = new 数据类型[数组长度];
数据类型[] 数组名 = new {元素1,元素2,元素3...};
数组中元素的表示方法
想要访问数组里的元素,可以利用索引来完成。Java的数组索引编号由0开始,以一个的score[10]的整形数组为例,score[0]代表第1个元素,score[1]代表第2个元素,score[9]为数组中第10个元素(也就是最后一个元素)。
第一种语法:数据类型[] 数组名 = new 数据类型[数组长度];
public class Test
{
public static void main(String[] args)
{
int[] arr = new int [5];
arr[0] = 0;
arr[1] = 1;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
// 利用循环实处每一个元素的值
for(int i = 0;i < arr.length;i++)//数组名.length就是数组长度
{
System.out.print(arr[i]+" ");
}
}
}
第二种语法:数据类型[] 数组名 = new {元素1,元素2,元素3...};
public class Test
{
public static void main(String[] args)
{
int[] arr2 = new int []{1,2,3,4,5};//
}
}
掌握了数组的俩种语法,有聪明可爱的同学就想到了,我如果想要获取数组中的所有数据该怎么做呢?
获取数组中的所有数据:(遍历)
// 定义数组
double[] scores = {90,80,70,77,66};
// 遍历数组
// scores[0];
// scores[1];
// scores[2];
for(int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}
4.掌握数组的常用操作
4.1求一个班的成绩总和和平均分
需求: 求每个班的平均分 每个班的成绩和 以及班级成绩总和。
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
// 创建
Scanner input = new Scanner(System.in);
// 存储数据
int[][] array = new int[3][3];
// 定义三个班总和
int total = 0;
for(int i = 0; i < array.length;i++) {
System.out.println((i+1) + "班的成绩");
// 定义每个班的总和
int sum = 0;
// 定义平均数
int avg = 0;
for(int j = 0;j < array[i].length;j++) {
System.out.print("请输入第" +(j+1)+"名学生的成绩:");
array[i][j] = input.nextInt();
// 班级成绩总和
sum += array[i][j];
avg = sum / array[i].length;
total += array[i][j];
}
System.out.println("第"+(i+1)+"个班的成绩总和是:"+sum);
System.out.println("第"+(i+1)+"个班的平均成绩是:"+avg);
}
System.out.println(array.length + "个班级的成绩总和:"+ total);
}
}
4.2求最大值最小值
默认最大值是第一个元素
默认最小值也是第一个元素
遍历数组元素比较数组元素的值和默认的最大值,如果数组元素的值比默认最大值还要大 ,则用数组元素的值作为默认的最大值, 这样遍历一遍之后就可以求出最大值了.求最小值也是同样.
public class MaxAndMin {
public static void main(String[] args) {
int[] array={1,3,67,34,23,89,56,34,21};//定义数组
System.out.println("----------方法1:-----------");
int max=array[0];//默认第一个最大
int min=array[0];//默认第一个最小
for(int i=1;i<array.length;i++)
{
if(array[i]>max)
{
max=array[i];//如果有比max大的数就让max记录下大的数
}
if(array[i]<min)
{
min=array[i];//如果有比min小的数就让min记录下小的数
}
}
System.out.println("max="+max);
System.out.println("min="+min);
二.多重数组和冒泡排序
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组
多维数组: 在Java的内存模型并不存在多维数组,但是语法层面上支持。 意味着本质上还是一个一维数组。
1.引用数据类新的名称来源
Java中的数据类型分类:
- 基本数据类型: 数据存储是在栈中的(栈中数据线程不共享,独立的)
- 数值型:
- 整数型 byte short int long
- 浮点型 float double
- 非数值型 char boolean
- 数值型:
- 引用数据类型: 数据存储是在堆中的(堆中数据线程共享) 为了更好的利用我们的数据而提出的概念。
- 数组、类(String就是一个类)、接口、枚举…
2.二维数组语法
二维数组的初始化:直接为每一维分配空间
1.元素类型 变量名 = new 元素类型[行数][列数];
声明整型数组score,同时为其开辟一块内存空间:
例子:
int[][] score = new int[4][3];
小口诀:外层循环控制行数 内层循环控制每行的内容。
public class Test {
public static void main(String[] args) {
int score[][] = new int[4][3]; // 声明并实例化二维数组
score[0][1] = 30 ; // 为数组中的部分内容赋值
score[1][0] = 31 ; // 为数组中的部分内容赋值
score[2][2] = 32 ; // 为数组中的部分内容赋值
score[3][1] = 33 ; // 为数组中的部分内容赋值
score[1][1] = 30 ; // 为数组中的部分内容赋值
for (int i = 0; i < score.length; i++) { // 外层循环行
for(int j=0;j<score[i].length;j++){// 内层循环列
System.out.print(score[i][j] + "\t");
}
System.out.println("") ; // 换行
}
}
输出的结构为:
0 30 0
31 30 0
0 0 32
0 33 0
2.元素类型 变量名 = {{元素A1,元素A2...}, {元素B1,元素B2}...};
列子:
int score[][] = {{ 67, 61 }, { 78, 89, 83 }, { 99, 100, 98, 66, 95 }};
public class Test {
public static void main(String[] args) {
// 初始化一个二维数组,每行的数组元素个数不一样
int[][] score = {{ 67, 61 }, { 78, 89, 83 }, { 99, 100, 98, 66, 95 }};
for (int i = 0; i < score.length; i++) { // 外层循环输出行
for (int j = 0; j < score[i].length; j++) {// 内存循环输出列
System.out.print(score[i][j] + "\t");// 输出每一个元素
}
System.out.println(""); // 换行
}
}
输出结果:
67 61
78 89 83
99 100 98 66 95
3.Arrays类的使用
Arrays类的定义
Arrays是java.util.Arrays;包下的类,主要是对数组进行操作的。
常用方法
1.equals(数组1,数组2); 比较两个数组是否相等。如:
int[] a = {1,2,3,4};
int[] b = {1,2,3,4};
System.out.println(Arrays.equals(a,b));
返回值:true
2.sort(数组名);对数组进行升序排列。 如
int[] a = {100,20,345,4,454};
Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+"\t");
}
返回值:4 20 100 345 454
-
toString(); 将数组转变为字符串。 如:
int[] a = {1,2,3,4,5,6}; System.out.println(a); //输出数组所在地址 System.out.println(Arrays.toString(a));
返回值:[1, 2, 3, 4, 5, 6]
4. 掌握冒泡排序[难点-算法]
冒泡排序的基本思想是:对比相邻的元素值,如果满足条件就交换元素值,把较小的元素值移动到数组前面,把大的元素值移动到数组后面(也就是交换两个元素的位置),这样数组元素就像气泡一样从底部上升到顶部。
伟大的老司机说:
外层循环控制行数 内层循环控制每行的内容。
外层循环控制轮数,内层循环控制每轮的比较。
// 定义一个数组 存储原始数据
int[] arr = {99,77,88,92,30,22,90,78};
// 冒泡排序:外层循环n-1 内层循环n-1-i
// 外层循环控制轮数 规律:5个数据则比较4轮 6个数据则比较5轮
for(int i = 0; i < arr.length-1; i++) {
// 内层循环控制每轮的比较 规律:5个数据第一轮比较4次 6个数据第一轮比较5次
for(int j = 0; j < arr.length-1-i; j++) {
// 循环操作:相邻元素做比较 两两比较小靠前
if(arr[j] > arr[j+1]) {
// 借助一个临时的空间实现数据交换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
我的小可爱们,这篇笔记有些赶,并不是很详细和严谨
这都是我自己的过失,记完笔记没有及时的整理并上穿
我们的老司机今天要检查,希望他不会抽到我
哦吼,哈哈哈哈哈哈
我深刻的 检讨,老司机讲完我会迅速的整理并上传
为了我的小可爱,为了我的粉丝(虽然粉丝是同学互粉,哈哈哈哈哈)