Java 数组分析及简单实例

Java 数组

 一、什么是数组

数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的!

但是这只是数组的最表面的东西!深一点?就是这样:数组是一个简单的复合数据类型,它是一系列有序数据的集合,它当中的每一个数据都具有相同的数据类型,我们通过数组名加上一个不会越界下标值来唯一确定数组中的元素。

还有更深的,那就是数组是一个特殊的对象!!(对于这个LZ理解的不是很好,对JVM也没有看,所以见解有限)。

不管在其他语言中数组是什么,在Java中它就是对象。一个比较特殊的对象。

public class Test {
  public static void main(String[] args) {
    int[] array = new int[10];
    System.out.println("array的父类是:" + array.getClass().getSuperclass());
    System.out.println("array的类名是:" + array.getClass().getName());
  }
}
-------Output:
array的父类是:class java.lang.Object
array的类名是:[I 

从上面示例可以看出,数组的是Object的直接子类,它属于“第一类对象”,但是它又与普通的java对象存在很大的不同,从它的类名就可以看出:[I,这是什么东东??在JDK中我就没有找到这个类,话说这个"[I”都不是一个合法标识符。怎么定义成类啊?所以我认为SUM那帮天才肯定对数组的底层肯定做了特殊的处理。

我们再看如下示例:

public class Test {
  public static void main(String[] args) {
    int[] array_00 = new int[10];
    System.out.println("一维数组:" + array_00.getClass().getName());
    int[][] array_01 = new int[10][10];
    System.out.println("二维数组:" + array_01.getClass().getName()); 

    int[][][] array_02 = new int[10][10][10];
    System.out.println("三维数组:" + array_02.getClass().getName());
  }
}
-----------------Output:
一维数组:[I
二维数组:[[I
三维数组:[[[I

通过这个实例我们知道:[代表了数组的维度,一个[表示一维,两个[表示二维。可以简单的说数组的类名由若干个'['和数组元素类型的内部名称组成。不清楚我们再看:

public class Test {
  public static void main(String[] args) {
    System.out.println("Object[]:" + Object[].class);
    System.out.println("Object[][]:" + Object[][].class);
    System.err.println("Object[][][]:" + Object[][][].class);
    System.out.println("Object:" + Object.class);
  }
}
---------Output:
Object[]:class [Ljava.lang.Object;
Object[][]:class [[Ljava.lang.Object;
Object[][][]:class [[[Ljava.lang.Object;
Object:class java.lang.Object

从这个实例我们可以看出数组的“庐山真面目”。同时也可以看出数组和普通的Java类是不同的,普通的java类是以全限定路径名+类名来作为自己的唯一标示的,而数组则是以若干个[+L+数组元素类全限定路径+类来最为唯一标示的。这个不同也许在某种程度上说明了数组也普通java类在实现上存在很大的区别,也许可以利用这个区别来使得JVM在处理数组和普通java类时作出区分。

我们暂且不论这个[I是什么东东,是由谁来声明的,怎么声明的(这些我现在也不知道!但是有一点可以确认:这个是在运行时确定的)。先看如下:

public class Test {
  public static void main(String[] args) {
    int[] array = new int[10];
    Class clazz = array.getClass();
    System.out.println(clazz.getDeclaredFields().length);
    System.out.println(clazz.getDeclaredMethods().length);
    System.out.println(clazz.getDeclaredConstructors().length);
    System.out.println(clazz.getDeclaredAnnotations().length);
    System.out.println(clazz.getDeclaredClasses().length);
  }
}
----------------Output:
0
0
0
0
0

从这个运行结果可以看出,我们亲爱的[I没有生命任何成员变量、成员方法、构造函数、Annotation甚至连length成员变量这个都没有,它就是一个彻彻底底的空类。没有声明length,那么我们array.length时,编译器怎么不会报错呢?确实,数组的length是一个非常特殊的成员变量。我们知道数组的是Object的直接之类,但是Object是没有length这个成员变量的,那么length应该是数组的成员变量,但是从上面的示例中,我们发现数组根本就没有任何成员变量,这两者不是相互矛盾么?

public class Main {
  public static void main(String[] args) {
    int a[] = new int[2];
    int i = a.length;
  }
}

打开class文件,得到main方法的字节码:

0 iconst_2          //将int型常量2压入操作数栈
  1 newarray 10 (int)     //将2弹出操作数栈,作为长度,创建一个元素类型为int, 维度为1的数组,并将数组的引用压入操作数栈
  3 astore_1          //将数组的引用从操作数栈中弹出,保存在索引为1的局部变量(即a)中
  4 aload_1          //将索引为1的局部变量(即a)压入操作数栈
  5 arraylength        //从操作数栈弹出数组引用(即a),并获取其长度(JVM负责实现如何获取),并将长度压入操作数栈
  6 istore_2          //将数组长度从操作数栈弹出,保存在索引为2的局部变量(即i)中
  7 return           //main方法返回

在这个字节码中我们还是没有看到length这个成员变量,但是看到了这个:arraylength ,这条指令是用来获取数组的长度的,所以说JVM对数组的长度做了特殊的处理,它是通过arraylength这条指令来实现的。

      二、数组的使用方法

通过上面算是对数组是什么有了一个初步的认识,下面将简单介绍数组的使用方法。

数组的使用方法无非就是四个步骤:声明数组、分配空间、赋值、处理。

声明数组:就是告诉计算机数组的类型是什么。有两种形式:int[] array、int array[]。

分配空间:告诉计算机需要给该数组分配多少连续的空间,记住是连续的。array = new int[10];

赋值:赋值就是在已经分配的空间里面放入数据。array[0] = 1 、array[1] = 2……其实分配空间和赋值是一起进行的,也就是完成数组的初始化。有如下三种形式:

int a[] = new int[2];  //默认为0,如果是引用数据类型就为null
    int b[] = new int[] {1,2,3,4,5};
    int c[] = {1,2,3,4,5};

处理:就是对数组元素进行操作。通过数组名+有效的下标来确认数据。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java开发学习 Java数组操作工具

    看到网上的一段关于对数组操作的代码,觉得有用,在此备用. import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Random; import java.util.TreeMap; /** * @desc 数组操作工具 * @author OuyangPeng * @datatime 2013-5-11 10:31:02 * */ public class MyArrayUtil

  • java 中数组初始化实例详解

    1.数组初始化 定义数组的方式: int[] arr1; 或  int arr1[]; 数组初始化 通过上边的定义,我们只是得到了一个数组的引用.这时已经为引用分配了存储空间,但是还没有给数组对象本身分配任何空间.想要给数组对象分配存储空间,必须使用初始化表达式. a.在数组创建的地方进行初始化,如: int[] arr1 = {1,2,3,4,5}; 这种方式等价于使用new来进行存储空间分配. b.给数组的引用赋值,如: int[] arr1 = {1,2,3,4,5}; int[] arr

  • 老生常谈java中的数组初始化

    数组的初始化可以分为两种: 1.静态初始化 2.动态初始化 静态初始化: 例: String[] str = new String[]{"A","B","C"}; String str[] = new String[]{"A","B","C"}; String str = {"A","B","C"}; 动态初始化: 例: Str

  • java数组、泛型、集合在多态中的使用及对比

    我们在使用数组,泛型集合的过程中不可避免的会碰到多态,或者说什么情况下能如何使用父数组引用子数组(集合.泛型)呢? 数组在多态中的使用 元素为父类型的数组引用可指向元素为子类型的数组对象 当数组被调用时由当前引用确定数组元素的类型 当元素为父类型的数组引用指向了元素为子类型的数组对象时,不可通过父类型的数组引用向集合加入除子类型及其下层级的之外的元素(可通过编译,运行过程出错) /*验证: *animals和dogs可以引用同一个数组 *当animals引用数组时,数组元素为Animal类型 *

  • 浅谈java中的一维数组、二维数组、三维数组、多维数组

    这个数组可以看做新手学习,从一维数组 到 多维 数组 循环渐进,其实看起也很简单,一看便知,众所周知,一维.二维或许经常用到,用到二维以上应该就很少了. public class test { public static void main(String[] args) { /*一维数组*/ int num[] = {0,1,2}; /*下面输出 3 行数据,0 ~ 2*/ for (int i = 0; i < num.length; i++) { System.out.println("

  • Java实现数组反转翻转的方法实例

    数组翻转的方法(java实现),数组翻转,就是将数组倒置,例如原数组为:{"a","b","c","d"},那么翻转后的数组为{"d","c","b","a"}. [方法一]使用集合个工具类: Collections.reverse(ArrayList) 将数组进行反转: import java.util.ArrayList;import java

  • java 输入一个数字组成的数组(输出该数组的最大值和最小值)

    一.需求分析: 1.输入一个数组----------------------------------------->程序要接收一组输入的数组,没有明确这组数组有多大 2.一个数字组成的数组-------------------------------->接收到的数组只能是数字 3.输出接收到数组的最大值和最小值-------------->得到最大和最小值 二.技术难点 1.怎么从用户输入获取到一个数字数组? 可以用BufferedReader类:从字符输入流中读取文本,缓冲各个字符,从

  • Java数组优点和缺点_动力节点Java学院整理

    数组是Java语言的基本知识之一,在深入学习Java基础后,我们都知道那些容器,在之后,在我们学习.工作的过程中基本就是使用容器了,很少很使用数组,那么为什么还要有数组呢,我也是今天才遇到这个问题,专门的找资料学习了一下. 数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力,当然现在有泛型,保存类型的区别已经不大了. 数组较容器,最大的优点就是效率.在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式,数组就是一个简单的线性序列,这使得元素访问非常快速,无论使用

  • Java 数组分析及简单实例

    Java 数组  一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一点?就是这样:数组是一个简单的复合数据类型,它是一系列有序数据的集合,它当中的每一个数据都具有相同的数据类型,我们通过数组名加上一个不会越界下标值来唯一确定数组中的元素. 还有更深的,那就是数组是一个特殊的对象!!(对于这个LZ理解的不是很好,对JVM也没有看,所以见解有限). 不管在其他语言

  • Java实现九宫格的简单实例

     Java实现九宫格的简单实例 九宫格:共有三行三列九个格子,从1到9共九个数字不重复地填入这九个格子中,条件是每行.每列.两个对角线上三个数字的和相等. 下面用Java实现九宫格: public class NineTable { public static void main(String[] args) { int arr[][] = new int[3][3]; int a = 2; int b = 3 / 2; for (int i = 1; i <= 9; i++) { arr[a+

  • 原生js的数组除重复简单实例

    js对数组的操作在平常的项目中也会遇到,除去一些增加,或者减少的操作外,还有一个比较重要的操作就是数组的除重,通过数组的除重,我们可以将一个数组中存在的多个重复的数组进行清理,只留下不重复的.另外下面我介绍一种原生就s的数组除重方法. Array.prototype.check= function(){ for(var i=0;i<this.length;i++){ for(var j=i+1;j<this.length;j++){ if(this[i]==this[j]){ this.spl

  • java数组元素的引用实例讲解

    对于数组来说,我们想要对其中的一个元素进行引用,那就离不开new的使用.大家在学习new的时候,一般是以新建和初始化的身份出现的.如果是用在数组的引用上,那么会以运算符的方式出现.下面我们就来看看数组元素,在new运算符中引用的具体内容吧. 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素,数组元素的引用方式为: (1)arrayName[index] index为数组元素下标,可以使整形常亮或整形表达式.如: a[3], b[i], c[6*i]; (2)数组元素的下标从0开始:

  • Java数组常用排序算法实例小结

    本文实例讲述了Java数组常用排序算法.分享给大家供大家参考,具体如下: 1.冒泡排序法 SortArray_01.java public class SortArray_01 { public static void main(String args[]) { int[] array = { 14, 5, 86, 4, 12, 3, 21, 13, 11, 2, 55, 66, 22 }; // 创建一个初始化的一维数组array System.out.println("未排序的数组:&quo

  • Java动态代理分析及简单实例

      Java动态代理 要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式. 在我看来所谓的代理模式,和23种设计模式中的"装饰模式"是一个东西.23种设计模式中将它们作为两种模式,网上也有些文章讲这两种模式的异同,从细节来看,确实可以人为地区分这两种模式,但是抽象到一定高度后,我认为这两种模式是完全一样的.因此学会了代理模式,也就同时掌握了装饰模

  • JavaScript获取多个数组的交集简单实例

    在项目中需要取得多个数组的交集,故本例只是适用于特定场景.比如A数组 var a = {1000,10001,10002,10003}; B数组 var b = {10002, 10003}; C数组var c = {10003}; 需要取得这三个数组的交集数组.      具体思路为:先初始一个最小数组为A数组,元素个数最小的也是数组A的长度.然后再迭代各个数组,取得这几个数组长度最短的为最小长度,同时得到长度最短数组.然后,迭代最小数组与各个数组,开始比较元素相等,使用计数器来判断是否该元素

  • java读取大文件简单实例

    我要从一个文本文件中提有用的数据 文本文件200多MB 是不是可以建一个缓存来把有用的数据一段一段的提出来,请问该怎么做? --------------------------------------------------------------- 呵呵,200MB而已... JAVA中可以使用内存映射文件来操作大文件. 最大可达2GB. 下面是个简单的示例,更具体的自己看Java API DOCS或相关资料 复制代码 代码如下: import java.io.*; import java.n

  • java使用jdbc连接数据库简单实例

    本文为大家分享了java使用jdbc连接数据库的具体代码,供大家参考,具体内容如下 package com.tr.jdbc; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.commons.dbcp2.BasicDataSource; public class CollectionFac

  • Java数组队列概念与用法实例分析

    本文实例讲述了Java数组队列概念与用法.分享给大家供大家参考,具体如下: 一.队列的概念 (1)队列也是一种线性结构 (2)相比数组,队列对应的操作是数组的子集 (3)只允许在一端插入数据操作,在另一端进行删除数据操作,进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列) (4)队列是一种先进先出的数据结构(FIFO) 此处我们先来学习一下顺序队列 ,顺序队列 就是用数组实现:比如有一个n个元素的队列,数组下标0的一端是队头,入队操作就是通过数组下标一个个顺序追加,不需要

随机推荐