1.8 数组

本文详细介绍了一维数组的定义、初始化、引用及向函数传递,对比了与二维数组的区别,探讨了数据类型和存储类型,并特别关注了二维数组的存放顺序。此外,还涵盖了数组在实际编程中的应用和注意事项。

一、一维数组
(一)、定义

int a[5];

定义一个有5个int型元素的数组:系统在内存分配连续的5个int空间给此数组。数组元素下标为0-4
直接对a的访问,就是访问此数组的首地址。注意:数组名表示数组首地址,常量,值不可改变
数组大小必须是值为正的常量。

#define SIZE 5//建议
int a[SIZE];

(二)、初始化
数组定义后的初值是随机数

  int a[5] = {12, 34, 56 ,78 ,9};//定义了有5个元素的数组a并初始化
  int a[5] = {0};////定义了有5个元素的数组a并初始化了第一个元素
  int a[] = {11, 22, 33, 44};//定义了数组a并初始化了4个元素,于是数组a有4个元素。

(三)、引用
数组名 [下标]
数组下标都是从0开始
下标既可是常量,也可是整型表达式,允许快速随机访问,如a[i]。和普通变量一样。
如何使2个数组值相等?

//方法1:逐个元素赋值
    b[0]=a[0];
    b[1]=a[1];
    b[2]=a[2];
    b[3]=a[3];
    b[4]=a[4];
//方法2:通过循环赋值
    int i;
    for (i=0;i<5;i++)
        b[i] = a[i];

· 下标不可越界

(四)、向函数传递一维数组

传递整个数组给另一个函数,可将数组的首地址作为参数传过去,用数组名作函数参数。
只复制一个地址自然比复制全部数据效率高
由于首地址相同,故实参数组与形参数组占用同一段内存
该函数内,这个数组的元素可读可修改

二、二维数组

···比较
1)一维数组

int a[5]; //用一个下标确定各元素在数组中的顺序,可用排列成一行的元素组来表示

2)二维数组

int a[233][233];//两个下标,可用排列成i行,j列的元素组来表示

3)n维数组
用n个下标来确定各元素在数组中的顺序

 int c[3][2][4];//3维数组

n≥3时,无法在平面上表示其各元素的位置

三、数组的数据类型和存储类型

根据数组的数据类型,为每一元素安排相同长度的存储单元
根据数组的存储类型,将其安排在内存的动态存储区、静态存储区或寄存器区
用sizeof(a)来获得数组a所占字节数
1、二维数组的存放顺序:按行存放

### JDK 1.8 中 HashMap 数组索引的定位过程 在 JDK 1.8 中,`HashMap` 使用了一种高效的算法来计算数组中的索引位置。其核心思想是利用哈希函数的结果与数组长度的关系,从而减少冲突并提高查询效率。 #### 计算哈希值 当向 `HashMap` 插入键值对时,首先会对键对象调用 `hashCode()` 方法得到原始哈希值。为了使这些哈希值布更加均匀,JDK 1.8 对此进行了扰动处理,即通过位运算进一步优化散列效果: ```java static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } ``` 这段代码的作用是对高 16 位和低 16 位进行异或操作,使得高位的信息也能参与到低位的计算中,从而降低因高低位差异过大而导致的碰撞概率[^1]。 #### 索引计算方式 完成哈希值的计算后,下一步就是将其转换成实际存储桶(bucket)的下标。由于 `HashMap` 底层数组长度始终为 2 的幂次方,默认情况下为 16 (`DEFAULT_INITIAL_CAPACITY`),因此可以通过简单的按位与操作代替取模运算,提升性能: ```java (int)(n - 1) & hash ``` 其中 `n` 表示当前数组的实际大小,而 `(int)(n - 1)` 是一个掩码值,它能够保留足够的二进制位以覆盖整个数组范围。这种方法不仅速度快于传统的 `% n` 运算,而且还能保证结果落在合法区间内[^3]。 #### 扩容后的重定位策略 随着元素数量增加,可能会触发扩容机制,在新旧两代数组之间迁移已有条目时,JDK 1.8 并未重复执行完整的哈希计算流程。相反,仅需依据原索引及其对应关系决定目标地址即可。假设旧容量记作 `oldCap` ,那么对于任意给定节点而言, - 若 `(e.hash & oldCap) == 0` 成立,则保持原有相对偏移量; - 否则更新至另一侧子树根部附近的新槽位处[`^2`]。 这样做的好处在于简化了逻辑复杂度的同时也减少了不必要的开销。 ```python def calculate_index(n, hash_value): """模拟 Java 中 HashMap 的索引计算""" index = (n - 1) & hash_value return index # 示例演示 if __name__ == "__main__": capacity = 16 # 初始容量 sample_hash_values = [12345, 98765, 45678] for hv in sample_hash_values: idx = calculate_index(capacity, hv) print(f"Hash Value: {hv}, Index: {idx}") ``` 以上程序片段展示了如何按照相同规则手动推导出某个特定哈希值得到的具体位置编号[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小邵(预备留子实习中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值