数组的定义与使用

1.数组的基本概念

(1)数组的动态初始化:

数组首先先开辟内存空间,而后再使用索引进行内容的设置,这种定义数组的方式称为动态初始化

数组是引用数据类型,存在有内存分配问题。在使用前一定要开辟空间(实例化),否则就会产生NullPoninterException

数组的动态初始化(声明并开辟数组)

数据类型[ ] 数组名 = new 数据类型[数组长度]

数组的分步初始化:

数据类型[ ] 数组名 = null;

数组名 = new 数据类型[数组长度]

当数组开辟空间之后,就可以采用如下方式对数组进行操作:

1.数组可以通过索引完成,即“数组名[索引]”;

注意:数组索引从0开始,所以索引的范围为:0——(数组长度-1)如果访问的值超过数组长度,会产生    “java.lang.ArrayIndexOutOfBoundsException”异常。

2.当数组动态初始化开辟空间后,数组中每个元素都是该数据类型的默认值。

3.数组是一个有序的集合操作,所以对于数组的内容操作往往采用循环操作(for循环)。

4.Java中可采用 数组名.length 来获取数组长度。

public class Test7 {

public static void main(String[] args){

int[] demon = new int[4];//开辟一个长度为10的整型数组

System.out.println(demon.length);//求数组的长度

demon[0] = 0;//数组的第一个元素

demon[1] = 1;

demon[2] = 2;

for(int i = 0;i < demon.length;i++){

System.out.print(" ");

System.out.print(demon[i]);//打印数组的元素

}

}

}

运次结果:10

0 1 2 0

(2)数组的动态初始化:

数组在定义的同时可以设置内容,则称为数组的静态初始化。

数据类型[] 数组名 = {值1……}

数据类型[] 数组名 = new 数据类型[] {值……}(推荐使用)

public class Test7 {

//数组静态初始化(简化格式)

public static void main(String[] args){

int[] demon1 ={2,3,5,6,9,11};

System.out.println(demon1.length);

for(int i = 0;i < demon1.length;i++){

System.out.println(demon1[i]);

}

}

}

运行结果:6

2

3

5

6

9

public class Test7 {

//数组静态初始化(完成格式)**推荐使用

public static void main(String[] args){

System.out.println(new int[]{1,2,3,4,5}.length);//匿名数组

}

}

运行结果:5

2.数组的引用传递

数组作为引用数据类型,也一定存在引用传递。

public class Test7 {

public static void main(String[] args) {

int[] demon = null ;

demon = new int[4] ;

demon[0] = 0 ; // 数组第一个元素

demon[1] = 1 ; // 数组第二个元素

demon[2] = 2 ; // 数组第三个元素

for (int i = 0; i<demon.length ; i++) {

System.out.println(demon[i]) ; // 通过循环控制索引下标更改

}

}

}

通过上述例子,我们来探讨内存分配的问题:

引用传递空间:同一块堆内存可被多个栈内存所指向。如下例:内存分析见下。

public class Test7 {

public static void main(String[] args) {

int[] demon = new int[4] ;

int[] temp = null;

System.out.println(demon.length);

demon[0] = 0 ; // 数组第一个元素

demon[1] = 1 ; // 数组第二个元素

demon[2] = 2 ; // 数组第三个元素

for (int i = 0; i<demon.length ; i++) {

System.out.println(demon[i]) ; // 通过循环控制索引下标更改

}

temp = demon;

temp[0] = 20;

System.out.println(demon[0]);

}

}

运行结果:4

0

1

2

0

20

内存分析图:

数组最大的缺陷:长度固定。

3.二维数组

二维数组(数组的数组):二维数组本质上指的就是一个行列的集合。换言之,如果要获得一个数据,既需要行索引,也需要列索引。

要获取二维数组中的元素:数组名[行索引][列索引]

二维数组的初始化:

动态初始化:

数据类型[][] 数组名 = new 数据类型[行个数][列个数]

静态初始化:

数据类型[][] 数组名 = new 数据类型[][]{{值……},……{值……}}

public class Test7 {

//二维数组

//数组并不是等列数组

public static void main(String[] args){

int[][] demon3 = new int[][]{{1,3},{5,7,9},{2,4}};

//打印二维数组要使用双重循环

for(int i = 0;i<  demon3.length;i++){

for(int j =0;j<demon3[i].length;j++){

System.out.print(demon3[i][j]+" ");

}

}

}

}

4.数组和方法的互操作

数组是引用数据类型,所有引用数据类型都可以为其设置多个栈内存所指向;所以在进行对数组的操作时,可以通过其他方式处理。

(1)方法接收数组

(2)方法返回数组

(3)方法修改数组

public class Test7 {

//数组与方法的互操作

public static void main(String[] args){

int[] demon = receive();

changeDouble(demon);

printArray(demon);//等价于 int[] temp =demon;

}

//方法接收数组组

public static int[] receive(){

return new int[]{1,27,18,21};//匿名数组

}

//方法返回数组

public static void printArray(int[] temp){

for(int i = 0;i < temp.length;i++){

System.out.println(temp[i]);

}

}

//方法改变数组

public static void changeDouble(int[] arr){

for(int j = 0;j<arr.length;j++){

arr[j] *=2;//每个数组元素扩大两倍

}

}

}

运行结果:2

54

36

42

内存分析图如下:

5.Java对数组的支持

1.对数组进行排序:

只要是基本数据类型的数组,sort方法都可以进行排序处理(升序处理)。

数组排序 : java.util.Arrays.sort(数组名称)

package test;

public class Test7 {

//java对数组的支持

public  static void main(String[] args){

int[] demon5 = new int[]{20,8,4,92,1};

char[] demon6 = new char[]{'c','D','a','g','A'};

java.util.Arrays.sort(demon5);//对整型数组排序

java.util.Arrays.sort(demon6);//对字符型数组排序

printArray(demon5);

printArray(demon6);

}

public static void printArray(int[] temp){

for(int i = 0;i < temp.length;i++){

System.out.print(temp[i]);

System.out.print(" ");

}

}

public static void printArray(char[] temp){

for(int i = 0;i < temp.length;i++){

System.out.print(temp[i]);

System.out.print(" ");

}

}

}

运行结果:1 4 8 20 92 A D a c g

 

2.实现数组的拷贝:

数组拷贝:指的是将一个数组的部分内容替换掉另一个数组的部分内容(必须是连续的)。

System.arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,拷贝长度)

public class Test7 {

//实现数组的拷贝

//实现将demon2的2-4个元素拷贝至demon1的6-8个元素位置处

public static void main(String[] args){

int[] demon1 = new int[]{1,2,3,4,5,6,7,8,9};

int[] demon2 = new int[]{9,8,7,6,5,4,3,2,1};

System.arraycopy(demon2,1,demon1,5,3);

printArray(demon1);

}

public static void printArray(int[] temp){

for(int i = 0;i < temp.length;i++){

System.out.print(temp[i]);

System.out.print(" ");

}

}

}

6.数组案例

给出以下数组,要求可以统计出该数组的最大值、最小值、平均值、总和。

0

1

2

3

4

5

6

7

8

1

4

3

4

55

77

6

9

8

(1)简单的实现方法实现

public class Test7 {

       

       public static void main(String[] args){

int[] demon = new int[]{1,4,3,4,55,77,6,9,8};

int max = demon[0];

int min = demon[0];

int sum = demon[0];

double avg = 0.0;

for(int i = 1;i< demon.length;i++){

sum += demon[i];

if(demon[i] > max){

max = demon[i];

}

if(demon[i] < min){

min = demon[i];

}

}

System.out.println("max= "+max);

System.out.println("min= "+min);

System.out.println("sum= "+sum);

System.out.println("avg= "+(1.0*sum/demon.length));

}

}

运行结果:

max= 77

min= 1

sum= 167

avg= 18.555555555555557

由上述代码可以看出:主函数中代码量大,代码比较凌乱;主方法相当于客户端调用,代码应越简单越越好。

(2)使用方法与数组互操作实现

//数组排序(数组与方法互操作)

public class Test7 {

       public static void main(String[] args){

int[] demon = new int[]{1,4,3,4,55,77,6,9,8};

maxValue(demon);

minValue(demon);

sumAndAvg(demon);

}

//求最大值

public static void maxValue(int[] temp){

int max = temp[0];

for(int i = 1;i < temp.length;i++){

if(temp[i] > max){

max = temp[i];

}

}

System.out.println("max= "+max);

}

//求最小值

public static void minValue(int[] temp){

int min = temp[0];

for(int i = 1;i < temp.length;i++){

if(temp[i] < min){

min = temp[i];

}

}

System.out.println("min= "+min);

}

//求平均值和总和

public static void sumAndAvg(int[] temp){

int sum = temp[0] ;

for(int i = 1;i < temp.length;i++){

sum += temp[i];

}

double avg = 1.0*sum/temp.length;

System.out.println("sum= "+sum);

System.out.println("avg= "+avg);

}

}

运行结果:

max= 77

min= 1

sum= 167

avg= 18.555555555555557

使用如上方式使得逻辑比较清晰,主函数中代码量减少。

7.对象数组

可以看出前面所定义的都是基本数组,对象数组往往是以引用数据类型为主的定义;对象数组中保存的内容要比普通类型多;如:接口、类。

(1)对象数组的动态初始化

类名称[ ] 对象数组名 =  new 类名称[长度]

//对象数组的动态初始化

class Person{

private String name;

private int age;

public Person(String name, int age){//构造方法

this.name = name;

this.age = age;

}

public void getPrint(){

System.out.println("姓名: "+this.name+" 年龄: "+this.age);

}

}

public class Test7 {

public static void main(String[] args){

Person[] per = new Person[3];

per[0] = new Person("张三",16);

per[1] = new Person("李四",18);

per[2] = new Person("王五",20);

for(int i = 0;i < per.length;i++){

per[i].getPrint();

}

}

}

运行结果:

姓名: 张三 年龄: 16

姓名: 李四 年龄: 18

姓名: 王五 年龄: 20

(2)对象数组的静态初始化

类名称[ ] 对象数组名 =  new 类名称[]{new 类名称()…… }

class Person{

private String name;

private int age;

public Person(String name, int age){//构造方法

this.name = name;

this.age = age;

}

public void getPrint(){

System.out.println("姓名: "+this.name+" 年龄: "+this.age);

}

}

//静态初始化

public class Test7 {

public static void main(String[] args){

Person[] per = new Person[]{

new Person("张三",16),

new Person("李四",18),

new Person("王五",20)};

for(int i = 0;i < per.length;i++){

per[i].getPrint();

}

}

}

运行结果:

姓名: 张三 年龄: 16

姓名: 李四 年龄: 18

姓名: 王五 年龄: 20

运行结果:1 3 5 7 9 2 4

Java——数组的定义与使用的更多相关文章

  1. JAVA数组的定义及用法

    数组是有序数据的集合,数组中的每一个元素具有同样的数组名和下标来唯一地确定数组中的元素. 1. 一维数组 1.1 一维数组的定义 type arrayName[]; type[] arrayName; ...

  2. java 数组声明定义 数组内存分配 数组初始化 数组引用 数组的遍历

    一,数组的定义 Java 中定义数组的语法有两种: 1. type arrayName[]; 2. type[] arrayName;type 为Java中的任意数据类型,包括基本类型和组合类型,ar ...

  3. Java数组的定义和使用

    如果希望保存一组有相同类型的数据,可以使用数组. 数组的定义和内存分配 Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName; type 为Java ...

  4. 10、Java 数组的定义和使用

    1.数组的定义 首先举一个小例自:如果你现在需要定义100个int类型的变量,那么按照前俩节的做法为: int a = 1, b=2 , c=3.......; 可以发现我们的代码特别的冗余,而且不美 ...

  5. JAVA数组的定义以及使用1

    public class HelloWorld { public static void main(String[] args){ // Scanner s = new Scanner(System. ...

  6. JAVA数组的定义方式

    JAVA中,数组有以下几种定义方式: 1.先定义数组中元素的个数,然后再进行元素赋值 int[] a=new int[2]; a[0]='a'; a[1]='b';a[2]='c'; 2.元素个数与元 ...

  7. java数组的定义

    class ArrayDome { public static void main(String[] args) { //元素类型[] 数组名 创建一个 元素类型[元素个数或数组长度] /* 需要一个 ...

  8. Java 数组的定义和遍历

    1.一维数组 数组是用来存储一组相同数据类型数据的数据结构 数组的元素可以是简单数据类型的数据,也可以是引用数据类型的数据 无论数组内容是简单类型还是引用类型,数组自己本身都是一种引用类型 每个数组元 ...

  9. java 数组的定义

    package java03; /* 数组的初始化:就是创建一个数组,并向其中古语一些默认的值 两种常见的初始化方式: 1.动态初始化(指定长度) 2.静态初始化(指定内容) 动态初始化数组格式: 数 ...

随机推荐

  1. 深入浅出:了解时序数据库 InfluxDB

    数据模型 1.时序数据的特征 时序数据应用场景就是在时间线上每个时间点都会从多个数据源涌入数据,按照连续时间的多种纬度产生大量数据,并按秒甚至毫秒计算的实时性写入存储. 传统的RDBMS数据库对写入的 ...

  2. Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存

    一. Canal 简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同 ...

  3. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  4. [Vue warn]: Unknown custom element: <sapn> - did you register the component correctly? For recursive components, make sure to provide the "name" option. found in ---> <Evaluate> at src/views/index/

    关于vue报错: [Vue warn]: Unknown custom element: <sapn> - did you register the component correctly ...

  5. 由于xftp打开target目录,导致maven编译的时候target目录无法访问,打包失败

    由于xftp打开target目录,导致maven编译的时候target目录无法访问,打包失败: 在xftp里关闭target目录就可以了...无时不在的坑

  6. JDK 之 HttpClient(jdk11)

    HttpClient 简介 java.net.http.HttpClient 是 jdk11 中正式启用的一个 http 工具类(其实早在 jdk9 的时候就已经存在了,只是处于孵化期),官方寓意为想 ...

  7. python有关于图像的深度和通道

    目录: (一)图像的深度和图像的通道  (1)图像的深度  (2)图像的通道 (二)自定义一张多通道的图片 (1)zeros 函数 (2)ones  函数 (三)自定义一张单通道的图片 (四)像素操作 ...

  8. [loj3256]火灾

    将问题差分,即求$\sum_{i=1}^{r}S_{i}(t)-\sum_{i=1}^{l-1}S_{i}(t)$,由于两者类似,不妨考虑前者 构造矩阵$A_{i,j}=S_{j}(i)-S_{j}( ...

  9. [noi31]MST

    定义dp[i]表示当前连通块状态为i的方案数(状态记录该状态每一个连通块的大小),那么从小到大枚举每条边,考虑这条边在不在最小生成树上: 1. 如果不在最小生成树上,那么这条边有$\sum_{i=1} ...

  10. CKAD认证中的部署教程

    在上一章中,我们已经学会了使用 kubeadm 创建集群和加入新的节点,在本章中,将按照 CKAD 课程的方法重新部署一遍,实际上官方教程的内容不多,笔者写了两篇类似的部署方式,如果已经部署了 kub ...