数组的定义与为数组元素分配空间和赋值是分开进行的,称为动态初始化。

在数组定义的同时就为数组元素分配空间并赋值,称为静态初始化。

一维数组举例:

//动态初始化int[] intArr;intArr=new int[3];intArr[0]=1;intArr[1]=2;intArr[2]=3;//动态初始化int[] intArr2;intArr2=new int[] {1,2,3};//静态初始化int[] intArr3= {1,2,3};

二维数组举例:

//动态初始化int[][] intArr;intArr=new int[2][];intArr[0]=new int[] {1,2,3};intArr[0]=new int[] {4,5,6};//动态初始化int[][] intArr2;intArr2=new int[2][];intArr[0]=new int[3];intArr[1]=new int[2];//静态初始化int[][] intArr3= {{1,2,3},{4,5}};

注意:

1.数组的效率高。但是数组空间大小被固定,在其生命周期内不可变。

2.引用类型数组默认初始化为null,数值类型数组默认初始化为0,char类型数组默认初始化为(char)0,boolean类型的数组默认初始化为false。

3.intArr1=intArr2,代表的是将intArr2的引用赋值给intArr1,此时intArr1和intArr2都是指向intArr2原本指向的对象。

关于数组元素的输出:

1.使用for循环

int[][] intArr= {{1,2,3},{4,5},{6,7,8,9}};for (int i = 0; i < intArr.length; i++) {for (int j = 0; j < intArr[i].length; j++) {System.out.print(intArr[i][j]);}System.out.println();}

2.使用增强的for

int[][] intArr= {{1,2,3},{4,5},{6,7,8,9}};for (int[] FirstDimensional : intArr) {for (int SecondDimensional : FirstDimensional) {System.out.print(SecondDimensional);}System.out.println();}

3.使用Arrays.toString()或者Arrays.deepToString(),这两个是Arrays类中的静态方法。

//二维的用Arrays.deepToString()
int[][] intArr= {{1,2,3},{4,5},{6,7,8,9}};
System.out.println(Arrays.deepToString(intArr));
//一维的用Arrays.toString()
int[] intArr2= {1,2,3};
System.out.println(Arrays.toString(intArr2));

Arrays类中的常用Static方法:

1.equals和deepEquals

int[][] intArr11 = {{1,2,3},{4,5},{6,7,8,9}};
int[][] intArr22 = {{1,2,3},{4,5},{6,7,8,9}};
System.out.println(Arrays.deepEquals(intArr11, intArr22));//结果为True
int[] intArr1 = {1,2,3};
int[] intArr2 = {1,2,3};
System.out.println(Arrays.equals(intArr1, intArr2));//结果为True

2.fill,下面是fill方法的两种重载

int[] intArr=new int[3];
Arrays.fill(intArr, 3);
System.out.println(Arrays.toString(intArr));//输出结果为【3,3,3】
int[] intArr=new int[3];
Arrays.fill(intArr, 3);
Arrays.fill(intArr, 1, 2, 8);
System.out.println(Arrays.toString(intArr));//输出结果为【3,8,3】

3.sort

int[] intArr= {3,2,5,4,6,7,1,9,0};
Arrays.sort(intArr);
System.out.println(Arrays.toString(intArr));//输出结果是[0, 1, 2, 3, 4, 5, 6, 7, 9]

4.binarySearch:二分法查找,是应用于已经排序过的数组,来找出指定的元素下标

int[] intArr= {3,2,5,4,6,7,1,9,0};
System.out.println(Arrays.binarySearch(intArr, 0));//这里还没有对数组进行排序,输出结果为-1(错误的)
Arrays.sort(intArr);
int index=Arrays.binarySearch(intArr, 5);
System.out.println(index);//对已经排序过的数组进行查找元素,其输出结果为5(正确的)

关于数组的拷贝:

1.System.arrayCopy();

int[] intArray= {1,2,3,4,5};
int[] copyArray=new int[3];
//已经存在两个数组对象,使用System.arrayCopy。
System.arraycopy(intArray, 0, copyArray, 0, copyArray.length);//参数意义:源数组,原数组开始copy的index,目标数组,目标数组开始copy的index,copy长度
System.out.println(Arrays.toString(copyArray));

2.Arrays.copyOf()

String[] strArr= {"I","Love","You"};
//当前只有一个数组,使用copyOf方法。是先创建一个指定长度的数组,之后再使用System.arrayCopy(),将数据拷贝进去。返回一个拼接的String字符串System.out.println(Arrays.toString(Arrays.copyOf(strArr, 3)));//结果是 [I, Love, You]

3.clone(),该方法是Object类中protect类型方法,用来克隆一个完全一致的对象。可以在数组中使用。

int[] intArray2= {1,2,3,4,5};
//clone()方法
int[] clone=intArray2.clone();
clone[0]=1000;
System.out.println(Arrays.toString(intArray2));//结果为【1,2,3,4,5】
System.out.println(Arrays.toString(clone));//结果为【1000,2,3,4,5】
System.out.println(clone);

上面的例子2、3都是使用一维数组举例的,都是为数组元素开辟了新的空间的。这种叫做深度拷贝。

如果为二维数组使用Arrays.copyOf()或者数组对象.clone(),都只创建了一个一维数组A,然后将第二维数组元素的引用赋值给了一维数组A,并没有为第二维度开辟新的空间。所以改变数组元素的时候,是相互影响的。这种叫做浅拷贝。如下:

Double[][] douArr=new Double[][] {{1.2,3.4},{5.66},{7.88,9.0,7.0}};//二维数组的copyOf()Double[][] copy=Arrays.copyOf(douArr, 3);//这里修改了拷贝数组的第一个元素copy[0][0]=100000.00;//输出拷贝数组for (Double[] FirstcopyDou : copy) {for (Double SecondCopyDou : FirstcopyDou) {System.out.print(SecondCopyDou+",");//100000.0,3.4,5.66,7.88,9.0,7.0,}}System.out.println();//这里输出被拷贝数组for (Double[] FirstcopyDou : douArr) {for (Double SecondCopyDou : FirstcopyDou) {System.out.print(SecondCopyDou+",");//100000.0,3.4,5.66,7.88,9.0,7.0,}}

下面是简略的内存分配图:


提到数组,这里扩展一下可变参数方法(这个方法是将传入的参数包装成一个数组,以助于我们可以不用显示创建数组):

下面是方法举例:

package com.claire.vairableParameter0701;public class BookTestVar {public static void main(String[] args) {// TODO Auto-generated method stubVarString varObj=new VarString();varObj.var("I","Love","you");//可以自行判断去调用参数为String的方法varObj.var(new String[]{"who","am","I"});//可以自行判断去调用参数为String的方法varObj.var(1,2,3,4,5);//可以自行判断去调用参数为Integer的方法varObj.var(new Integer(1),new Integer(2));//可以自行判断去调用参数为Integer的方法}}class VarString{//这里定义一个可变参数列表的方法,限定只能输入String类型的0个或多个参数public void var(String... str) {for (String getStr : str) {System.out.print(getStr+" ");}System.out.println();}//重载上述的var()方法,限定只能输入Integer类型的0个或多个参数public void var(Integer... i) {for (Integer getI : i) {System.out.print(getI);}System.out.println();}
}

上面程序的输出结果为:

I Love you
who am I
12345
12

通过上述程序举例,可以明显看出,我们的可变参数列表的方法是将参数包装成了一个数组,所以可以直接使用增强的for来获取元素。

注意:

1.可变参数列表的方法,是可以接受无参的调用的。如var();---------这样调用的时候,上述程序就会出现问题,因为无法判断应该调用哪个var方法(方法重载是根据参数个数、类型和顺序判断,当无参的时候,是判断不出的)。所以,当我们想使用这种方法来构建一个数组的时候,要么只使用一个可变参数列表的方法,要么就不要用。

自动化测试学习之路--java 数组相关推荐

  1. 自动化测试学习之路--java String、StringBuilder

    Java中的String和StringBuilder类: 1.String对象是不可变的.每一个看起来修改了String值的方法,实际上都是创建了全新的String对象.代码示例如下: String ...

  2. Java学习之路 -- Java怎么学?

    文章目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...

  3. java学习之路---java学习的方法和java学习路线

    转载于: http://blog.csdn.net/zhangerqing 前段时间逛论坛,总会有很多新手很迷茫,问到:到底该怎么学好Java,这个问题很重要,尤其对于像我们这样大多数都是靠自学的人来 ...

  4. 自动化测试学习之路--json、dom编程

    1.json: json是JavaScript Object Notation,是一种数据传输格式. 以下程序都是在浏览器的Console下执行的. 创建一个javaScript的对象: var st ...

  5. Java学习之路-----Java基础简介,基础语法,Java标识符,修饰符,关键字与注释

    这里写目录标题 Java简介 Java发展历程 Java语言平台版本 Java语言的特点 Java语言跨平台原理--JVM JRE和JDK JDK安装路径下的目录解释 Java基础语法 Java标识符 ...

  6. 从0到1 Android安全学习之路 -- Java 字节码和 Dalvik 字节码

    Java 字节码和 Dalvik 字节码 概述 源代码样例 Java 字节码 Dalvik 字节码 总结 概述   本篇博客将讲述 Java 源代码到字节码,字节码转汇编,以及 Android 中 J ...

  7. shell脚本编程学习之路-shell数组

    1.数组的介绍 在开发shell脚本时,定义变量采用的形式为"a=1;b=2;c=3",变量多了再一个一个定义就比较麻烦,并且要是有多个不确定的变量内容也会难以进行变量控制,于是为 ...

  8. 二狗子的C语言学习之路(数组)

    一.数组的概念: 1.数组:由多个类型相同数据的集合 2.元素访问:a[n]~a[n-1] 二.定义 1.int inta[10]={0,1,2,3}: 2.#define N 10 //宏定义 in ...

  9. 什么都不会的学习之路——Java多线程

    多线程 启动一个线程 创建多线程-继承线程类 使用多线程,就可以做到多件事情同时发生 1.设计一个类KillThread 继承Thread,并且重写run方法 2.启动线程办法: 实例化一个KillT ...

最新文章

  1. bing浏览器_微软推出全新 Edge 浏览器,这 3 大特色亮点 Chrome 都没有
  2. JavaScript中对象数组,如何给对象添加一个新属性
  3. python教程书籍-程序员大佬,给Python零基础入门书籍教程的一些建议!
  4. maven实战总结,工作中常见操作
  5. P3293 [SCOI2016]美味
  6. Spring集成文件轮询和测试
  7. 2020年计算机视觉学习指南
  8. MySQL GUI图形化界面常用软件推荐
  9. c++怎么确定一个整数有几位_《小数乘整数》说课稿
  10. Java学习笔记——JDBC
  11. 计算机设备耗材管理系统,实验室耗材管理方法、系统、计算机设备和存储介质与流程...
  12. 计算机配置里面没有网络选项,win7网络共享中心里面的更改适配器设置里面没有无线网络连接...-win7适配器没有无线网络连接,win7网络适配器未...
  13. 转 vo、po、dto、bo、pojo、entity、mode如何区分
  14. 关于lvm扩容的方式
  15. 05-阿里云视频点播服务与谷粒学院整合视频点播技术
  16. iterm2 + oh-my-zsh 让你的命令行用的飞起
  17. 萝卜APP4.30 萝卜APP 追影兔4.30最新开源码
  18. cisco IP电话 qos
  19. 宏晶微电子 笔试题凉经
  20. BILSTM模型介绍

热门文章

  1. pytrhon画图matplolib
  2. 微信退款参数格式错误
  3. win7 64下安装mysql-python报错的解决办法
  4. mysql删除重复记录语句的方法
  5. 排序系列02--选择排序
  6. Linux操作命令(二)
  7. CountDownLatch和CyclicBarrier的区别
  8. 将ubuntu安装在用剩下的硬盘改装成的移动硬盘时遇到的问题及解决办法
  9. 从程序员角度--解决ipad白苹果问题的最佳办法---纠正网上的错误言论
  10. hive:默认允许动态分区个数为100,超出抛出异常: