数组

文章目录

  • 数组
    • 1、数组的相关概念和名词(了解)
    • 2 、数组的相关语法
      • 2.1、 数组的声明
      • 2.2、 数组的初始化
      • 2.3、数组的遍历
      • 2.4、 数组的内存分析
    • 3、 数组的相关算法
      • 3.1、 数组找最值
      • 3.2、数组统计:求总和、均值、统计偶数个数等
      • 3.3、 反转
      • 3.4、 复制

1、数组的相关概念和名词(了解)

1、数组(array):

数组(array):简单的说,就是一组数, 一组具有相同数据类型的数,是按照一定顺序排列的集合。

当一组数据的数据类型,意义是一样的时候,那么为了方便的统一的管理它们,我们需要用新的数据的存储结构来进行存储。例如:数组。

所谓数组(Array),就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,以便统一管理他们,然后用编号区分他们,这个名字称为数组名,编号称为下标或索引(index)。
组成数组的各个变量称为数组的元素(element)。数组中元素的个数称为数组的长度(length)。

数组

  • 是一组具有相同数据类型的数据按照一定顺序排列的集合。
  • 把有限的几个相同类型的变量使用一个名称来进行统一管理。

2、数组名:

​ (1)这个数组名,代表的是一组数

​ (2)这个数组名中存储的整个数组的“首地址”

int[] scores = new int[3];
scores[0] = 100;
//数组名:例如:scores

3、下标(index):

​ 我们使用编号、索引、下标来区别表示一组数当中某一个。

​ 范围:[0,数组长度-1]

​ 例如:遍历 for(int i = 0; i<arr.length; i++){}

int[] scores = new int[3];
scores[0] = 100;
//数组名:例如:scores
//下标:范围:[0,长度-1]
//  例如:[0]

4、元素(element):

​ 这一组中的每一个数据都是元素。

​ 如何表示数组元素? 数组名[下标]

int[] scores = new int[3];
scores[0] = 100;
//数组名:例如:scores
//下标:范围:[0,长度-1]
//  例如:[0]
//元素:数组名[下标]
//  例如:scores[0]

5、数组的长度(length)

​ 数组中元素的总个数。

​ 如何获取数组长度? 数组名.length

int[] scores = new int[3];
scores[0] = 100;
//数组名:例如:scores
//下标:范围:[0,长度-1]
//  例如:[0]
//元素:数组名[下标]
//  例如:scores[0]//数组的长度:元素的总个数,可以这么表示:   数组名.length

数组、数组名、下标、元素、长度等名词了解就行,沟通的方便。

为什么要用数组呢?我用变量存储不香吗?

变量存储那么多不麻烦吗?声明、变量名、变量值,计算处理都不方便。

eg:

class Test01_Array{public static void main(String[] args){/*要存储本组学员的成绩,例如:第1组,有5个同学*//*int score1 = 100;int score2 = 90;int score3 = 80;int score4 = 70;int score5 = 60;//用5个变量存储没问题,但是如果涉及到对数据的管理:例如,求最值,排序等,就非常麻烦*/int[] scores = new int[5];//用scores这一个统一的名称,来管理5个int类型的元素scores[0] = 100;//每一个元素都有自己的下标,编号,索引scores[1] = 90;scores[2] = 80;scores[3] = 70;scores[4] = 60;// scores[6] = 50;// java.lang.ArrayIndexOutOfBoundsException:数组下标越界异常System.out.println(scores.length);for (int i = 0; i < scores.length; i++) {System.out.print(scores[i] + "\t");}}
}

Result

5
100 90  80  70  60
Process finished with exit code 0

2 、数组的相关语法

2.1、 数组的声明

语法格式:

public class Test01_Review{public static void main(String[] args){//推荐int[] arr1;//在Java中int[]是一种引用数据类型,是数组类型//也对,但是不推荐int arr2[];//最早的时候,C语言不提对象的概念,所以没有把int[]看成一种数据类型,//只是强调一组数,而最重要的是这组数据的类型是int类型//int[] arr = new int[5]{1,2,3,4,5};//错误的}
}

示例:

//要存储一组整数
int[] array;//要存储一组单字符
char[] array;//要存储一组字符串
String[] array;

数组

//数组的声明  原则:先声明后使用
//声明一个数组?
//语法格式;
//元素的数据类型[] 数组名;
class Test02_ArrayDefineAndUse{public static void main(String[] args){//(1)声明一个数组,用来存储几个学员的成绩int[] scores;//(2)初始化数组//静态初始化//数组名 = new 元素的数据类型[]{元素的值列表};scores = new int[]{89,45,67,88,90};//如果把数组的声明与静态初始化合成一句//int[] scores = new int[]{89,45,67,88,90};//甚至还可以简化://int[] scores = {89,45,67,88,90};System.out.println("数组的长度:" + scores.length);//(3)遍历数组//下标index的范围:[0,长度-1]//下标index的范围:[0,scores.length-1]for(int index = 0; index<scores.length; index++){//每一个元素,就是数组名[下标]System.out.println(scores[index]);}}
}
回忆:
变量的声明与使用
(1)变量的声明
数据类型  变量名;
(2)变量的初始化
变量名 = 变量值;声明和初始化合成一句
数据类型  变量名 = 变量初始值;

exercise

/*
2、数组的练习2:用一个数组,保存平年1-12月的满月天数,并且遍历显示结果:1月:31天2月:28天...
*/
class Test04_Exer2{public static void main(String[] args){//用一个数组,保存平年1-12月的满月天数,int[] daysOfMonth = {31,28,31,30,31,30,31,31,30,31,30,31};//并且遍历显示结果for(int i=0; i<daysOfMonth.length; i++){//            System.out.println((i+1) + "月:" + daysOfMonth[i]);System.out.print((i+1) + "月:" + daysOfMonth[i] + "\t");}}
}
/*
3、数组的练习3:用一个数组,保存星期一到星期天的7个英语单词,从键盘输入1-7,显示对应的单词
*/
class Test05_Exer3{public static void main(String[] args){//用一个数组,保存星期一到星期天的7个英语单词,String[] weeks = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};//    从键盘输入1-7,显示对应的单词java.util.Scanner input = new java.util.Scanner(System.in);System.out.print("请输入星期(1-7):");int week = input.nextInt();if(week<1 || week>7){System.out.println("输入有误!");}else{//week对应的英语单词在weeks数组中//week=1,weeks[0]//week=2,weeks[1]//...System.out.println(week+"对应的星期的单词是:" + weeks[week-1]);}//Result//请输入星期(1-7):7//7对应的星期的单词是:Sunday////Process finished with exit code 0}
}

2.2、 数组的初始化

数组初始化的目的:

(1)确定数组的长度。

(2)为元素赋值,就是确定数组的元素的值。

两种初始化方式:

1、动态初始化

语法格式:

//指定数组长度
数组名 = new 元素的数据类型[长度];//为元素赋值
数组名[下标] = 值; //这个值可以是个常量值,也可以是个表达式的计算结果,也可以是键盘输入的//如果每个元素的赋值比较有规律,通常使用for循环赋值
for(int i=0; i<长度; i++){数组名[下标] = 值;//数组名[i] = 值;
}

问:如果只指定数组长度,没有为元素手动赋值,那么元素有值吗?

有默认值

(1)基本数据类型

​ byte,short,int,long:0

​ float,double:0.0

​ char:\u0000

​ boolean:false

(2)引用数据类型

​ 统统都是null

没有为元素手动赋值,那么元素有值吗?

有默认值

基本的 0,0.0,\u0000,false

引用数据类型

统统都是null的

2、静态初始化

语法格式:

数组名 = new 元素的数据类型[]{值列表};//int[] arr = new int[5]{1,2,3,4,5};//错误的//更简洁
//当声明与静态初始化一起完成时,可以简化
元素的数据类型[] 数组名 = {值列表};

静态初始化

适用场合:

​ 当数组的元素是已知的有限个时,可以使用静态初始化。

示例代码:

String[] weeks = {"monday","tuesday","wednesday","thursday","friday","saturday","sunday"};int[] daysOfMonths = {31,28,31,30,31,30,31,31,30,31,30,31};char[] letters = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

数组的元素是已知的有限个时,可以使用静态初始化。

/*
数组的定义和初始化、使用的方式二:
1、数组的声明?不变元素的数据类型[] 数组名;2、数组的初始化
(1)确定数组的长度
(2)确定数组的元素的值方式一:静态初始化数组名 = new 元素的数据类型[]{元素的值列表};说明:(1)数组的长度由{}中的值的个数决定。(2)元素的值,在{}中直接指定方式二:动态初始化数组名 = new 元素的数据类型[长度];说明:(1)数组的长度在[]指定(2)如果没有手动赋值之前,数组的元素有默认值元素是基本数据类型:byte,short,int,long:0float,double:0.0char:\u0000 字符编码为0的空字符boolean:false元素是引用数据类型:null(3)给元素手动赋值如果没有什么规律,就一个一个赋值;如果有规律,可以使用循环赋值;3、如何表示数组的长度?
数组名.length4、如何表示一个数组的元素
数组名[下标]
下标的范围:[0,长度-1]5、遍历数组
for(int i=0; i<数组的长度; i++){System.out.println(数组名[i]);
}
*/
class Test07_ArrayDefineAndUse2{public static void main(String[] args){//例如:声明一个数组,用来存储26个大写的英文字母//(1)声明数组//char[] letters;//(2)动态初始化//数组名 = new 元素的数据类型[长度];//①确定数组的长度//letters = new char[26];//可以把声明与确定数组的长度合成一句char[] letters = new char[26];//(3)遍历数组的元素for(int i=0; i<letters.length; i++){System.out.println((int)letters[i]);//发现默认值是\u0000}//②确定数组的元素的值//letters[0] = 'A';//letters[1] = 'B';//...for(int i=0; i<letters.length; i++){//数组的元素 = 值;letters[i] = (char)('A' + i);}System.out.println("-------------------------------");//(4)遍历数组的元素for(int i=0; i<letters.length; i++){System.out.println(letters[i]);//发现默认值是\u0000}}
}

2.3、数组的遍历

for循环遍历数组:

for(int i=0; i<数组名.lenght; i++){//或赋值数组名[i] = 值;//或显示System.out.println(数组名[i]);//或其他操作//例如:判断是否是偶数if(数组名[i]%2==0){//...}
}

exercise

/*
1、数组的练习
用一个数组存储本组学员的成绩,并遍历显示
(1)其中学员的人数从键盘输入
(2)学员的成绩从键盘输入
*/
class Test08_Exer4{public static void main(String[] args){/*步骤:1、先确定人数,从键盘输入2、声明并创建数组,用来存储成绩3、确定每一个成绩:为每一个元素赋值4、遍历显示*///1、先确定人数,从键盘输入java.util.Scanner input = new java.util.Scanner(System.in);System.out.print("请输入本组的人数:");int count = input.nextInt();//2、声明并创建数组,用来存储成绩//int[] scores = new int[长度];int[] scores = new int[count];//3、确定每一个成绩:为每一个元素赋值for(int i=0; i<count; i++){System.out.print("请输入第"+ (i+1) + "个学员的成绩:");//为元素赋值:为谁赋值,就把谁写在=的左边scores[i] = input.nextInt();//用键盘输入的值为元素赋值}//4、遍历显示System.out.println("本组学员的成绩如下:");for(int i=0; i<scores.length; i++){System.out.print(scores[i]+"\t");//  \t 制表符}//请输入本组的人数:5//请输入第1个学员的成绩:1//请输入第2个学员的成绩:2//请输入第3个学员的成绩:3//请输入第4个学员的成绩:4//请输入第5个学员的成绩:5//本组学员的成绩如下://1  2   3   4   5//Process finished with exit code 0}
}
/*
2、数组的练习
用一个数组存储26个英文字母的小写形式,
并遍历显示
'a'->'A’
*/
class Test09_Exer5{public static void main(String[] args){//用一个数组存储26个英文字母的小写形式//(1)声明并创建数组char[] letters = new char[26];//(2)为元素赋值,即把'a','b'等存储到letters数组中//因为有规律,所以用循环赋值for(int i=0; i<letters.length; i++){letters[i] = (char)('a' + i);}//(3)显示结果//'a'->'A’//->左边就是元素的值,右边是根据元素的值,算出来的//'a'的编码值是97,'A'编码值为65,差32//'b'的编码值是98,'B'编码值为66,差32for(int i=0; i<letters.length; i++){System.out.println(letters[i] +"->" + (char)(letters[i]-32));}//Result//a->A//b->B//c->C//d->D//e->E//f->F//g->G//h->H//i->I//j->J//k->K//l->L//m->M//n->N//o->O//p->P//q->Q//r->R//s->S//t->T//u->U//v->V//w->W//x->X//y->Y//z->Z////Process finished with exit code 0}
}

2.4、 数组的内存分析

元素是基本数据类型的一维数组内存分析:

int[] arr = {1,2,3,4,5};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hhNvIxNb-1589129384818)(imgs/1558400311779.png)]

int[] arr = new int[5];
for(int i=0; i<arr.length; i++){arr[i] = i+1;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07wK7g08-1589129384827)(imgs/1558400323314.png)]

new完有默认值的 int为0,再赋值。

栈 堆

面向对象来了 复习复习。

不断迭代的,我的笔记也要迭代,一路copy下来。

/*
数组的存储:
1、数组下标为什么从0开始?下标表示的是这个元素的位置距离首地址的偏移量
2、数组名中存储的是什么数组名中存储的是数组在堆中一整块区域的首地址
3、数组的元素如何存储在堆中,依次连续的存储的说明:
数组名,其实也是变量。回忆:
变量的声明和初始化数据类型  变量名 = 变量值;
现在:int[] array = {1,3,5,7,9};其中的 int[]也是一种数据类型,数组类型,它是一种引用数据类型引用,表示引用一个“对象”,引用堆中的一块内存Java程序是在JVM中运行,JVM中的内存最最主要的两块区域:栈和堆其中的栈就是存储我们的局部变量(现在见到的变量都是局部变量),堆中存储的是对象
*/
class Test06_ArraySaveInMemory{public static void main(String[] args){int[] array = new int[]{1,3,5,7,9};//int[] array = {1,3,5,7,9};System.out.println(array);//打印数组名//结果:[I@1b6d3586   不同的计算机不同时候运行都不一样的//这个值是,数组对象的类型@对象的hashCode编码值//其中[I,表示int[]类型//15db9742是这个数组对象的hashCode编码值,类似于每个人都有一个身份证号System.out.println(System.identityHashCode(array));//460141958}
}

3、 数组的相关算法

3.1、 数组找最值

1、数组中找最值

思路:

(1)先假设第一个元素最大/最小

(2)然后用max/min与后面的元素一一比较

示例代码:

int[] arr = {4,5,6,1,9};
//找最大值
int max = arr[0];
for(int i=1; i<arr.length; i++){if(arr[i] > max){max = arr[i];}
}

假设第一个元素max/min,不断比较,交换。

2、数组中找最值及其下标

情况一:找最值及其第一次出现的下标

思路:

(1)先假设第一个元素最大/最小

(2)然后用max/min与后面的元素一一比较

示例代码:

int[] arr = {4,5,6,1,9};
//找最大值
int max = arr[0];
int index = 0;
for(int i=1; i<arr.length; i++){if(arr[i] > max){max = arr[i];index = i;}
}

int[] arr = {4,5,6,1,9};
//找最大值
int maxIndex = 0;
for(int i=1; i<arr.length; i++){if(arr[i] > arr[maxIndex]){maxIndex = i;}
}
System.out.println("最大值:" + arr[maxIndex]);

情况二:找最值及其所有最值的下标(即可能最大值重复)

思路:

(1)先找最大值

①假设第一个元素最大

②用max与后面的元素一一比较

(2)遍历数组,看哪些元素和最大值是一样的

示例代码:

int[] arr = {4,5,6,1,9};
//找最大值
int max = arr[0];
for(int i=1; i<arr.length; i++){if(arr[i] > max){max = arr[i];}
}//遍历数组,看哪些元素和最大值是一样的
for(int i=0; i<arr.length; i++){if(max == arr[i]){System.out.print(i+"\t");}
}

3.2、数组统计:求总和、均值、统计偶数个数等

思路:遍历数组,挨个的累加,判断每一个元素

示例代码:

int[] arr = {4,5,6,1,9};
//求总和、均值
int sum = 0;//因为0加上任何数都不影响结果
for(int i=0; i<arr.length; i++){sum += arr[i];
}
double avg = (double)sum/arr.length;

示例代码2:

int[] arr = {4,5,6,1,9};//求总乘积
long result = 1;//因为1乘以任何数都不影响结果
for(int i=0; i<arr.length; i++){result *= arr[i];
}

示例代码3:

int[] arr = {4,5,6,1,9};
//统计偶数个数
int even = 0;
for(int i=0; i<arr.length; i++){if(arr[i]%2==0){even++;}
}

3.3、 反转

方法有两种:

1、借助一个新数组

2、首尾对应位置交换

第一种方式示例代码:

int[] arr = {1,2,3,4,5,6,7,8,9};//(1)先创建一个新数组
int[] newArr = new int[arr.length];//(2)复制元素
int len = arr.length;
for(int i=0; i<newArr.length; i++){newArr[i] = arr[len -1 - i];
}//(3)舍弃旧的,让arr指向新数组
arr = newArr;//这里把新数组的首地址赋值给了arr//(4)遍历显示
for(int i=0; i<arr.length; i++){System.out.println(arr[i]);
}

第二种方式示例代码:

int[] arr = {1,2,3,4,5,6,7,8,9};//(1)计算要交换的次数:  次数 = arr.length/2
//(2)首尾交换
for(int i=0; i<arr.length/2; i++){//循环的次数就是交换的次数//首  与  尾交换int temp = arr[i];arr[i] = arr[arr.length-1-i];arr[arr.length-1-i] = temp;
}//(3)遍历显示
for(int i=0; i<arr.length; i++){System.out.println(arr[i]);
}

3.4、 复制

应用场景:

1、扩容

2、备份

3、截取

示例代码:扩容

int[] arr = {1,2,3,4,5,6,7,8,9};//如果要把arr数组扩容,增加1个位置
//(1)先创建一个新数组,它的长度 = 旧数组的长度+1
int[] newArr = new int[arr.length + 1];//(2)复制元素
//注意:i<arr.length   因位arr比newArr短,避免下标越界
for(int i=0; i<arr.length; i++){newArr[i] = arr[i];
}//(3)把新元素添加到newArr的最后
newArr[newArr.length-1] = 新值;//(4)如果下面继续使用arr,可以让arr指向新数组
arr = newArr;//(4)遍历显示
for(int i=0; i<arr.length; i++){System.out.println(arr[i]);
}

示例代码:备份

int[] arr = {1,2,3,4,5,6,7,8,9};//1、创建一个长度和原来的数组一样的新数组
int[] newArr = new int[arr.length];//2、复制元素
for(int i=0; i<arr.length; i++){newArr[i] = arr[i];
}//3、遍历显示
for(int i=0; i<arr.length; i++){System.out.println(arr[i]);
}

示例代码:截取

int[] arr = {1,2,3,4,5,6,7,8,9};int start = 2;
int end = 5;//1、创建一个新数组,新数组的长度 = end-start + 1;
int[] newArr = new int[end-start+1];//2、赋值元素
for(int i=0; i<newArr.length; i++){newArr[i] = arr[start + i];
}//3、遍历显示
for(int i=0; i<newArr.length; i++){System.out.println(newArr[i]);
}

【Java】数组Array(概念、相关语法、相关算法)相关推荐

  1. Java-杂项:Java数组Array和集合List、Set、Map

    ylbtech-Java-杂项:Java数组Array和集合List.Set.Map 1.返回顶部 1. 之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊 ...

  2. java 数组中差值最大数对,[算法题] 求数组有序后相邻元素之间的最大差值

    1. 题目要求 给定无序数组(此数组是long类型的数组,但以下示例只列一些小一点的数),例如: [3, 1, 12, 9, 3, 7, 1, 4, 7, 8, 10] 求数组有序后相邻元素之间的最大 ...

  3. java 数组group by_java Group by分组算法

    package com.xrime.innerloop.method; import java.util.ArrayList; import java.util.List; /** * 分组算法 * ...

  4. .md文档是什么? 怎么打开.md文件?.md相关语法

    .md文档是什么?怎么打开.md文件?.md相关语法 .md文档是什么? 怎么打开.md文件? .md相关语法 .md文档是什么? 首先来普及一下什么是md文件, md全称markdown,markd ...

  5. java中 数组声明,java数组声明格式

    java 声明动态数组,java对象数组详解,java中声明数组,java数组声明格式 Java 中数组的声明一维数组的声明: 在 Java 中,数组是独立的对象,有自身的方法,不是变量的集合. 数组 ...

  6. concat合并的数组会有顺序么_JS数组 Array

    Array​developer.mozilla.org JS没有真正数组,数组实际上是一种特殊的对象 创建数组的方法: let arr = [1,2,3]; // let arr = new Arra ...

  7. 【java笔记】数组概念初始化及相关操作

    数组概念: 是一种容器,可以同时存放多个数据值 数组特点: 引用数据类型,类型必须统一,长度不可改变 数组的初始化: 在内存中创建一个数组,并且向其中赋予一些默认值 动态初始化 int[] num=n ...

  8. JAVA SE学习day_11:集合的相关应用、增强型for循环、foreach方法、数组与集合的相互转换

    一.集合的相关应用 1.1 将一个集合加到另一个集合上 boolean addAll(Collection c) 将给定集合中的所有元素添加到当前集合中.调用方法之后只要c1集合发生变化就返回true ...

  9. java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归...

    1.数组的概念: 一组相同类型的数据堆积在一起 2.数组的声明: 1)数据类型 [] 数组名: 2)数据类型 数组名[]:(不推荐) 注:数据类型 可以使简单数据类型,也可以使引用数据类型 简单数据类 ...

最新文章

  1. 概率论02 概率公理
  2. linux shell 报错 Syntax error: Bad for loop variable
  3. linux ubi 分区,Linux最新UBI文件系统介绍
  4. 2014年第五届蓝桥杯 - 省赛 - C/C++大学A组 - G. 蚂蚁感冒
  5. mysqlfor循环中出错继续_Python学习笔记(循环)
  6. 我的世界java版和基岩版对比_基岩版Beta1.11.0.1发布
  7. 更改IE浏览器的收藏夹位置
  8. 矩阵的逆、伪逆、左右逆
  9. 2013年7月3日星期三
  10. 如何修复VUM在客户端启用之后报数据库连接失败的问题
  11. java 数据抓取 动态获得cookies里变动的属性_Java爬取CSDN博客遇到setCookie问题
  12. ThreadPoolExecutor线程池终止
  13. mzy git学习,分支冲突,以及冲突解决(五)
  14. 微型计算机中什么是小随机储存器,随机存取存储器
  15. 五分钟学会python_果粉有福了!5分钟学会用Python统计自己最爱听的音乐
  16. C++模板-33-类模板和函数模板的区别
  17. python环境搭建和pycharm的安装配置及汉化(零基础小白版)
  18. 多方位角极化SAR数据处理与信息提取方法
  19. php 生僻字 拼音,PHP汉字转拼音(支持生僻字)
  20. [每日100问][2011-9-30]iphone开发笔记,今天你肿了么

热门文章

  1. 弹性布局的属性及使用
  2. mysql印象最深的事情_印象最深刻的一件事500字
  3. (二)TCP客户端/服务器通信------select函数
  4. Boost.Spirit.Karma 自定义directive
  5. qt项目移植报的错误和解决方法
  6. 当不小心更改了matlab工具箱的内置函数怎么办?以及matlab指定工具箱卸载
  7. libc and libc++
  8. 测试udp 端口是否开放
  9. 常垒·视频:股权投资的终极思维
  10. 无人机激光雷达的路径规划仿真