数组的重难点
一、数组的本质以及特点
1、数组本质上就是一组数的集合。
2、我们把数组定义为“在内存中开辟连续的存储空间。存储相同类型数据的有序集合”
二、数组声明以及初始化
public static void main(String[] args) { // TODO Auto-generated method stub /* * 声明一个数组的方法 * int[] arrs; * 这种方法不推荐 * String str[]; */ //声明一个数组并初始化 //1:静态初始化,指定元素个数和元素内容 int[] arrs=new int[] {1,2,3}; System.out.println(arrs.length); //2:动态初始化,指定元素个数,不指定元素的具体数据 int[] ars=new int[4]; System.out.println(ars.length);
//输出为[I@15db9742
System.out.println(ars);
}
打印内容
[I@15db9742:
[:当前对象是一个数组类型
I:代表数组的类型是int类型
@:自动连接
15db9742:当前数组对象的hash值
三、数组的常见属性
1、length属性可以获取数组的长度,元素的个数
public static void main(String[] args) { // TODO Auto-generated method stub //声明一个int类型的数组 int[] arrs=new int[10]; System.out.println(arrs.length); } 》》》10
2、索引属性:数组中存储的元素,都存在一个下标(索引),我们可以通过索引获取、修改元素到数组中。要注意的是数组的索引是从0开始的。
//数组可以通过索引获取和修改数据 System.out.println("查看第10个元素是:"+arrs[9]); //修改第5个元素值为20 arrs[4]=20; System.out.println("第5个元素是"+arrs[4]);
四、数组的内存分析
!!!在Java代码中,看到new:
1)在堆内存中开辟空间
2)初始化(赋初始值)
3)指向引用(将堆中的地址复制给栈存放)
五、关于数组的一些问题
Q1:为什么数组的索引都是从0开始的?
A1:根本原因在于可以通过简单的计算方式来快速定位到元素的地址值。在数组中,元素的地址=首元素地址+(索引*元素的宽度)。数组中各个元素都宽度都是一致的。所以数组的地址本质上就是首元素的地址。因此使用从0开始能够快速的通过索引定位元素,一旦从数组中对于元素进行各项操作,如果知道当前元素的索引就能够快速进行操作。
Q2:一般对于数据都有CRUD的操作,为什么数组不说增加和删除?
A2:数组的长度是不可以变的!为了能够做到添加元素的操作,需要重新开辟一个新的数组,并且要将旧数组中的数据拷贝到新数组中去,这些操作都是极其消耗资源的。并且数组对于添加操作时是比较慢的。删除同上,需要开辟一个新的数组,并且频繁的做拷贝。
Q3:为什么说数组的长度一旦指定不可以更改?
A2:数组开的是内存的连续的存储空间,导致如果出现长度可以随意修改是特别消耗内存资源的。很多是很难出现内存够用,但是实质的连续空间不够用导致内存溢出问题。所以就直接将数组的长度变为不可更改。
六、数组的迭代
public static void main(String[] args) { // TODO Auto-generated method stub int[] arrs=new int[6]; int value=10; for(int i=0;i<arrs.length;i++) { arrs[i]=value+(i*2); } System.out.println("查看数组的长度"+arrs.length); System.out.println(Arrays.toString(arrs)); //将当前arrs中的数据依次获取 System.out.println("-------普通循环---------"); for(int i=0;i<arrs.length;i++) { System.out.println("索引是"+i+"的元素的值"+arrs[i]); } System.out.println("-------增强foreach循环--------"); for(int num:arrs) { System.out.println(num); } }
PS:增强for循环
增强for循环用起来比较方便。
区别:
增强for循环必须有被遍历的目标(如集合或数组)。
普通for循环遍历数组的时候需要索引。
增强for循环不能获取下标,所以遍历数组时最好使用普通for循环。
格式:for(数据类型 变量名:被遍历的集合(collection)或者数组)