下面我带大家一起加深一下对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.理解数组 数组也是一种数 ...

  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. JQuery淡入淡出 banner切换特效

    附件中提供另一种实现方式 基本类似 主要的实现方法如下: var ShowAD=function(i){   showImg.eq(i).animate({opacity:1},settings.sp ...

  2. a标签点击后的虚线框问题

    以前一直用的方法都是: a {outline: none;star:expression(this.onFocus=this.blur());} 后来发现有瑕疵,不完美.体现在页面调用JS动作比较频繁 ...

  3. 国产CPU研究单位及现状

    1.国产CPU主要研制单位 (1)高性能通用CPU(“大CPU”,主要应用于高性能计算及服务器等) 主要研发单位:中国科学院计算所.北大众志.国防科技大学.上海高性能集成电路设计中心 (2)安全适用计 ...

  4. python 实现文件批量拷贝

    场景:某个文件夹下面包含数量巨大的文件,需求需要将这些文件按组(比如5000个一组)存放到不同的目录中去. # Filename: CopyFiles.py import os import os.p ...

  5. PHP - PDO 之 mysql 事务功能

    <?php /* pdo 学习 */ $dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn $db = new pdo($dsn,'root', ...

  6. 如何查看windows操作系统当前使用的字符集

    如何查看windows操作系统当前使用的字符集 Chcp 显示活动控制台代码页数量,或更改该控制台的活动控制台代码页.如果在没有参数的情况下使用,则 chcp 显示活动控制台代码页的数量. 语法 ch ...

  7. mysql常用数据类型的选择

    时间戳可以用int来存储 ip地址的存储数据类型,可以使用INET_ATON 和INET_NTOA来配合bigint类型来代替varchar

  8. redis缓存的安装和使用

    Redis介绍    Redis本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库,但是他的数据可以持久化的保存在磁盘上,解决了服务重启后数据不丢失的问题,他的值可以是s ...

  9. 正则表达式通过Unicode属性匹配

    原文链接:http://zochen.iteye.com/blog/690716 Unicode 编码并不只是为某个字符简单定义了一个编码,而且还将其进行了归类. \pP 其中的小写 p 是 prop ...

  10. DB天气app冲刺第十天

    好了 这是第十天了,按照白板任务上的来说的话,今天没有完成,所以等一下还要继续看看今天能不能把他做完,今天出的问题在于我又自己调整了一下UI设计,因为发现以前的设计发面有重复,浪费了屏幕.所以还不如省 ...