《Java数组核心笔记:从遍历到内存原理全搞定》
数组的定义与使用中遍历数组所谓遍历是指将数组中的所有元素都访问一遍访问是指对数组中的元素进行某种操作比如打印…int[]newint[]{1,2,3};System.out.println(array[0]);System.out.println(array[1]);System.out.println(array[2]);…上述代码确实起到了遍历的效果不过如果数组增加一个元素就需要增加一个语句有100个元素就需要写100个打印语句并且如果我们把打印改成给每个元素加1修改起来很麻烦。我们知道打印数组的每个元素对每个元素的操作是相同的则可以采用循环进行打印…int[]arraynewint[]{1,2,3,4};for(inti0;i4;i){System.out.println(array[i]);}…那如果我们不知道数组中有多少个元素怎么办呢我们可以通过数组对象.length来获取数组的长度数组中改后代码如下…int[]arraynewint[]{1,2,3,4};for(inti0;iarray.length;i){System.out.println(array[i]);}…使用循环解决了后面两个问题不过依旧没有解决增加一个元素就得增加一条语句的不足此时我们可以使用for-each遍历数组for-each 是 for 循环的另外⼀种使⽤⽅式能够更⽅便的完成对数组的遍历可以避免循环条件跟循环语句写错代码如下…int[]arraynewint[]{1,2,3,4};for(intx:array){System.out.print(x );}…这里的x是用来接受数组里每一个元素的临时变量变量x可以换名字但是变量x的类型必须与数组元素的类型一致使用for-each没有下标的概念不仅如此还有一种方法打印数组元素更便利不过是将数组转字符串后面我会讲到也就是操作数据工具类Arrays与数组。数组是引用类型初始JVMJava虚拟机的内存分布JVM即Java虚拟机是Java技术的核心负责让Java实现”一次编写到处运行”编写的Java代码也就是.java后缀文件通过编译生成 .class 字节码文件再通过JVM加载 .class 把字节码文件翻译成当前操作系统能执行的机器码JDK 开发工具javac JREJRE 核心类库 JVM内存是一段连续的存储空间主要用来存储程序运行时的数据比如程序运行时代码需要加载到内存程序运行长生的中间数据需要存放在内存程序中的常量也要保存有些数据需要长时间存储有些数据当运行结束后就要被销毁因此JVM对所使用的内存按功能的不同进行了划分虚拟机栈 与⽅法调⽤相关的⼀些信息每个⽅法在执⾏时都会先创建⼀个栈帧栈帧中包含有局部变量表、操作数栈、动态链接、返回地址以及其他的⼀些信息保存的都是与⽅法执⾏时相关的⼀些信息。⽐如局部变量。当⽅法运⾏结束后栈帧就被销毁了即栈帧中保存的数据也被销毁了堆JVM所管理的最大内存区域使用new创建的对象都是在堆上保存堆是随着程序开始运行时而创建随着程序的退出而销毁堆中的数据只要还在用就不会被销毁方法区用于储存虚拟机已被加载的信息、常量、静态变量、即时编译器编译后的代码等数据方法编译出的字节码就是保存在这个区域程序计数器只是一个很小的空间保存下一条执行的指令的地址本地方法栈本地⽅法栈与虚拟机栈的作⽤类似. 只不过保存的内容是Native⽅法的局部变量. 在有些版本的 JVM 实现中本地⽅法栈和虚拟机栈是⼀起的其实是C/C代码实现的初学者只需简单了解堆和虚拟机栈我们在方法内部创建的变量是局部变量存储在虚拟机栈中以数组为例…int[]arraynewint[]{1,2,3,4};…array(引用变量)存储了数组对象的地址引用指向数组对象array是引用变量存储在虚拟机里new int[5] 是真正的数组对象存储在堆里这才是真正存放数据的地方可以这么理解引用变量是一张卡片卡片里存了房子的地址引用地址引用指向房子对象。引用就是对象的地址基本类型变量与引用类型变量的区别基本数据类型创建的变量称为基本变量该变量空间存放的是其所对应的值而引用数据类型创建的变量一般称为对象的引用变量其空间存储的是对象所在空间的地址如下代码…publicstaticvoidfunc(){inta10;intb20;int[]newint[]{1,2,3,4};}…在上述代码中a、b、arr都是函数内部的变量因此其空间都在main⽅法对应的栈帧中分配。a、b是内置类型的变量因此其空间中保存的就是给该变量初始化的值。array是数组类型的引⽤变量其内部保存的内容可以简单理解成是数组在堆空间中的⾸地址通过该地址引用变量便可去操作对象。有点类似C语言的指针但是Java中引用要比指针的操作更简单。用这个图可以更好的辨别认识nullnull在Java中表示空引用也就是一个不指向对象的引用null的作用类似于C语言中的NULL空指针都是表示一个无效的内存位置因此不能对这个内存进行任何读写操作一旦尝试读写就会抛出 NullPointerException.空指针异常数组的应用场景保存数据…publicstaticvoidmain(String[]args){int[]array{10,20,30};for(inti:array){System.out.print(i );}}…作为方法的参数参数传基本数据类型…publicstaticvoidmain(String[]args){intnum100;fun(num);System.out.println(num);publicstaticvoidfun(inta){inta200;System.out.println(a);}}//运行结果200100…fun方法中修改形参num的值不影响实参的num值参数传数组类型引用数据类型…publicstaticvoidmain(String[]args){int[]arraynewint[]{1,2,3,4};fun(array);System.out.println(a[0] a[0]);publicstaticvoidfun(int[]array2){array[0]100;System.out.println(a[0] a[0]);}}//运行结果100100…在方法内部修改数组的内容方法外部的数组内容也发生改变因为数组是引用类型按照引用类型来进行传递是可以修改其中存放的内容的总而言之所谓的引用本质上只是存了一个地址Java将数组设定成引用类型这样的话后续进行数组参数传参其实只是将数组的地址传入到方法形参中这样可以避免对整个数组进行拷贝如果数组比较长这样开销就会很大。对操作数据工具类Arrays与数组练习后面再讲解