zoukankan      html  css  js  c++  java
  • 数组的重难点

    一、数组的本质以及特点

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


  • 相关阅读:
    MVC<2:路由映射原理2>
    分支限界>0/1背包 小强斋
    分支限界>装载问题 小强斋
    解空间树搜索 及 最优解 小强斋
    算法>NP难度和NP完全的问题 小强斋
    算法>NP难度和NP完全的问题 小强斋
    分支限界>装载问题 小强斋
    分支限界>0/1背包 小强斋
    分支限界>15谜问题 小强斋
    分支限界>15谜问题 小强斋
  • 原文地址:https://www.cnblogs.com/shewill/p/12257409.html
Copyright © 2011-2022 走看看