Java数组

来源:互联网 发布:js构造函数怎么写 编辑:程序博客网 时间:2024/06/05 14:28

Java的数组要求所有的数组元素具有相同的数据类型。一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变。即使把某个数组元素的数据清空,但它所占的空间依然被保留,依然属于数组,数组的长度依然不变。Java的数组既可以存储基本类型的数据,也可以存储引用类型的数据,只要所有的数组元素具有相同的类型即可。数组也是一种数据类型,它本身是一种引用类型。

1、定义数组

(1)  type[] arrayName;

推荐使用,因为不仅具有更好的语义,而且具有更好的可读性。

(2)  type arrayName[];

有些语言可能会不支持,如C#。

数组是一种引用类型,因此使用它定义一个变量时,仅仅表示定义了一个引用变量(也就是定义了一个指针),这个引用变量还未指向任何有效的内存,因此定义数组时不能指定数组的长度。而且由于定义数组只是定义了一个引用变量,并为指向任何有效的内存空间,所以还没有内存空间来存储数组元素,因此这个数组也不能使用,只有对数组进行初始化后才可以使用。

2、数组的初始化

Java中数组必须先初始化(为数组的数组元素分配内存空间,并为每个数组元素赋初始值),然后才可以使用。

数组的初始化有两种方式:

(1)静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。

语法格式: arrayName = new type[] { element1,element2,element3,element4……};

简化:arrayName = {elenent1,element2,element3,element4……};

或: int[] a = {1,2,3,4};      //定义和初始化同时完成

示例:

int[] intArr;      //定义一个int数组类型的变量,变量名为intArr
intArr = new int[]{5,6,7,8};      //使用静态初始化,初始化数组时只指定数组元素的初始值,不指定数组长度
Object[] objArr;      //定义一个Object数组类型的变量,变量名为objArr
objArr = new String[]{"Java","HaHa"};      //使用静态初始化,初始化数组时数组元素的类型是定义数组时数组元素类型的子类
Object[] objArr2;
objArr2 = new Object[]{"Java","LaLa"};      //使用静态初始化:

(2)动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。

语法格式: arrayName = new type[length];

示例:

int[] prices = new int[5];      //数组的定义和初始化同时完成,使用动态初始化语法
Object[] books = new String[4];      //数组的定义和初始化同时完成,初始化数组时元素的类型是定义数组时元素类型的子类

系统指定初始值时,按如下规则分配初始值:

1>数组元素的类型是基本类型中的整数类型(byte、short、int、long),则数组元素的值是0;

2>浮点类型(float、double),数组元素的值是0.0;

3>字符类型(char),数组元素的值是'\u0000';

4>布尔类型(boolean),数组元素的值是false;

5>引用类型(类、接口、数组),数组元素的值是null。

注意:不要同时使用静态初始化和动态初始化,即不要在进行数组初始化时,既指定数组的长度,又为每个数组元素分配初始值。

3、使用数组

一定注意下标不能越界。

4、foreach

示例:

String books = {book1,book2,book3};

for(String book : books)

{

           System.out.println(book);

}

5、数组在内存中的运行机制

(1)内存中的数组

数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。

引用变量是访问真实对象的根本方式。

实际的数组对象被存储在堆(heap)内存中;如果引用该数组对象的数组引用变量是一个局部变量,那么它被存储在栈(stack)内存中。

(当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁,因此所有在方法中定义的局部变量都是放在栈内存中的;当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区域就是堆内存,堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所使用(在方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。

为了让垃圾回收机制回收一个数组所占的内存空间,可以将该数组变量赋为null,也就切断了数组引用变量和实际数组之间的引用关系,实际的数组也就成了垃圾。)

6、操作数组的工具类

Java提供的Arrays;类里包含的一些static修饰的方法可以直接操作数组,这个Arrays类里包含了如下几个static修饰的方法(static修饰的方法额可以直接通过类名调用)。

(1) int binarySearch(tyoe[] a, type key)

(2) int binarySearch(type[] a,int fromIndex, int toIndex , type key)

(3) type[] copyfOf(type[] original, int length)

(4) type[] copyOfRange(type[] original, int from, int to)

(5) boolean equals(type[] a, type[] a2)

(6) void fill()(type[] a, type val)

(7) void fill(type[] a, int fromIndex, int toIndex, type val)

(8) void sort(type[] a)

(9) void sort(type[] a, int fromIndex, int toIndex)

(10) String toString(type[] a)

注意:Arrays类处于java.util包下,使用前必须在程序中导入java.util.Arrays类。

此外在System类里还有一个方法:

static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

代码1:把一个浮点数分解成整数部分和小数部分,把一个四位的数字字符串变成汉字字符串
运行结果:


原创粉丝点击