zoukankan      html  css  js  c++  java
  • java基础 数组

    什么是数组,一组数据,一堆数据:

    所谓数组,是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种数据形式。这些按一定顺序排列的同类型数据的集合称为数组。而数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引从0开始,步长是1,有点像Excel表格的行号,逐行递增。 好比宾馆的房间.

    数组的定义:相同类型、若干变量、有序
    元素:
    索引:从0 开始,步长为1。
    变量的定义格式:
    数据类型 变量名 = 初始化值
    数组的定义格式:
    数据类型[] 数组名; 
    int[] ages;
    数组必须初始化,
    基本数据类型:byte,short,int,long,float,double,char,boolean
    引用数据类型:类,接口,数组.
    -------------------------------------------------
    变量的定义:
       数据类型  变量名;  如: int  age;
    数组的定义:
       方式1: 数组元素的类型[]  数组名;   int[] ages;推荐的. 可以吧int[]看成是一种数据类型,int类型的数组类型.
       方式2:数组元素的类型  数组名[];    int ages[];
    ------------------------------------------------------
    数组必须先初始化,才能使用,因为初始化表示在内存中分配空间.

    数组的初始化

    Java中数组必先初始化后才能使用,所谓初始化就是给数组元素分配内存,并为每个元素赋初始值。
    初始化数组的两种方式:
    静态初始化;
    动态初始化;
    无论,以哪种方式初始化数组,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。也就是说数组是定长的。
       数组是定长的: 数组一旦初始化成功,数组中的元素个数就已经固定了,不能更改,如果需要更改,只能重新做初始化.

    数组的静态初始化操作:

    特点:由我们自己来为每一个数组元素设置初始化值,而数组的长度由系统(JVM)决定.

    语法:

    数组元素类型[]  数组名 = new 数组元素类型[]{元素1,元素2,元素3,.......};
       举例:
       int[] nums = new  int[]{1,3,5,7,9};
       简单写法,必须声明之后,立刻初始化,不能先声明后初始化:
        int[] nums = {1,3,5,7,9};

     

     数组的动态初始化操作:

     由我们来设置数组的元素个数(数组长度),而每一个数组元素的初始值有系统决定.

     语法:

    数组元素类型[]  数组名 = new  数组元素类型[ length ];
        比如:
        int[] ages = new  int[100];
    -------------------------------------------------------------
      int[] nums = new  int[5]{1,3,5,7,9};//写法是错误的,不能同时使用静态初始化和动态初始化.

    什么时候使用静态初始化,什么时候使用动态初始化.

    当我们事先知道,需要存储哪一些数据的时候,选用静态初始化.
    当我们事先不知道,需要存储哪些数据的时候,只能使用动态初始化.

     

    数组的基本操作

    1.数组的基本操作

           获取元素:  元素类型 变量 =  数组名[index];
           设置元素:  数组名[index] = 值;
           遍历数组元素: 建议使用for循环,事先知道循环的次数.
           数组长度:  int len = 数组名.length;  length是属性,不是方法.
           索引范围:  从0开始,逐一递增.   [0,数组名.length-1]

    2:操作数组常见异常:

     NullPointerException:空指针异常(空引用).
                当数组还未初始化,就直接操作数组.
            String[] bs = null;
            System.out.println(bs.length)
           ArrayIndexOutOfBoundsException:数组的索引越界异常.

    3:获取数组最大最小元素(getMax,getMin).

    4:打印数组元素:

    直接打印数组的时候,打印出来是hashCode值,如[I@7439aca7.
           我们不喜欢,我们想打印数组的时候,把该数组的元素打印出来.
            String[] arr = {"A","B","C","D","E"};
    定义方法打印:
    字符串表示形式由数组的元素列表组成,括在方括号("[]")中。相邻元素用字符 ", "(逗号加空格)分隔。
    
    打印格式:[A, B, C, D, E]

     5:逆序排列数组元素 

    原数组:[A, B, C, D, E]
            逆序操作
            新数组:[E, D, C, B, A]

    6:元素出现索引(第一次/最后一次),线性搜索.

    int[] arr = {10,20,30,10,50,-30,10};
             获取元素10在arr数组中第一次出现的索引(indexOf):   0
             获取元素10在arr数组中最后一次出现的索引(lastIndexOf):6

     

    main方法的数组参数

    main方法是static修饰的,说明直接使用Hello类调用即可.
    在底层是JVM通过Hello.main(new String[]{});
    main方法的String数组参数,其实是暴露给程序运行者的,用于给程序传递一个数据信息.

     

    多维数组

    前面说了,数组是多个数据的集合.
    int[] arr = new int[] {1,3,5,7,9};
    如果现在有多个数组,我想把多个数组保存在一个集合中,此时我又应该如何完成.
    int[] arr1 = {1,2,3};
    int[] arr2 = {4,5};
    int[] arr3 = {6};
    把上述的每个数组都作为一个元素,那么此时元素的类型为:int[].

    数组的语法:

    数组元素类型[] 数组名;
    int[][]  arr = new int[][]   {
        arr1 ,arr2,arr3
    };
    int[][]  arr = new int[][]   {
        {1,2,3} ,
        {4,5},
        {6}
    };
    多维数组:数组中的数组,与C语言的区别
    语法:
    数组元素类型[][] 数组名;
    对多维数组的理解
    int[3][5]:二维数组三个元素,一维数组5个元素
    遍历二维数组里的元素
    理解二维数组的值传递机制
    一维数组:数组中的每一个元素都是一个值(基本类型和引用类型的值).
    二维数组:数组中的每一个元素又是一个一位数组.
    三维数组:数组中的每一个元素又是一个二维数组.
    -------------------------------------------------------------------------------
    严格上说,在Java中不存在多维数组的概念,和C语言做区分,一般称之为数组中的数组.

    二维数组的初始化操作:

    静态初始化:

    int[][]  arr = new int[][]   {
        {1,2,3} ,
        {4,5},
        {6}
    };

    动态初始化:

    int[][]  arr = new int[3][5] ;创建一个长度为3的二维数组,每一个元素(一维数组)的长度为5.
    int[][]  arr = new int[0][5] 

    针对于N维数组,需要N个循环嵌套.

     

     java5对数组的新语法支持

    Java5对数组的新语法支持:
       1):增强for循环-foreach
       2):方法的可变参数

    增强for循环-foreach:

    需求:定义一个数组,使用循环迭代出数组中的每一个元素.

    使用for循环的操作如下:

     

    其实,我们在使用循环迭代数组的时候,往往是不关心迭代变量(数组的索引),有没有更好的方式,迭代数组元素的时候,就只操作数组元素,不去操作数组的索引. 从Java5开始(JDK1.5)开始,Java提供了一种新的语法:增强for循环(foreach). 语法:

    for(数组元素类型 变量  :   数组名)
    {
           循环体
    }

    通过反编译工具查看字节码,发现foreach其实在底层依然是使用for循环+索引来操作数组的.
    我们把增强for循环,称之为编译器的新特性---->语法糖.
    语法糖的最大甜头就是:让开发者写更少,更简单的代码,完成相同的功能.
    -----------------------------------------------------------
    for循环功能比foreach更彪悍.
    ------------------------------------------------------------
    如果迭代数组元素,而不关心数组的索引的时候,首选使用foreach.
    -----------------------------------
    foreach还未结束--->集合框架.

     方法的可变参数:

    需求:编写一个方法,统计使用数组传递过来的总和.

    但是心里不爽:
        1):为了求多个数之和,我还得先创建一个数组来存储数据.
        2):如果多个数是变化的,比如求3个数之和,变成求5个数之和.......,还得去修改我的数组,但是数组是定长的.
    说人话:我期望调用求和的方法是这样调用的.

    要解决该问题,必须使用Java5的另一个新特性,方法的可变参数,说的是参数的个数可变.

     

    方法的可变参数,其实也是一个语法糖,编译器级别的新特性,让开发者写代码更简单.
    
    方法的可变参数其底层是就是一个数组类型.
    
    可变参数必须作为方法的最后一个参数,避免参数的歧义性.
      推论:方法最大只有一个可变参数.

    数组元素的拷贝

    数组拷贝:
    从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
    从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。
    被复制的组件的编号等于 length 参数。
    源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。
    public static void arraycopy(int[] src, int srcPos, int[] dest,int destPos, int length) {
    }

     Java自带数组工具类Arrays

    数组的算法操作,使用太频繁了,SUN公司就直接在JDK中提供了一个数组的工具类(Arrays).
    java.util.Arrays类:
    int binarySearch(type[] arr,type key)    使用二分法查找数组里某元素并返回其索引,若找不到返回负数.
    void sort(type[] arr)    使用调优后的快速法对指定数组排序。
    String toString(type[] arr)    返回指定数组内容的字符串表示形式。
    public static type[] copyOf(type[] original, int newLength)    复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
    
    ---------------------------------------------
    使用注意:必须java.util.Arrays.方法(参数);

     

  • 相关阅读:
    Linux系统学习之网络管理
    EntityFramework 6.1.2-beta2
    微软开源的30个基础设施项目-C#
    vs2015 Android SDK
    批量删除空的文件夹
    统一者管理员指南(Unifier Administration Guide)中文
    XXX全球 IP 地址库
    mssql2008R2 RCU-6083:ALTER database FWC SET READ_COMMITTED_SNAPSHOT ON
    ORA-01843: 无效的月份,执行sql语句更改为美国语言后仍然失败的解决办法
    Win7如何安装IIS来浏览ASP网站
  • 原文地址:https://www.cnblogs.com/ctztake/p/8283823.html
Copyright © 2011-2022 走看看