您的位置:首页 > 理论基础 > 数据结构算法

Java数据结构-线性结构数组(Array)详解

2017-12-14 00:00 447 查看
摘要: 《Java常用算法》
《Java编程思想》
《疯狂Java讲义》

一、概述

Java中的数组是一种聚合数据类型,是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应。一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整型数组、字符串数组、浮点型数组、对象数组等。数组还可以分为一维、二维及多维等表现形式。

二、数组的优点

数组的最大好处就是能都给存储进来的元素自动进行编号. 注意编号是从0开始。方便操作这些数据。

三、数组格式及初始化

1、一维数组

int[] a; //声明,没有初始化

int[] a = new int[5]; //初始化为默认值,int型为0

int[] a = {1,2,3,4,5}; //初始化为给定值

2、二维数组

int[][] a;

int[][] a = new int[5][5];

int[][] a ={{2,3,4},{5,6,7},{8,9}}

1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;
3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化

四、数据与泛型

Java 不支持泛型数组

List<String>[] ls = new ArrayList<String>[10];

上面的是不允许的,而下面的这种方式却可以。

List<String>[] ls = new ArrayList[10];

由于JVM泛型的擦除机制,在运行时JVM是不知道泛型信息的,所以可以给oa[1]赋上一个ArrayList<Integer>而不会出现ArrayStoreException,但是在取出数据的时候却要做一次类型转换,所以就会出现ClassCastException,如果可以进行泛型数组的声明,上面说的这种情况在编译期将不会出现任何的警告和错误,只有在运行时才会出错。而对泛型数组的声明进行限制,对于这样的情况,可以在编译期提示代码有类型安全问题,比没有任何提示要强很多。

基于以上的原因,Java不支持声明泛型数组,更确切地表达是:数组的类型不可以是类型变量,除非是采用通配符的方式,看下面这个例子:

List<?>[] lsa = new List<?>[10];


五、数组内存描述

public class arraytest {
public static void main(String[] args) {
int[] s;
s = new int[5];
for (int i = 0; i < 5; i++) {
s[i] = i+1;
}
System.out.println(Arrays.toString(s));
}
}






六、Arrays使用功能

1、Arrays.fill()

Java标准类库Arrays有一个作用十分有限的fill()方法:只能用一个值填充各个位置,而针对对象而言,就是复制同一个引用进行填充。

public class arraytest {
public static void main(String[] args) {
//###################数组fill介绍start###################//
int[] a1 = new int[5];
System.out.println("原数据:"+Arrays.toString(a1));
Arrays.fill(a1,12);
System.out.println("赋值数据:"+Arrays.toString(a1));
Arrays.fill(a1,1,4,15);
System.out.println("索引赋值数据:"+Arrays.toString(a1));
//###################数组fill介绍end###################//
}
}

结果如下:

原数据:[0, 0, 0, 0, 0]
赋值数据:[12, 12, 12, 12, 12]
索引赋值数据:[12, 15, 15, 15, 12]


2、复制数组

Java标准类库提供有static方法System.arraycopy(),用它复制数组比用for循环复制要快很多。System.arraycopy()针对所有类型做了重载。参数描述:

数据源

数据源从第几个索引开始

被修改数组

被修改数组从第几个索引开始

被修改数组开始往后修改几个元素

public class arraytest {
public static void main(String[] args) {
//###################数组复制介绍start###################//
int[] a1 = new int[10];
int[] a2 = new int[10];
System.out.println("原数据:"+Arrays.toString(a1));
System.out.println("原数据:"+Arrays.toString(a1));
Arrays.fill(a1,20);
Arrays.fill(a2,10);
System.out.println("赋值数据:"+Arrays.toString(a1));
System.out.println("赋值数据:"+Arrays.toString(a1));
System.arraycopy(a2,2,a1,4,4);
System.arraycopy(a1,2,a2,4,4);
System.out.println("复制数据:"+Arrays.toString(a1));
System.out.println("复制数据:"+Arrays.toString(a2));
//###################数组复制介绍end###################//
}
}

结果如下:

原数据:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
原数据:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
赋值数据:[20, 20, 20, 20, 20, 20, 20, 20, 20, 20]
赋值数据:[20, 20, 20, 20, 20, 20, 20, 20, 20, 20]
复制数据:[20, 20, 20, 20, 10, 10, 10, 10, 20, 20]
复制数据:[10, 10, 10, 10, 20, 20, 10, 10, 10, 10]


3、数组比较

Arrays类提供了重载后的equals()方法,用来比较整个数组。同样,此方法针对所有基本类型与Object都做了重载。数组相等的条件是元素个数必须相等,并且对应位置的元素也相等,者可以通过对每一个元素使用equals()作为比较来判断。(例如对int类型使用Integer.equals()做比较)

public class arraytest {
public static void main(String[] args) {
//###################数组比较介绍start###################//
int[] a1 = new int[10];
int[] a2 = new int[10];
Arrays.fill(a1,10);
Arrays.fill(a2,10);
System.out.println(Arrays.equals(a1,a2));
a1[5] = 5;
System.out.println(Arrays.equals(a1,a2));

String[] s1 = new String[5];
Arrays.fill(s1,"Hi");
String[] s2 = {new String("Hi"),new String("Hi"),new String("Hi"),new String("Hi"),new String("Hi")};
System.out.println(Arrays.equals(s1,s2));
//###################数组比较介绍end###################//
}
}

结果如下:

true
false
true


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息