iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >【JAVA】 javaSE中的数组|数组的概念&使用
  • 764
分享到

【JAVA】 javaSE中的数组|数组的概念&使用

java开发语言 2023-08-31 08:08:04 764人浏览 独家记忆
摘要

数组的概念 什么是Java中的数组 数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。在java中,包含6个整形类型元素的数组,可以看做是酒店中连续的6个房间. 数组中存放的元素其类型相同 数组的空间是连在一起的 每个

数组的概念

什么是Java中的数组

数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。在java中,包含6个整形类型元素的数组,可以看做是酒店中连续的6个房间.

数组中存放的元素其类型相同

数组的空间是连在一起的

每个空间有自己的编号,其实位置的编号为0,即数组的下标 

数组的创建和初始化

数组的创建

topy[] 数组名 = new array[n];

topy:表示数组中存放元素的类型

topy[]:表示数组的类型

n:表示数组的长度

int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组

数组的初始化

数组的初始化主要分为动态初始化以及静态初始化 

动态初始化: 在创建数组的时侯,直接指定数组中的元素个数 

int[] array = new int[10];

静态初始化: 在创建数组的时候,不直接指定元素个数,但是直接将具体的数据放入数组中

int[] array = {1,2,3,4,5,6}

栗子:

int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};String[] array3 = new String[]{"hell", "Java", "!!!"};

注意:

静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。

静态初始化时, {}中数据类型必须与[]前数据类型一致。

静态初始化可以简写,省去后面的new T[]。
 

这里静态和动态初始化也可以分为两步,但是省略格式不可以 

int[] array1;array1 = new int[10];int[] array2;array2 = new int[]{10, 20, 30};// 注意省略格式不可以拆分, 否则编译失败// int[] array3;// array3 = {1, 2, 3};

如果没有对数组进行初始化,数组中元素有其默认值

如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值

如果数组中存储元素类型为引用类型,默认值为null 

数组的使用

数组中元素的访问

 数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素  

int[]array = new int[]{10, 20, 30, 40, 50};System.out.println(array[0]);System.out.println(array[1]);System.out.println(array[2]);System.out.println(array[3]);System.out.println(array[4]);// 也可以通过[]对数组中的元素进行修改array[0] = 100;System.out.println(array[0]);

 注意:
数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的

下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界常。 

遍历数组

遍历就是说将数组中的所有元素都访问一遍,访问可以将数组的所有元素进行打印。

栗子:
这里我们通过循环遍历来赋值和打印,也可以使用foreach来遍历打印。

for-each 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错

   public static void main(String[] args) {        int[] array = new int[10];        //通过遍历赋值        for (int i = 0; i < array.length; i++) {            array[i] = i+1;        }        //循环遍历打印        for (int i = 0; i < array.length; i++) {            System.out.print(array[i] + " ");        }        //用foreach遍历        for (int x: array) {            System.out.print(x);                    }        

注意:在数组中可以通过 数组对象.length 来获取数组的长度 

引用类型 - 数组

JVM的内存分布 

内存是一段连续的存储空间,主要用来存储程序运行时数据的,

程序运行时代码需要加载到内存

程序运行产生的中间数据要存放在内存

程序中的常量也要保存

有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁 

所以呢,JVM也对所使用的内存按照功能的不同进行了划分: 

 这里介绍一下上面的几个区分:

程序计数器: 只是一个很小的空间, 保存下一条执行的指令的地址

虚拟机栈: 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含
有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。

本地方法栈: 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的

堆: JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2,
3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。

方法区: 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数
据.
方法编译出的的字节码就是保存在这个区域 

基本类型变量与引用类型变量的区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;

而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

下面的代码,a、b、arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。
a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。

public static void func() {int a = 10;int b = 20;int[] arr = new int[]{1,2,3};}

 从上图可以看到,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。有点类似C语言中的指针,但是Java中引用要比指针的操作更简单

具体分析引用变量

public static void func() {int[] array1 = new int[3];array1[0] = 10;array1[1] = 20;array1[2] = 30;int[] array2 = new int[]{1,2,3,4,5};array2[0] = 100;array2[1] = 200;array1 = array2;array1[2] = 300;array1[3] = 400;array2[4] = 500;for (int i = 0; i < array2.length; i++) {System.out.println(array2[i]);}}

java中的null

null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用 

int[] arr = null;System.out.println(arr[0]);// 执行结果Exception in thread "main" java.lang.NullPointerExceptionat Test.main(Test.java:6)

 null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException.(可以理解为空指针异常)

Java 中并没有约定 null 和 0 号地址的内存有任何关联  

数组的应用

保存数据

public static void main(String[] args) {int[] array = {1, 2, 3};for(int i = 0; i < array.length; ++i){System.out.println(array[i] + " ");}}

作为函数的参数 

函数传基本类型:

public static void main(String[] args) {int num = 0;func(num);System.out.println("num = " + num);}public static void func(int x) {x = 10;System.out.println("x = " + x);} // 执行结果x = 10num = 0

这里在func方法中修改形参 x 的值, 不影响实参的 num 值

参数传数组类型,也就是引用类型:

public static void main(String[] args) {int[] arr = {1, 2, 3};func(arr);System.out.println("arr[0] = " + arr[0]);}public static void func(int[] a) {a[0] = 10;System.out.println("a[0] = " + a[0]);} // 执行结果a[0] = 10arr[0] = 10

发现在func方法内部修改数组的内容, 方法外部的数组内容也发生改变.因为数组是引用类型,按照引用类型来进行传递(可以理解为传的是地址),是可以修改其中存放的内容的   

总结: 所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大)

作为函数的返回值 

直接上代码:

求斐波那契数的前n项:

public class TestArray {public static int[] fib(int n){if(n <= 0){return null;} int[] array = new int[n];array[0] = array[1] = 1;for(int i = 2; i < n; ++i){array[i] = array[i-1] + array[i-2];} return array;}public static void main(String[] args) {int[] array = fib(10);for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}}}

数组练习 

数组变字符串

使用Java 中提供了 java.util.Arrays 包:

    public static void main5(String[] args) {        int[] array ={1,2,3,4,5,5,7,8};       String Arr =  Arrays.toString(array);       //String Arr = My_Arrays(array);        System.out.println(Arr);    }

自己定义一个方法:

    public static void main5(String[] args) {        int[] array ={1,2,3,4,5,5,7,8};       //String Arr =  Arrays.toString(array);       String Arr = My_Arrays(array);        System.out.println(Arr);    }    public static String My_Arrays(int[] array) {        if(array.length == 0) {            return "[]";        }        String ret = "[";        for (int i = 0; i < array.length; i++) {            ret += array[i];            if(i < array.length - 1) {                ret += ",";            }        }        ret += "]";        return ret;    }

数组拷贝 

使用了Arrays包中的拷贝方法去:

    public static void main(String[] args) {        int[] array = {1,2,3,4,5,6,7,8,9,10};        int[] newArr = new  int[10];        newArr = Arrays.copyOf(array, array.length);        for (int i = 0; i < array.length; i++) {            System.out.print(newArr[i] + " ");        }    }

区域拷贝:

    public static void main(String[] args) {        int[] array = {1,2,3,4,5,6,7,8,9,10};        int[] newArr = new int[10];        newArr = Arrays.copyOf(array, array.length);        int[] newArr2 = new int[10];        newArr2 = Arrays.copyOfRange(array, 2, 5);        for (int i = 0; i < array.length; i++) {            System.out.print(newArr[i] + " ");        }        System.out.println();        for (int i = 0; i < 3; i++) {            System.out.print(newArr2[i] + " ");        }    }

二维数组

Java中的二维数组本质上也是一维数组,每个元素又是一个一维数组。

基本语法:

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };

栗子:

int[][] arr = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};for (int row = 0; row < arr.length; row++) {for (int col = 0; col < arr[row].length; col++) {System.out.printf("%d\t", arr[row][col]);} System.out.println("");}

这里大家要记住一个点:二维数组中的行标存的就是对应每一列的地址,通过地址来找到它们,可以将int[i] arr看做 地址。其他的,二维数组的用法和一维数组就没有明显差别了。

来源地址:https://blog.csdn.net/paperjie/article/details/131996296

--结束END--

本文标题: 【JAVA】 javaSE中的数组|数组的概念&使用

本文链接: https://www.lsjlt.com/news/384712.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【JAVA】 javaSE中的数组|数组的概念&使用
    数组的概念 什么是Java中的数组 数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。在java中,包含6个整形类型元素的数组,可以看做是酒店中连续的6个房间. 数组中存放的元素其类型相同 数组的空间是连在一起的 每个...
    99+
    2023-08-31
    java 开发语言
  • java数组的概念是什么
    小编给大家分享一下java数组的概念是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java可以用来干什么Java主要应用于:1. web开发;2. Andr...
    99+
    2023-06-14
  • JAVASE---数组的定义与使用
    数组的基本概念 什么是数组 数组是具有相同类型元素的集合,在内存中连续存储。 数组中存放的元素其类型相同 2. 数组的空间是连在一起的 3. 每个空间有自己的编号,起始位置的编号为0,即数组的下标 数组的创建及初始化 数组的创建 T[] ...
    99+
    2023-09-02
    算法 数据结构 java 开发语言
  • 了解Go语言中数组的概念
    数组概述 数组是Go语言中一种基本的数据类型,用于存储一组具有相同类型的数据元素。数组中的每个元素都有一个唯一的索引,可以通过索引来访问该元素。数组的长度是固定的,一旦创建就不能改变。 创建数组 可以使用以下...
    99+
    2024-01-31
    go数组理解 go数组功能 go数组特点 go语言
  • DM7数组索引的概念是什么
    DM7数组索引的概念是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。数组索引指在一个只包含单个数组成员的对象列上创建的索引。数组索引定义语...
    99+
    2024-04-02
  • C语言二维数组指针的概念及使用
    目录二维数组指针数组和二维数组指针的区别二维数组 二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二...
    99+
    2023-02-11
    C语言二维数组指针 C语言二维数组
  • Golang数组的基本概念和定义
    Golang数组的基本概念和定义 在Golang中,数组(Array)是一种定长且类型相同的数据结构,用来存储相同类型的元素序列。数组是值类型,通过索引访问元素,索引从0开始。在Gol...
    99+
    2024-03-03
    golang 数组 定义
  • php多维数组的概念是什么
    这篇文章主要讲解了“php多维数组的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php多维数组的概念是什么”吧!在php中,多维数组指的是包含一个或多个数组的数组,例如二维数组就...
    99+
    2023-07-05
  • vue3组合式API中setup()概念和reactive()函数的用法
    目录⭐一、组合式API对比vue2项目结构在vue2当中在vue3当中⭐二、setup()函数的使用2.1setup()函数的基础概念2.2.setup()初体验2.3.reacti...
    99+
    2023-05-14
    vue3 setup()与reactive()使用 vue3组合式API vue3 setup()
  • vue函数式组件的概念是什么
    今天小编给大家分享一下vue函数式组件的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue函数式组件是一个不包含...
    99+
    2023-06-29
  • Python基础数据类型中tuple元组的概念和用法
    本篇内容主要讲解“Python基础数据类型中tuple元组的概念和用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python基础数据类型中tuple元组的概念和用法”吧!目录元组简单介绍声明...
    99+
    2023-06-20
  • Python中元组的概念及应用小结
    目录1.元组的概念2.元组的基本使用2.1.定义一个元组2.2.定义一个空元组2.3.元组的元素是不可变的2.4.当元组中的元素是一个列表时列表中的元素可变2.5.当元组中只定义一个...
    99+
    2023-01-31
    Python中元组概念 Python中元组基本应用 Python元组
  • java中IO的概念及使用
    本篇内容主要讲解“java中IO的概念及使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中IO的概念及使用”吧!目录一.认识IOIO的分类IO的方式IO读写的方式IO的特性二.文件操作...
    99+
    2023-06-20
  • VB.NET多维数组基本概念详解
    VB.NET中的多维数组是一种特殊的数据结构,它可以存储多个值,并且可以按照多个维度进行索引和访问。多维数组的基本概念包括以下几点:...
    99+
    2023-09-22
    VB.NET
  • linux用户组的概念是什么
    这篇文章主要讲解了“linux用户组的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux用户组的概念是什么”吧!在linux中,用户组是具有相同特征用户的逻辑集合;用户组是系...
    99+
    2023-06-29
  • Python基础数据类型tuple元组的概念与用法
    目录元组简单介绍 声明元组 元组与列表的区别 特殊的元组 元组的简写 元组常见运算操作 索引 [ ] 取值 切片 [ : : ] 取值 运算符 + 运算符 * 关键字 in 常见函数...
    99+
    2024-04-02
  • C语言数组的概念是什么及怎么应用
    这篇“C语言数组的概念是什么及怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言数组的概念是什么及怎么应用”文章吧...
    99+
    2023-06-30
  • Java中数组的定义与使用
    目录一、数组的基本用法1.什么是数组2.创建数组3.数组的使用二、数据作为方法参数1.基本用法2.理解引用类型3.认识null4.JVM内存区域划分5.数组作为方法的返回值6.关于数...
    99+
    2024-04-02
  • Vue组件的概念是什么
    本篇内容介绍了“Vue组件的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在多次使用到相同的函数和相同的HTML代码时,可以考虑抽...
    99+
    2023-06-20
  • java数组中length的使用方法
    这篇文章主要介绍了java数组中length的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作