Java数组------一维和二维讲解和内存显示图

简介: Java数组------一维和二维讲解和内存显示图

😽个人主页:tq02的博客_CSDN博客-领域博主


🌈理想目标:努力学习,向Java进发,拼搏一切,找到一份朝九晚五,有假期的工作,让自己的未来不会有遗憾。

🎁欢迎各位→点赞👍 + 收藏⭐ + 评论📝+关注✨


    本章讲解内容:Java数组的详细表达。


     今日毒鸡汤:大人只分利弊,小孩才分对错。  


ec7abcf5f04a46d8bbaedc581a452653.png


一.数组的认识


在C语言里,我们也曾学习过数组,数组是什么?数组就相当于一个容器,存放相同类型数据的容器。而数组的本质上就是让我们能 "批量" 创建相同类型的变量。

:容器是固定了大小的,不可改变的那种,例如:矿泉水瓶子、汽油罐、衣柜等容量大小不一的容器。


二.一维数组的用法


2.1 数组的创建


         数组的初始化有2种形式,1、静态初始化(固定内容)      2、动态初始化(固定长度)


静态初始化:指在数组声明的同时,直接给数组引用赋值 ,不需要申明长度

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


示例:int[ ] arr = new int[ ]{1, 2, 3};


省略方式:

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

示例:int [ ] arr = {1, 2, 3} ;


注:省略方式不允许先声明后赋值,只能声明同时直接赋值。


例如:int [ ] arr3; arr3 = {}   //编译出错


动态初始化:指数组声明和数组引用赋值分开。根据数组定义方式的不同,又分为两种。  


第一种:直接引用相同数组进行赋值。


例如:int[ ] arr=arr;直接将数组arr赋值给了arr;注:一定得相同类型的数组


第二种:数据类型 [ ]  数组名称 = new 数据类型 [数组长度];


例如:int [ ] arr1 = int[10];  int arr1[0] = 0;


2.2数组的使用


每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引 (index),可以通过数组的索引访问到数组中的元素。                                                                            数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名。length,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为:数组名。length-1。

public static void main(String[] args) {
   int[] arr = new int[]{1,2,3,4,5}; 
   //打印数组的长度,输出结果是5
    System.out.println(arr.length);
    //打印对应数组的值,输出结果为1
      System.out.println(arr[0]);
}


2.3数组内存原理


 在Java中,内存是非常非常重要的,作用:运行程序。我们编写的程序都是存放在硬盘当中的,而在硬盘里的程序是不会运行的,必须得在内存当中才能运行,运行完毕后会清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。


2.3.1Java虚拟机内存划分


   Java为了提高效率,把内存进行了划分,从而使每一片区域都有特点的处理数据方式和内存管理方式。

jvm的内存划分:


区域名称                                     作用
   寄存器                    给CPU使用,和我们开发无关。
  本地方法栈   JVM在使用操作系统功能的时候使用,和我们开发无关。
   方法区                 存储可以运行的class文件。
   堆内存       存储对象或者数组,new来创建的,都存储在堆内存。
   方法栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。


此处我们不详细讲解,只讲解与数组有关的堆区间。


1.栈(Stack): 存放的都是方法中的局部变量。方法的运行一定要在栈当中运行                                                        局部变量:方法的参数,或者是方法几内部的变量                                                                               作用域: 一旦超出作用域,立刻从栈内存当中消失

2.堆(Heap) : 凡是new出来的东西都在堆中


2.3.2数组内存示例图


be11d9918267479d84616bd2083cd044.png


在图中我们可以看见,栈区可以有堆区,其实不是这样理解的,而是可以通过栈区而去访问堆区,

个人理解:数组变量名就是一个遥控器,可以控制堆区。


三.二维数组的认识    


二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组

二维数组的四种不同形式的定义方式:

定义二维数组:int[][] array1 = new int[10][10];

定义二维数组(简洁版):int array2[][] = new int[10][10];


-----------------------------------------------------------------------

定义二维数组并且初始化:int array3[][] = { { 1, 1, 1 }, { 2, 2, 2 } };

定义二维数组并且初始化(简洁版)int array4[][] = new int[][] { { 1, 1, 1 }, { 2, 2, 2 } };


其实仔细一看。我们可以看见以上的定义方式和一维数组十分相似。


二维数组存储的相当于一维数组的集合。


图片例如:


58f6f4409e804dc09580726bd12f3e07.png


二维数组array3 拥有array3[0]和array3[1]两个一维数组,其实道理和一维数组一样,只不过拥有的不再是元素,而是数组。想象一下套娃,便懂了。

注:只定义二维数组时,可以不写第二个下标,但一定需要定义第一个下标,实际就是定义有几个一维数组。


四.数组作为方法参数和返回值


将数组传递到方法当中。有没有想过,这是值传递,还是地址传递呢?


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] = 10
arr[0] = 10


我们可以发现数组传递过去之后,程序结束,数组值发生了改变,那么这是地址传递吗?事实上,并不是的。但是我们得注意,此时此刻我们这并不是传地址,而是传引用。


原理图:


348bf83838d948c7bd313ec91a81c831.png



解释:相当于从一个控制器(arr)变成了两个控制器(arr,a),这两个指向同一个堆,都可以对其修改。

但是是否存在传引用之后,却无法改变实参的值?存在的,new可以创造出一个新的堆空间,从而与之前的数组分道扬镳。

例如:


c1753946cb5342fba4b13527a055f5d0.png


重点: arr数组值为1,2,3;传引用之后,a的数组值也为1,2,3;也就是说,arr==a;但是重新new出一个堆空间之后,a控制的堆不再是arr控制的堆,因此也无法改变arr数组了


五.Java常用API


          API,你先当作一个方法库一样理解,有了API,我们可以更加快速的操作数组。


5.1输出数组 Arrays.toString()


 int[] array = { 1, 2, 3 };
 System.out.println(Arrays.toString(array));
//输出【1,2,3】


5.2数组转集合 Arrays.asList()

  String[] array2 = {"a", "b", "c", "d"};
  System.out.println(array2);  
  List list = new ArrayList(Arrays.asList(array2));
  System.out.println(list);   // [a, b, c, d]
  list.add("GG");
  System.out.println(list);  // [a, b, c, d, GG]


5.3数组中是否包含某个值 Arrays.asList().contains()

String[] array = { "a", "b", "c", "d", "e" };
boolean isEle = Arrays.asList(array).contains("a");
System.out.println(isEle);


5.4数组排序 Arrays.sort()

 int[] array = { 3, 1, 2 };
 System.out.println(Arrays.sort(array));
//输出:1,2,3


5.5数组二分查找 Arrays.binarySearch()

int[] array = { 1,2,4,5,3,7,8 };
System.out.println(Arrays.binarySearch(array,5));
//输出4


以上并不是全部,只是列举了一些常用的类方法。


总结


               数组的重点在于了解内存存储的数据,还有如何使用数组的数据,如何快捷使用对应的类方法。

目录
相关文章
|
21天前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
31 6
|
11天前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
19 0
|
1月前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
22天前
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
14天前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
30 8
|
11天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
16天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
44 5
|
14天前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
14天前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
|
18天前
|
算法 Java 开发者
Java内存管理与垃圾回收机制深度剖析####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,特别是其垃圾回收机制的工作原理、算法及实践优化策略。不同于传统的摘要概述,本文将以一个虚拟的“城市环卫系统”为比喻,生动形象地揭示Java内存管理的奥秘,旨在帮助开发者更好地理解并调优Java应用的性能。 ####