Java——数组声明,赋值等一些细节问题

Java——数组

数组的使用

(数组既可以是基本类型,也可以是引用类型)

 //1. 声明数组     
 int[ ] a;
 //2. 分配空间:一块连续的空间
 a = new int[6];   
 //3. 赋值
 a[0] = 8;
 //4. 处理数据
 a[0] = a[0]+5;

数组创建中各步骤的逻辑原理
在数组中,当声明数组时(启用栈内存),就是在中创建一个指向堆内地址的变量a;
而在分配空间时(启用堆内存),就是在堆内分配一个连续空间,将空间的首地址(0x…开头的16进制)赋值给栈内引用好的变量a。
最后就是在堆空间内进行赋值操作。

数组的创建方式:

  1. 声明并分配空间(表示数组的中括号可以在任意的相关位置,不受限制):
    int[ ] a = new int[6];
    int [ ] a = new int[6];
    int a[ ] = new int[6];
  2. 声明并赋值(在赋值的过程中就同时也将数组的空间根据其长度来分配 好了,简单声明时不规定相关数组长度):
    int[ ] a = new int[]{1,2,19,36,54};
    int[ ] a = {1,234,43,67};

另外值得注意的是:

  • 数组元素存在默认初始化,对比如下:
public class ArTest {
    public static void main(String[] args){
        int i ;
        int a ;
        System.out.println(a);
    }
}

结果:
结果运行图
运行失败

public class ArTest {
    public static void main(String[] args){
        int[] i ;
        int[] a = new int[3];
        System.out.println(a[0]);
        //System.out.println(i[0]);
    }
}

运行结果:
在这里插入图片描述
运行成功,值为0

由此我们可以看出,在java中各类型数据以及数组未进行初始化的时候并没有默认值,可以存在同时不报错,但是如果运用的话就会报错,而各类型的数组分配空间后,同时并未给定具体值的情况下都拥有一个默认值。
个人认为可以这么理解,由于在数据或数组声明的时候都并未给其分配相应的空间,则不占其中内存,自然也就不会报错。而数组在分配空间时,需要一个值进行空间占位,所以会有默认值。

  • 声明:就好像客人预定了酒店,但是没有入住,所有房间都是空的他也可以随时取消,
  • 分配空间:就好像办理入住手续后,哪怕他没有入住,但是在系统中他的房间已经被占用了。

对于默认值:

  • int :0
  • String:null
  • boolean:false
  • char: (是’ ')
### Java数组赋值方法 在 Java 编程语言中,可以通过多种方式对数组进行赋值。以下是几种常见的方法及其特点: #### 方法一:通过直接初始化的方式赋值 可以直接在声明数组同时为其分配初始值。这种方式适用于已知固定大小和内容的情况。 ```java int[] array = {1, 2, 3}; System.out.println(Arrays.toString(array)); // 输出 [1, 2, 3] ``` 这种方法简单直观,在编译期即可完成数组的创建与赋值[^1]。 --- #### 方法二:通过 `for` 循环逐个元素赋值 如果需要动态计算每个元素的值,则可以使用传统的 `for` 循环逐一为数组中的每一个位置赋值。 ```java int[] array = new int[5]; for (int i = 0; i < array.length; i++) { array[i] = i * 2; } System.out.println(Arrays.toString(array)); // 输出 [0, 2, 4, 6, 8] ``` 这种情况下,程序运行期间可以根据逻辑动态调整数组的内容[^2]。 --- #### 方法三:通过增强型 `for-each` 循环尝试修改数组 需要注意的是,尽管增强了可读性的 `foreach` 结构能够方便地访问数组内的每一项,但它并支持直接改变原数组内部存储的数据副本。因此下面的例子会真正影响到原始对象的状态。 ```java int[] arr = new int[5]; for (int value : arr) { value = 1; // 此处仅改变了局部变量value,并未作用于arr本身 } System.out.println(Arrays.toString(arr)); // 输出仍为 [0, 0, 0, 0, 0] ``` 上述行为表明试图借助 foreach 来更新整个列表并非明智之举[^3]。 --- #### 方法四:引用传递实现整体替换 当两个相同类型的数组之间存在关联关系,可通过简单的重新指派操作达成目的——即将目标容器指向源实例所占据的位置从而共享同一片内存区域上的资料集合体。 ```java int[] originalArray = {1, 2, 3}; int[] newArray; // 将originalArray 的地址复制给了newArray 变量 newArray = originalArray ; // 修改其中一个会影响另一个 newArray[0] = 99 ; System.out.println(Arrays.toString(originalArray )); // 输出 [99, 2, 3] System.out.println(Arrays.toString(newArray )); // 同样输出 [99, 2, 3] ``` 这里展示了如何利用引用机制高效管理资源而必每次都拷贝大量数据结构实体。 --- #### 方法五:针对复杂类型(如自定义类)的对象数组赋值 对于包含非基本数据类型的数组来说,除了要确保有足够的空间容纳所有成员外,还可能涉及到额外的新建过程以填充这些空位。 ```java class Book {} public class Example { public static void main(String [] args){ Book[] books = new Book[3]; for(int index=0 ;index<books.length; ++index ){ books[index]=new Book(); // 创建新的Book 实例并存入对应索引处 } System.out.println("Books Array Initialized."); } } ``` 这段示范说明了即使有了足够的槽位也需要显式调用构造器来实际生成有效条目[^4]。 --- #### 常见错误分析及解决方案 有开发者可能会遇到一些意料之外的结果,比如迭代过程中发现前面已经被设置过的数值莫名其妙变成了零。这通常是因为误解了当前工作区间的界限所致。例如,当你扩展了一个已有数组之后却没有同步增加相应的处理轮次数量的话,那么新增部分自然得到应有的关注进而保留其缺省状态即全零形式[^5]。 为了避免此类情况发生,请务必确认每次循环覆盖范围恰当地反映了最新尺寸变化状况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值