一 数组的创建
1.作用:用于批量创建相同类型的变量
2.要求:相同类型变量
3.初始化:
(1)动态初始化:定义其长度,内部不具体赋值
(2)静态初始化:直接赋值,由其所赋的值来确定
注:
(1)有带new int[]的初始化和赋值/赋长度可以分两步写
若单纯赋值只带{}的,则不可以分开写
(2)动态初始化和静态初始化必须占一个,并且只能占一个
(3)编程中静态与动态的解释:
动态:运行过程中确定的信息
静态:编译过程中确定的信息
4.元素的初始值:
(1)情况:如果动态初始化,没有初始值,系统会赋一个初始值
(2)赋值情况:
(i)基本类型:整形和浮点型为0/0.0,字符型为空字符,boolean为false
(ii)引用数据类型:空引用
5.与C语言的区别:
(1)在C语言中即使变量被const修饰,也不能作为数组长度。Java中支持变量作为数组长度
(2)在C语言中数组长度是数组类型的一部分,即int[2]和int[4]是不同类型。在Java中数组长度不属于数组类型的一部分,前面所说的二者都属于int[]类型
(3)在C语言中如果不进行初始化会赋给元素随机值。Java中会将元素赋值为0
二 数组的使用
1.获取数组长度
(1)方式:数组引用名.length
2.遍历数组
(1)使用for-each
(i)格式:for(int i:arr){
}
(ii)缺点:
只能从头到尾地遍历+只能读取不能修改
原因:其本质是一个赋值操作,其等价于int i=arr[0],即使改也是改i的值,数组内部不会发生变化
注意:其i是赋一整个元素,而不是作为其下标
(2)访问数组元素:利用[],下标/索引(index)
访问:指对数组的元素进行某种操作
区别:
C语言中面对下标越界访问会有不确定行为,可能给出一个随机值或者直接程序崩溃
Java中会检查下标是否越界,会有确定行为,直接触发异常,无法运行通过
报错:ArrayIndexOutOfBoundsException
注:java这样做可以减少出错,但是会降低一定的效率,而C语言为了追求性能在这一点上没有做出完善
3.打印对象的hasCode
(1)情况:直接打印对象的引用类型得到不是内存地址,而是对象的hasCode
注:在Java中,其将内存地址这个概念隐藏起来,我们无法通过常规手段获取到对象的地址
4.数组转字符串
(1)原因:printfln本质上是打印字符串的,所以需要将数组转化成字符串后再进行打印
Java中的各种对象也是这样的
(2)方法:Arrays.toString(数组名)
三 引用类型
1.用途:
(1)互相赋值
(2)比较==和!=
(3)使用.成员访问
(4)使用[]访问元素(数组特有)
2.与基本引用类型的区别
(1)基本引用类型:其内存中存是其本身的值,其比较相等时是比较其值是否相等
(2)引用数据类型:其内存中存的是其引用的对象在堆区的地址,通过该地址可以去操作其对应的那个对象,其比较相等时是比较其引用的是否为同一个对象
3.空引用(null):
(1)特征:不指向任何有效对象,为无效的引用
(2)区别于C语言:
在C语言中,空指针即为地址为0的指针
在Java中,并没有指定空引用和地址为0的指针的关系,具体如何取决于JVM的实现
(3)注意:
(1)不可用其进行成员访问和下标访问操作,否则会报错:NullPointerException
(2)任何引用类型都可以用null来赋值
四 内存
注:Java程序运行需要消耗内存,而Java程序都是跑在JVM上的,Java程序运行消耗的内存就是JVM消耗的内存
在机器的内春中有一块是JVM的内存,而由于要存储的东西不同,JVM又对内存区域进行了划分
1.内存区域的划分:
(1)程序计数器:用于存放下一条指令的地址
(2)方法区:用于放类中的各种成员方法
(3)堆:new出来的对象都放于此,程序开始时创建,程序结束时销毁,只要内部的对象还有在使用,就不会销毁
(4)栈:每一次方法调用就会创建一个栈帧,栈帧中放了局部变量等各种执行方法要用的信息,以及存放了方法的调用关系(即调用栈)
2.特例:
public static int[] arr(){
int [] arr1=new int[]{1,2,3,4}
return arr1;
}
区别:
在C语言中,其返回的是一个野指针,因为这个数组在出了这个方法之后就不存在,其在内存中的空间被释放了,arr1指向的不为有效地址
在Java中,其没有出错,因为其是创建了一个对象,该对象存储于堆中,只要堆上的对象还有在使用,其就不会被销毁,此时只是arr1整个临时变量被销毁了,其存储于堆上的对象并没有,其地址仍然为有效地址
原因:垃圾回收机制
(1)作用:当你不使用任何对象或数组的时候,就会被JVM自动释放掉,取决于Java使用了一种垃圾回收机制(garbage collection)”GC",堆上的内存都是由GC自动管理的
(2)区别:而在C/C++中则需要手动释放,很容易造成内存泄露
内存泄露的特点;(i)非常隐蔽(ii)后果严重(程序崩溃/系统卡顿)
(3)缺点:
(i)耗费更多资源
(ii)运行起来耗费更多时间
五 数组的应用
1.作为函数参数:作为引用类型可以传个地址过去,就不用复制整个数组过去,耗费资源,并且对数组内部元素的改动是会影响原数组的
2.作为函数的返回值(注意:堆上对象的生命周期的问题)
六 数组的特殊方法
1.数组转字符串:
(1)Arrays.toString(数组)
(2)自己版本:
(i)String可以通过+=来实现与其它类型的拼接
2.数组拷贝(创建一个新的数组)
(1)方式:Arrays.copyOf(数组名,拷贝长度)
(2)有范围地拷贝:Arrays.copyOfRange(数组名,头,尾)
注:在编程中提到的区间基本上都是前闭后开,原因是中间多少个元素可以直接进行计算,少部分是前闭后闭
(3)自己实现要比较原数组与新数组的长度时,可以利用Math.Min方法
3.查找;
(1)顺序查找:适用于所有数组
(2)二分查找:仅适用于有序数组
4.冒泡排序
(1)Arrays.sort(数组)
七 二维数组
1.定义:二维数组本质上是一维数组,只不过其元素都为一维数组
2.区别于C语言
C语言中由于数组长度也是数组类型的一部分,并且数组要求类型一致,所以每一个一维数组的长度都得保持一致
而Java中二维数组中的元素一维数组长度可以不一致,都是int[]这个类型,数组长度不属于类型的一部分,所以长度可以不一致(会取决于静态初始化时所赋的数来决定大小)
3.注意二维数组length得到的是对应一维数组的个数
标签:Java,定义,int,第八章,C语言,内存,数组,引用 From: https://blog.csdn.net/huipeng926/article/details/143964041