Java由浅入深学习数组的使用

目录
  • 一、前言
  • 二、数组的定义
    • 1.概述
    • 2.静态初始化数组
    • 3.动态初始化数组
    • 4.总结
  • 三、数组的属性
    • 1.访问
    • 2.长度
    • 3.遍历
  • 四、内存图
    • 1.单数组内存图
    • 2.多数组内存图
    • 3.数组指向相同内存
  • 五、常见问题
    • 1.索引越界
    • 2.空指针异常

一、前言

学习概述:前八天我们学习了语法基础、运算符与表达式、循环结构、分支结构,今天主要学习数组的定义、相关的属性方法、数组存储的内存图、常见错误

学习目标:掌握数组的两种定义方法、相关属性、了解内存原理、错误解决

二、数组的定义

1.概述

假如有一个班同学的成绩需要存储,该使用什么方法呢?

像我们之前学习的,可以定义多个变量存储不同的成绩。但是要有1000多个学生,那么到定义1000多个变量吗?当然不行,这就需要用到我们的数组了。

2.静态初始化数组

特点:定义数组的时候直接给数组赋值,由系统决定数组长度

通用格式:

数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };
例如:
int [] array= {1,2,3,4,5};
double[] scores = {88.5, 99.5, 59.5};

3.动态初始化数组

特点:定义数组时确了定元素的类型和数组的长度,之后存入数据

通用格式:

数据类型[] 数组名 = new 数据类型[长度];
例如:
int [] array= new int[5];
double[] scores = new double[3];

默认值:

数据类型 具体定义类型 默认值
基本类型
byte、short、char、int、long

0

float、double

0.0

boolean

false
引用类型
类、接口、数组、String

null

4.总结

  • 数组适合同种类型的大量数据
  • 静态初始化适合知道了元素值
  • 动态初始化适合不清楚存入哪些数据

三、数组的属性

1.访问

一般访问数组的方式为:

数组名称[索引]

例题:

//静态初始化数组
int [] array= {1,2,3,4,5};
System.out.println(array[0]);//输出 1
System.out.println(array[1]);//输出 2
System.out.println(array[3]);//输出 4

2.长度

长度可以直接调用length得到数组的长度。

例题:

//静态初始化数组
int [] array= {1,2,3,4,5};
System.out.println(array.length);//调用方法,输出长度 5
//最大索引array.length-1

3.遍历

遍历就是一个一个数组元素的访问,主要应用在搜索、数据统计......

我们之前学了循环结构、分支结构,下面通过for循环遍历一个数组

例题:

给定元素 {10,8,9,4,5,6,8,71,2,3,9,99},用静态数组存储并输出数组中大于5的元素?

编码实现:

//静态初始化数组
int [] array= {10,8,9,4,5,6,8,71,2,3,9,99};
for(int i=0;i<array.length;i++)
{
	if(array[i]>5)
		System.out.println(array[i]);
}

输出结果:

10 8 9 6 8 71 9 99

四、内存图

  • Java在程序运行时,需要在内存中分配空间,对空间进行了不同区域的划分。
  • 栈内存:存储局部变量,使用完毕立即消失
  • 堆内存:存储new 出来的内容(对象、实体),地址使用完毕在垃圾回收器空闲时回收

1.单数组内存图

下面的创建数组代码,实现它的内存关系图

编码实现:

//动态初始化数组
int [] arr=new int[3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//修改值
arr[0]=100;
arr[2]=200;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);

输出结果:

[I@15db9742
0
0
0
[I@15db9742
100
0
200

原理讲解:

  • 动态初始化先在堆内存生成一个new 一个arr地址值,具体看编译器的结果,这里假设001。由于动态初始化,所以每个元素都有一个初始值,具体可以看上面的表。我们输出元素,先访问数组名地址,到堆内存下标,再输出元素值。
  • 修改数组值,历程和查看相同,只不过多了一步修改的过程,如下图:

2.多数组内存图

多个数组和单数组内存使用原理相同,这里我就不过多讲述了。

3.数组指向相同内存

假如我们把两个数组的地址值改为相同,修改后的结果该是如何,如下面的代码。

编码实现:

//动态初始化数组
int [] arr=new int[3];
arr[0]=100;
arr[1]=200;
arr[2]=300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
int [] arr2=arr;
arr2[0]=111;
arr2[1]=222;
arr2[2]=333;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr2);
System.out.println(arr2[0]);

输出结果:

[I@15db9742
100
200
300
[I@15db9742
111
[I@15db9742
111

原理讲解:

第一个数组在堆内存的地址为001,第二个数组也为001,所以修改第二个数组的值,其实都是同一个数组内存。第一个数组的值也会随着改变,结果如下:

五、常见问题

1.索引越界

//静态初始化数组
int [] array= {1,2,3};
System.out.println(array[3]);
  • 上面的代码运行之后,会出现下面的报错异常:
  • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
  • 解释:我们静态化初始数组给了3个数字,最大索引为2,当我们访问3时,就会报错

2.空指针异常

//动态初始化数组
int [] array= new int[3];
array=null;
System.out.println(array[0]);
  • 上面的代码运行之后,会出现下面的报错异常:
  • Exception in thread "main" java.lang.NullPointerException
  • 解释:我们将数组置为null,导致访问的数组不指向堆内存的数据

到此这篇关于Java由浅入深学习数组的使用的文章就介绍到这了,更多相关Java数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java超细致讲解数组的使用

    目录 数组的定义 数组的三种语法格式 遍历数组的三种方式 数组的使用 数组的练习 数组拷贝 查找数组中的指定元素(二分查找) 判断数组是否有序 数组排序(冒泡排序) 数组逆序 二维数组 小结 数组的定义 数组本质上就是让我们能 " 批量 " 创建相同类型的变量. 数组的三种语法格式 1. 数据类型 [] 数组名称 = new 数据类型 [] { 初始化数据 }; 例如: int[] arr=new int[]{1,2,3}; 注意:[]里面不能写数字!!! 2. 数据类型 [] 数组名

  • Java由浅入深细数数组的操作下

    目录 1.二维数组的存储 2.二维数组的定义和初始化 3.打印二维数组 4.不规则二维数组 5.Arrays中常用的方法 上一篇介绍完一维数组后,我们来看二维数组 1.二维数组的存储 在C语言中我们说过:二维数组可以看成是特殊的一位数组,比如int arr[2][3],arr可以看成由两个元素组成,即arr[0]和arr[1],arr[0]和arr[1]各自又有三个元素,这句话在Java中同样适用,一维数组中arr存储的是一个地址,二维数组中则是多个地址,以上面的arr数组为例,其在JVM中的存

  • 由浅入深快速掌握Java 数组的使用

    目录 1.数组定义格式 1.1 数组概述 1.2 什么是数组 1.3 数组的定义格式: 2.数组初始化之动态初始化 2.1 数组初始化概述 2.2 数组初始化方法 3.数组元素访问 3.1 数组元素访问 4.内存分配 4.1 java中的内存分配 4.2 数组内存图(单个数组) 4.3 多个数组内存图 5.数组初始化之静态初始化 6.数组操作的两个常见小问题 7.数组常见操作 7.1 遍历 7.2 获取数组元素个数 7.3 获取最值 1.数组定义格式 1.1 数组概述 * 一次性声明大量的用于存

  • Java基础知识精通数组的内存分析

    目录 1.数组内存图 2.两个数组的内存图 3.一个变量两个数组容器的内存图 4.两个变量指向一个数组容器的内存图 前言:本文章主要讲解数组的内存图,更好地掌握数组以及数组调用流程,话不多说开讲. 1.数组内存图 1.一个数组的内存图 int[] arr = new int[3]; //刚开始定义数组arr为int型包含三位数字,初始化为0,0,0. arr[0] = 12; //数组arr第一位被赋值12 arr[2] = 14; //数组arr第三位被赋值14 System.out.prin

  • Java零基础入门数组

    目录 认识数组 数组的初始化 默认初始化 静态初始化 动态初始化 数组有关的问题 数组的遍历 求最值问题 查询子元素 Arrays工具类 二维数组 二维数组初始方式 二维数组的遍历 认识数组 数组的定义 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们. 数组的四个基本特点 长度是确定的.数组一旦被创建,它的大小就是不可以改变的. 其元素的类型必须是相同类型,不允许出现混合类型

  • Java基础知识精通数组的使用

    目录 1.数组 2.数组定义格式 3.访问数组 4.遍历数组 前言:本文章正式踏入数组部分,今天来讲一下数组. 1.数组 数组是一组数据结构,用来储存一组相同类型值的集合. 数组就是一个容器. 数组就是个引用数据类型. 作用: 用来装数据,方便对数据进行管理操作. 特点: 一旦创建数组,就不能改变长度. 数组里面所有的元素的类型必须是相同数据类型的. 数组中既可以储存基本数据类型,也可以存储引用数据类型. 2.数组定义格式 格式一:元素的数据类型[] 数组的名字 = new 元素的数据类型[元素

  • Java由浅入深细数数组的操作

    目录 1.JVM的内存分布 2.引用类型变量的特点 3.一维数组的使用 3.1定义和初始化 3.2数组的访问 3.3打印数组所有的元素 3.4数组的拷贝 3.5作为参数和返回值 本篇介绍一维数组以及相关操作,二维数组放在下一篇 1.JVM的内存分布 Java的代码是运行在JVM上的,为了方便管理,对所使用的内存按照功能的不同进行了划分,这不是本篇重点,只做简单的介绍: Java虚拟栈:局部变量在这里开辟空间 Java本地方法栈:运行一些由C/C++编写的程序 堆:对象在这里存储,且开辟后的空间使

  • Java由浅入深学习数组的使用

    目录 一.前言 二.数组的定义 1.概述 2.静态初始化数组 3.动态初始化数组 4.总结 三.数组的属性 1.访问 2.长度 3.遍历 四.内存图 1.单数组内存图 2.多数组内存图 3.数组指向相同内存 五.常见问题 1.索引越界 2.空指针异常 一.前言 学习概述:前八天我们学习了语法基础.运算符与表达式.循环结构.分支结构,今天主要学习数组的定义.相关的属性方法.数组存储的内存图.常见错误 学习目标:掌握数组的两种定义方法.相关属性.了解内存原理.错误解决 二.数组的定义 1.概述 假如

  • Java基础学习笔记之数组详解

    本文实例讲述了Java基础学习笔记之数组.分享给大家供大家参考,具体如下: 数组的定义于使用 1:数组的基本概念 一组相关变量的集合:在Java里面将数组定义为引用数据类型,所以数组的使用一定要牵扯到内存分配:想到了用new 关键字来处理. 2:数组的定义格式 区别: 动态初始化后数组中的每一个元素的内容都是其对应数据类型的默认值,随后可以通过下标进行数组内容的修改: 如果希望数组定义的时候就可以提供内容,则采用静态初始化的方式: a:数组的动态初始化(声明并初始化数组): 数据类型 数组名称

  • java 两个数组合并的几种方法

    本文介绍了java 两个数组合并的几种方法,分享给大家,也给自己留个笔记 需求:两个字符串合并(如果想去重复,参考下一篇--数组去重复及记录重复个数) //方法一 Arrays类 String[] a = {"A","B","C"}; String[] b = {"D","E"}; // List<String> list = Arrays.asList(a); --OK // List<

  • java web学习_浅谈request对象中get和post的差异

    阅读目录(Content) •1.get与post的区别 •1.1 get方法 jsp中的代码form表单代码 •1.2 action包中servlet的doGet方法中的代码 •2.运行结果 •2.1 输入数据 •2.2 打印出数据 •3.post方法 •4.对比 •4.1 在输出页面按下F12查看 •5.分析 1.get与post的区别 Get和Post方法都是对服务器的请求方式,只是他们传输表单的方式不一样. 下面我们就以传输一个表单的数据为例,来分析get与Post的区别 1.1 get

  • Java反射学习 getClass()函数应用

    Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码.严格地说,反射并非编程语言的特性,因为在任何一种语言都可以实现反射机制,但是如果编程语言本身支持反射,那么反射的实现就会方便很多. 1,获得类型类 我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类.Object类中包含一个方法名叫getClass,利用这个方

  • 浅谈java面向对象的数组化信息处理

    虽然非常简单的东西,但对于一些自学的新手和前期理解的不够深的萌新来说,应该会有很大的帮助,有助于理解. 初学面向对象的时候,我想许多同学对此很纳闷.简单的问题复杂化,多此一举诸之云云. 那么往下看: package cn.bdqn.test3; import java.util.Scanner; public class Test1 { public static void main(String[] args) { //创建两个管理员对象 Admin a1 = new Admin(); a1.

  • C#和Java中二维数组区别分析

    本文实例讲述了C#和Java中二维数组区别,分享给大家供大家参考.具体分析如下: 在Java中使用二维数组可以如下代码: 复制代码 代码如下: public class Array2D{     public static void main(String[] args){         int myInt[][]=new int[5][10];         //遍历,给数组中的每一个数组赋值         for(int i=0;i<myInt.length;i++){        

  • java并发学习之BlockingQueue实现生产者消费者详解

    1.介绍 阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满:从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空.并发包下很多高级同步类的实现都是基于BlockingQueue实现的. JDK7提供了以下7个阻塞队列: ArrayBlockingQueue :由数组结构组成的有界阻塞队列. LinkedBloc

  • Java中的数组复制(clone与arraycopy)代码详解

    JAVA数组的复制是引用传递,而并不是其他语言的值传递. 1.clone protectedObjectclone() throwsCloneNotSupportedException创建并返回此对象的一个副本."副本"的准确含义可能依赖于对象的类.这样做的目的是,对于任何对象x,表达式: x.clone()!=x为true,表达式: x.clone().getClass()==x.getClass()也为true,但这些并非必须要满足的要求.一般情况下: x.clone().equa

随机推荐