数组及内存图解

本文详细探讨了Java中的数组,包括其作为引用数据类型的特点、内存分配、初始化、长度固定性以及元素访问。讲解了一维和二维数组的声明、初始化、遍历、默认初始化值,特别是引用数据类型的默认值。此外,还讨论了数组的内存解析,局部变量的作用域,以及数组的回收机制。文章还涵盖了数组的复制、反转、查找和排序,包括线性搜索、二分查找以及使用Arrays工具类的各种操作。最后,提到了多维数组的处理,尤其是对空引用的处理要领。
 
  1. 数组属于引用数据类型的变量;数组的元素既可以是基本数据类型,也可以是引用数据类型(str)
  2. 创建数组对象会在内存中开辟一整块连续的空间,数组名中引用的是连续空间的首地址(16进制数)。
  3. 数组长度一旦确定,就不能修改。
 
一维数组
*二维使用相同
  1. 一维数组的声明与初始化
         
    
        但如果先声明再赋值的一维数组,不可使用类型推断
Wrong!
int[] wrongArr;
wrongArr = {1, 2, 3, 4, 5};
// Wrong, 因为分开写,不能推断出类型!
  1. 调用数组指定位置的元素:索引,与Python类似(0开始,长度-1结束)
names[0] = "allen" //动态数组赋值,names为Array
  1. 获取数组的长度,属性 length
Arrayxx.length 
  1. 遍历数组 for loop
  2. 数组元素的默认初始化值
  • 基本数据类型
        
  • 其中Char型,默认值为数字0,不是字符串‘0’ ----》 因为char型对应的是一个数字,如“a” --> 97; 遍历时不显示
  • 引用数据类型
        
  • 是空值,不是"null"
  1. 数组的内存解析
                                                
  • 方法中的变量:局部变量                                                                                                                存储流程演示
  • 没有指针指向的数组,在不确定时间被当做垃圾回收(引用计数算法)
  • 代码执行完之后,局部变量从下往上离栈,与此同时指针消失,数组被回收
 
多维数组(二维数组)
  • 一维数组的元素也是一维数组,底层运行机制来看,没有多维数组
         
  1. 二维数据声明与初始化
        
 
        
        二维数组 arr2 内存示意图; 也可以把第一个[]看成行,第二个[]看成列
        
  1. 调用数组指定位置元素,同Python
//如果没有初始化/赋值内数组,调用时会出现异常
String[][] arr3 = new String[3][];
arr3[1][0] //空指针异常,未定义内层元素
 
//Solution, 先赋值or初始化,再调用
arr3[1] = new String[4];
arr3[1][0] //NULL
 
 
  1. 获取二维数组长度
  • Arry.length ---> return # of rows, 外层长度
                  
  • 获取内层数组长度
arry[0].length
  1. 遍历二维数组
  • 两层for loop 内层使用   arry[i].length  作为循环条件
  1. 二维数组元素的默认初始化值
        
 
int[][] arry2 = new int[3][4];
//print arry2 ---> [[I@28a418fc 
            //2维 int型 @之后是地址,16进制
//print arry2[0] ---> [I@28a418fc
         // 1维, int型, @之后是地址
//print arry2[0][1] ---> 0
//float [F      |||    String [Ljava.lang.String    |||     boolean [Z@xxxxx   |||    short [S   byte [B   long [J
//未定义内层元素
int[][] arry3 = new int[3][];

//输出外层
print(arry3[0]) ----> null *即使不是String类型,也是NULL; 引用类型默认值都为Null,二维数组内部是一维数组,数组是引用类型!!!

//输出内层,报错
print(arry3[0][0]) ---> Null pointer exception

 

 
//char型最为特殊
char[][] arry5 = new char[3][4];
 
print(arry5[0]) ---> 输出4个不显示的0!
 
print(arry5[0][0]) ---> 输出一个不显示的0!
 
print(arry5) ---> 输出[[C@地址 
 
二维数组内存解析
 
 
赋值问题
  • int[] x, y[]
  • 声明之后再赋值
#1)x[0] = y #No x[0] 为int值,不能接收二维数列
 
#2)x = y #NO 二维不能赋给一维
 
#3)y[0] = x #Yes 同为一维数列
 
#4)y[0][0] = x #No 一维数列不能赋值给int型
 
#5) y = x #No cannot convert from [] to [][] 
 

                                   
 
3)array2 = array1 ----> 把array1 的地址值给了Array2---------->非数组复制
  • 数组复制
int[] array1, array2;
array1 = new int[]{1,2,3,4,5,6};
            
  • 数组反转
    • 方法一
                    
  • 遍历到1/2 长度就可,不然又转回来了
  • 引入一个临时变量,存放原 index i位置的值,再把这个值赋给 array.length - 1 - i 位置
  • 方法二
                    
    • 前变量要一直小于后变量
  • 数组查找
    • 线性
      • If String var1.equals(var2), int 类型 == 
    • 二分法
      • 前提:数组必须有序!
                              
    • 不需要slice array,使用index来控制查找范围
    • 改进:如果array里面的数据缓慢增加,那么可以根据差值法来决定从哪开始找
      • (target_num - head)/ (tail - head) ---> get a proporation, can find the target number faster.
  • 数组排序
    • 目的:为了快速查找
                    
  • 稳定性:如果a series of items, already sorted by sales, item A is at above of item B, then second sorting cateria is price, item A has the same price as B. In this situation, item A still sits above item B-------> ROBUST!
  • 排序分类
                    
 
  • 十大内部排序算法
                    

 

 
 

算法
 

Array 工具类
  • java.util.Arrays: 操作数组的工具类
  1. 判断两个数组是否相等
    • boolean equals(int[] a, int[] b);
    • e.g. boolean isEqual = Arrays.equals(a1, a2);
  2. 输出数组信息
    • String toString(int[] a);
    • e.g. System.out.println(Arrays.toString(a1));
  3. 将指定的值填充到数组; 用提供的值替换array里面所有数据
    • void fill(int[] a , int val)
    • e.g. Arrays.fill(a1, aNumber);
  4. 对数组进行排序
    • void sort(int[] a)
    • e.g. Arrays.sort(a1);
  5. 对排序后的数组进行二分法检索指定的值
    • int binarySearch(int[] a, int key)
    • e.g. int index = Arrays.binarySearch(a1, aNumber);
      • if 未找到,返回一个负值

Array 异常
 
   
  • arr2[0] --> null; arr2[0][0] ---> 空指针
情况一和二都是在null的情况下使用索引导致的空指针异常!
 
  • print(arr3[0]) works ------> null
  • But arr3[0].toString() 空指针异常
 
 
 
以上截图出自尚硅谷Java课程,平台 B站
 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值