数组的重难点

一、数组的本质以及特点

  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)或者数组)

 

 

 

 

 

 

 

 

 

 



posted @ 2020-02-20 17:16  she_will  阅读(631)  评论(0编辑  收藏  举报