这是一篇网上搜到的文章,对数组进行了充分的说明。楼主懂了数组的俩种初始化方式:静态初始化和动态初始化方式。(贴过来备用哦)



下面我带大家一起加深一下对Java数组的认识:

1.理解数组

数组也是一种数据类型,本身就是一种引用类型,我们从它的初始化方法,通过关键字new去完成定义及初始化就可以知道。

数组的长度是不变的,一旦数组完成初始化后,它的长度就固定下来了,在内存中占有的空间也就固定了,即使里面的数据被清空了,占有的空间还是保留下来了,依然是属于数组的,当然长度依旧是不变的。

数组里边存放的数据类型要一致,可以基本数据类型,也可以是引用数据类型,但是唯一的标准就是相同的类型。在Java中,类与类是支持继承关系的,所以就可能造成数组里面可以存在多中数据类型的假象:

示例:

class Animal {

    public String name;

    public Animal(String name) {
this.name = name;
}
} class Cat extends Animal { public Cat(String name) {
super(name);
}
} class Dog extends Animal { public Dog(String name) {
super(name);
}
} public class ArrayDemo { public static void main(String[] args) { Animal[] animals = new Animal[2];
Cat cat = new Cat("little cat");
Dog dog = new Dog("little dog");
animals[0] = cat;
animals[1] = dog;
System.out.println(animals[0].name);
System.out.println(animals[1].name);
}
}

这样看上去,好像数组里面存放了Cat类型和Dog类型,但是实际上他们都是Animal类型,数组里面都是相同的类型,请大家不要搞混淆了,哈哈。

2.定义数组和初始化数组

定义数组的语法格式:

type[] arrayName;
type arrayName[];

这两种格式,我是强烈推荐第一种的,第一种格式给人非常的明确,定义了一个变量,它是type数组类型,但是第二种就可能给人一种假象,定义了一种变量,它是type类型的,为了不给别人误会,还是选择第一种好点咯。

定义完了数组,这是内存中还没给数组分配空间,真正分配内存空间的时候就是在给数组初始化的时候。

初始化数组分两种:

静态初始化:

arrayName = new type[]{element1,element2, element3......};

由上面很容易看出静态的初始化就是显式指定数组每个元素的初始值,由系统决定数组的长度。

动态初始化:

arrayName = new type[length];

由上面看出动态初始化就是只指定数组的长度,由系统为数组分配初始值。

对于不同类型,系统分配的初始值也是不一样的。

类型

初始值

整数类型(byte、short、int、long)

0

浮点类型(float、double)

0.0

字符类型(char)

'\u0000'(代表空格)

布尔类型(boolean)

false

引用类型(类、接口、数组)

null

你可能产生这样的猜想:不是可以同时使用静态初始化和动态初始化吗?

答案是不可以的,编译器是提示Cannot define dimension expressions when an array initializer is provided,因为你定义了长度,说明你已经初始化完了,我想想也是觉得这样不合理的,如果可以两者混合使用的话,那么我定义好了数组的长度后,系统是不是要给它附上默认的初始值,但是你后面又是静态的初始化,指定了特定的值,系统又要为你改变里面的值,这样做系统真累,我也觉得累。当然编译器是不支持两者混合使用的,大家注意了!

3.数组的使用

数组的使用就是引用数组的索引,数组的索引是从0开始的,到length-1为止,如果超过了这样范围就是抛出java.lang.ArrayIndexOutOfBoundException异常,就是数组索引越界异常,引用数组的使用太简单了,下面就简单用for和foreach来演示一下访问:

public class ArrayDemo2 {

    public static void main(String[] args) {

        String[] strings = new String[]{"hello", "world"};

        for(int i = 0; i < strings.length; i++)
System.out.println(strings[i]); for(String string : strings)
System.out.println(string);
}
}

4.内存中的数组:

type[] arrayName = new type[]{element1, element2, element3......};

arrayName就是一个引用的变量,这个数组的引用变量可以指向任何有效的内存,只有当指向有效的内存后才可以方位数组元素,可以这么说,引用变量是访问真是对象的根本方式。

实际的数组对象被存储在堆(heap)内存中,如果引用该数组独享的数组引用变量是一个局部变量的话,那么它被存储在栈(stack)内存中,示意图如下:

由这里我们可以很清楚的看出局部数组引用变量是怎么访问到内存中的数组的,党当一个方法调用完后,局部变量就没了,也就是从栈内存中消失了,如果堆内存中数组不再有任何引用变量指向自己,这个数组将成为垃圾,该数组所占的内存就会被系统的垃圾回收机制回收,因此,为了让垃圾回收机制回收一个数组所占的内存空间,可以将数组变量赋值为null,也就切断了数组引用变量和实际数组之间的关系,实际的数组也就成为了垃圾。

在这里,我们让一个引用变量指向另外一个实际的数组的时候,可能产生数组长度可变的假象,大家来看看一个例子:

public class ArrayDemo3 {

    public static void main(String[] args) {

        int[] a = new int[]{1, 2};
int[] b = new int[4];
System.out.println("length of b:" + b.length); b = a;
System.out.println("length of b:" + b.length);
}
}

结果:

length of b:4
length of b:2

从上面看我们b数组的长度好像发生了变化,但是实际上不是这样的,我们来分析一下内存中的变化:

先是这样:

然后这样:

我们所说的数组的长度不变是针对堆内存中真正数组的长度,引用变量是可以改变指向的,指到哪里肯定就显示指到的数组的长度了,但是真正的长度是不曾改变的。

5.操作数组的工具类:

Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组

int binarySearch(type[] a, type key):使用二分法查询key元素值在a数组中出现的索引,如果a数组不包含key元素值,就返回负数,调用该方法的前提是数组中的元素已经按照升序排列好了。

type[] copyOf(type[] original, int newLength):这个方法可以将original数组复制到一个新的数组,这个新的数组的长度为newLength。

boolean equals(type[] a, type[] b):如果a数组和b数组的长度相等,而且数组中的元素一一相等,该方法就返回true。

void fill(type[] a, type val):该方法会将数组中的全部元素赋值为val。

void sort(type[] a):该方法对a数组进行(升序)排序。

Java数组!!!你知多少?的更多相关文章

  1. Java数组你知多少?

    下面我带大家一起加深一下对Java数组的认识: 1.理解数组 数组也是一种数据类型,本身就是一种引用类型,我们从它的初始化方法,通过关键字new去完成定义及初始化就可以知道. 数组的长度是不变的,一旦 ...

  2. java数组学习

    1. java数组的静态特性:          java是静态语言,java中数组的长度是固定的.还有,数组元素的类型也是在定义时指定了的. 2. java数组里的关键词:          数组变 ...

  3. 第5节:Java基础 - 必知必会(下)

    第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...

  4. Java面试必知必会(扩展)——Java基础

    float f=3.4;是否正确? 不正确 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失: 因此需要强制类型转换: 方式一:float f=(float)3.4 方式二:float ...

  5. Java面试必知必会:基础

    面试考察的知识点多而杂,要完全掌握需要花费大量的时间和精力.但是面试中经常被问到的知识点却没有多少,你完全可以用 20% 的时间去掌握 80% 常问的知识点. 一.基础 包括: 杂七杂八 面向对象 数 ...

  6. Java 数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100 ...

  7. 第5章 Java数组

    1.什么是数组 数组可以想象成一个巨大的盒子,这个盒子里面存放的是同一个数据类型的数据 例如:int[] scores = {78,68,94,93}; 2.如何使用Java中的数组 2.1申明数组 ...

  8. Java 数组基础

    数组 数组(Array):相同类型数据的集合. 定义数组 方式1(推荐,更能表明数组类型) type[] 变量名 = new type[数组中元素的个数]; 比如: int[] a = new int ...

  9. Java数组及其内存分配

    几乎所有的程序设计语言都支持数组.Java也不例外.当我们需要多个类型相同的变量的时候,就考虑定义一个数组.在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静 ...

随机推荐

  1. 单层gmetad高可用

    虽然gmetad可以多层,但是层层gmetad都需要开启gweb,还是很麻烦.如果只是担心一个gmetad不安全,可以做成gmetad高可用,但是我还不知道有没有想hadoop ha那样自动failo ...

  2. 如何在Tomcat (6/7/8.0) 安装SSL证书

    第一步:进入Tomcat安装目录,把证书的jks格式文件放在tomcat安装目录的conf目录下即可. conf/ssl/371cloud.cn.jks 第二步: 打开tomcat配置文件 conf/ ...

  3. NetworkManager

    网络管理器(NetworManager)是检测网络.自动连接网络的程序.无论是无线还是有线连接,它都可以令您轻松管理.对于无线网络,网络管理器优先连接已知的网络并可以自动切换到最可靠的无线网络.利用网 ...

  4. [bzoj3224]普通平衡树[Treap]

    Treap 的各种操作,模板题,要再写几遍 #include <iostream> #include <algorithm> #include <cstdio> # ...

  5. nyoj_8_一种排序_201311251238

    一种排序 时间限制:3000 ms  |           内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编 ...

  6. Monitor和Lock以及区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  7. PHP array_diff_ukey()

    定义和用法 array_diff_ukey() 返回一个数组,该数组包括了所有出现在 array1 中但是未出现在任何其它参数数组中的键名的值.注意关联关系保留不变.与 array_diff() 不同 ...

  8. PHP array_diff()

    定义和用法 array_diff() 函数返回两个数组的差集数组.返回的数组的元素都取自被比较的数组(既第一个数组). 在返回的数组中,键名保持不变. 语法 array_diff(array1,arr ...

  9. android 音乐播放器总结

    学习从模仿開始 一个星期完毕的音乐播放器基本功能,具有下一首,上一首,暂停和随机.顺序和单曲等播放.以及保存上一次播放的状态,缺少了歌词显示功能.使用了andbase框架的欢迎动画和界面title. ...

  10. MapReduce:具体解释Shuffle过程

    Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必需要了解的.我看过非常多相关的资料,但每次看完都云里雾里的绕着,非常难理清大致的逻 ...