JAVA关于数组
数组属于引用类型,本质为指针,存的值为地址。在任何类型后加[]都可以生成新的数组类型。
int a[]; //int数组,不推荐这么写
int[] a; //推荐写法
整个数组只能存相同类型的值,每个数组元素都相当于一个变量。
数组在声明时,不能指定数组长度,因为数组只是一个指针,没有数组内容存在。
数组初始化时,有两种方法:
1.静态初始化:
类型 变量名 = new 类型[]{内容1,内容2};
类型 变量名 = {};
2.动态初始化:
new 类型[lenght]
会自动将数组内容设置为0(基本类型)或null(引用类型)。
获取数组长度:
int l = 数组名.length;
使用foreach循环遍历数组:
for(类型 变量名 : 数组或集合)
{
//每循环一次,取数组中的一个值赋给变量名。
}
数组在内存的存放:
每个方法在运行时内存中都有一个方法栈,所有方法中声明的变量(局部变量)都放在对应的方法栈中,方法运行结束时,栈内存自动释放(栈是临时性内存)。因此栈内存不适合存放长期有效的数据。
因此在方法中声明一个数组时如:
int[] a;
实际上是在栈内存中创建了一个存放地址的空间,所以数组刚声明时不能直接使用,否则会报错空指针异常,因为数组声明时本质是一个指针,而它没有指向任何值。这和所有引用变量相同,如果一个引用变量被声明而没指向任何值就使用时,会报错空指针异常。
关于堆,每个JVM只拥有一个堆内存,JVM不退出,堆将一直存在,可以用java -X命令设置最大堆大小和初始大小。当使用静态或动态方式创建数组:
int a = new a[3];
int b = new b[]{1,2,3};
会在堆内存中开辟空间,这和引用变量相同,引用变量的值都存在堆中。JAVA不允许直接操作堆内存,只能通过引用变量来访问。 当数组的引用变量被销毁时,引用变量指向堆中的数据不一定被销毁,由JAVA的后台线程垃圾回收器决定,会在合适的时候回收没有指针指向(被引用)的堆内存。
因为有垃圾回收机制的存在,JAVA管理内存时非常方便,不会出现内存泄漏,提高安全性。内存泄漏的概念是:当分配内存后忘记回收或者收回了不该回收的内存。
多维数组:声明:
int[3][] a;
允许只在最左边的方括号中填值,这样的数组可以使用而不会出现空指针异常,由于声明为动态声明,所以由系统自动赋值,由于int[]是引用类型变量,所以被初始化为null。若此语句在方法中写出,则数组存放在堆内存中,在方法栈中只有一个指向堆内存的地址,之后再赋值时如:
a[1] = new int[]{1,2};
则以上语句中new出来的数组{1,2}在堆内存中,a[1]存放的是新数组在堆中的地址值。
直接打印数组名:
int[] a = new int[3];
System.out.println(a);
输出为:
[I@12345678 //[+数组类型大写+@+8位16进制地址
操作数组的工具类:java.util.Arrays类,使用时需导入:
import java.util.Arrays
java中唯一不需要导入的包为java.lang,其中含有我们熟悉的String类型和System方法。
二分查找:
Arrays.binarySearch(数组名,要查找的值); //二分法查找数组中的元素,要求数组以排好序,返回值为数组下标。
填充值:
Arrays.fill(数组名,开始的索引,结束的索引,要填充的值); //把数组的开始到结束的索引的值都填充为指定值,左包右不包。
从数组名得到值:
Arrays.toString(数组名);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-03-22 C++ Primer 学习笔记 第十二章 动态内存