Java内存空间,基本数据类型,数组

本文详细介绍了Java内存的五个组成部分:堆、栈、方法区、本地方法区和寄存器的功能及作用,并深入探讨了基本数据类型和数组的定义与应用,特别是针对一维和二维数组的不同创建和初始化方式。

1.Java内存划分

Java内存空间分为五个部分:堆,栈,方法区,本地方法区,寄存器。
a. 寄存器:给CPU使用。
b. 本地方法区:和系统底层方法相关,比如Windows本地方法,native关键字修饰。
c. 栈内存:存储的都是局部变量(函数中定义的变量、函数上的形参、语句中的变量)。只要在方法中定义的变量都是局部变量。局部变量都有所属,属于某一方法。 一旦变量的生命周期结束,该变量就被释放。      
d. 堆内存:存储的都是实体(对象)。凡是用new创建的,都在堆内存里面,开辟一片空间,创建一个对应的实体。每一个实体都有一个首地址值。对象在堆内存中存在的目的就是为了存储(封装)成员变量(数据)的。堆内存的变量都有默认初始化值。不同数据类型不一样。int-0,  double-0.0,  boolean-false,  char-'\u0000', 引用数据类型-null。当实体不再使用时(即没有变量对其引用,指向该对象时),就会被垃圾回收机制处理,后面博客的多线程中会讲到。
e. 方法区:后续博客说到对象的创建过程、静态变量时,会详解。

2. 基本数据类型

3. 数组

在Java中,数组被看成一个对象,定义的方式有两种,int[] a和int a[];第二种是c/c++对数组的定义方式,java推荐第一种。
- 3.1 一维数组:
1. 先new对象,再初始化,默认值是0
a. int [] a = new a[i];
之后再来赋值是不对的
例如 a = {1,2,3}; //常量不可以再赋值一次
2. 直接初始化
b. int a = {1,2,3};
- 3.2 二维数组:
1. 先new对象,再初始化
a. int[][] a = new int[3][5]
a1. int[][] array = new int[3][];
array[0] = new int[3];
array[1] = new int[1];
array[2] = new int[2];
2. 直接赋值初始化
b. int[][] b = {{1,2,3},{4,5,5},{7,8,9}};
3. new 完直接初始化
c. int[][] a = new int[][] {{1,1,1,1,1}, {2,2,2,2,2}, {3,3,3,3,3} };
4. 二维数组要注意长度问题

        int[][] array = new int[3][];  
        array[0] = new int[3];  
        array[1] = new int[1];  
        array[2] = new int[2];  
        /*array[1][2] = 34;*///ArrayIndexOutOfBoundsException  
        array[0][1] = 89;  
        array[2][1] = 44;  
        System.out.print("array length:");  
        System.out.println(array.length);/*二维数组的长度*/  
        System.out.print("array[2] length:");  
        System.out.println(array[2].length);/*某一个一维数组的长度*/  

5.二维数组的应用:
二维数组一般用在坐标,矩阵的应用中。
4. 参考文章
- 春哥JavaSE实战: Jdk配置,数组及其应用,栈和堆内存详解
- Java中一维数组和二维数组的定义
- Thinking in Java

### Java 中引用类型数组基本数据类型数组的区别 #### 定义与声明 在Java中,基本数据类型和引用数据类型数组有着不同的特性和行为。对于基本数据类型数组而言,其元素直接保存数值;而对于引用类型数组,则是存储指向对象的引用。 ```java // 基本数据类型数组 int[] basicArray = new int[5]; // 引用类型数组 String[] referenceArray = new String[5]; ``` 当创建一个基本数据类型数组时,实际上是在内存中分配了一块连续的空间用于存放具体的值[^1]。而引用类型数组则会为每一个位置预留空间用来放置对象实例的地址或引用[^2]。 #### 参数传递差异 考虑函数调用过程中参数传递的情况: - **基本数据类型** 当把基本数据类型作为方法参数传递给另一个方法时,实际上传递的是该变量的一个副本而不是原始变量本身。因此,在被调用的方法内部对该参数所做的任何修改都不会影响到原变量。 - **引用数据类型** 对于引用类型来说,情况有所不同。如果将引用类型的数组作为参数传递给某个方法,那么这个方法接收到的就是原来那个数组对象的引用。这意味着在这个方法内对数组内容做出的变化会影响到原来的数组对象。 ```java public class ArrayPassingExample { public static void changeBasicTypeValue(int value){ value += 10; System.out.println("Inside method, changed value is:" + value); } public static void changeReferenceTypeValue(Integer[] array){ array[0] = 999; System.out.println("Inside method, first element of the array has been set to: " + array[0]); } } ``` 上述例子展示了两种不同类型的数据如何通过方法调用受到影响的不同方式。`changeBasicTypeValue()` 方法不会改变外部 `value` 的值,但是 `changeReferenceTypeValue()` 可以更改传入整数数组的第一个元素并反映在外层作用域中。 #### 使用场景分析 选择使用哪种类型的数组取决于具体的应用需求和技术考量: - 如果只需要简单地存储一系列相同类型的数值,并且不需要复杂的功能(比如动态调整大小),那么基本数据类型数组可能是更好的选择因为它更加轻量级。 - 若涉及到更为复杂的逻辑运算或是需要利用面向对象特性的地方——例如要管理多个字符串或其他自定义的对象集合——此时应该优先选用引用类型数组[^3]。 此外,考虑到性能因素以及垃圾回收机制的影响,合理规划这两种类型之间的转换也是非常必要的。特别是要注意自动拆箱/装箱可能带来的潜在风险,即从包装器类向基础类型转变的过程中可能出现空指针异常等问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值