在编程中,我们常常需要集中保留我们的数据,最简单的我们可以使用数组来保留数据,但是数组的大小是固定的,并且如果要保存具有映射关系的数据,这个时候只能通过两个数组进行保存,但是这明显是不现实的,为了保存不确定长度的数据,和存在映射关系的数据,jdk提供了一系列的集合类,他主要包含在java.util包下面,后来为了出来多线程环境下并发安全问题,在java.util.concurrent包下提供了一些多线程支持的集合类。集合类和数组的区别是集合类只能存储对象(当然保存的只是对象的引用),而数组即可以存储基本数据类型,也可以保存对象(当然这个时候保存也是引用对象),以下,就分开来讲讲java中的数据结构;
(一)Array (数组)
数组是最常见的数据结构,数组中可以存储一般数据类型,也可以存储引用数据类型,定义一个数组有以下几个方法:
type[] 变量名 = new type[数组中元素的个数];如:Object[] object = new Object[5];int[] array = new int[5];定义是设定数组的长度,其中object,array,指向的是数组的首地址,通过它可以来访问数组的元素;
type[] 变量名 = new type[]{逗号分隔的初始化值};
int[] a = {1,2,3,4};
int[] b = new int[]{1,2,3,4};
其中int[] a = new int[]{1,2,3,4};的第二个方括号中不能加上数组长度,因为元素个数是由后面花括号的内容决定的。
Java中的每个数组都有一个名为length的属性,表示数组的长度,length属性是public final int的,即length是只读的。数组长度一旦确定,就不能改变大小;
数组内容的比较不可以使用equals(),因为没有重写object的equal方法,注意java中一切都是对象,数组当然也是对象,所以这里的比较还是使用的是"=="的比较,这时候比较的是 两个对象是不是同一个对象,也就是是不是执行同一个引用,同一块内存区域,当然这并不能达到比较数据的目的,具体的实现,可以自己写代码,遍历数组,比较每个元素,也可以利用java.util.Array类的equal方法,这个工具类提供了,数组操作的一系列工具类,如果:
Arrays.equals(a,b)//比较数组a,b是否相等(数组的数量相等,数组中每个元素对于的值相等);
java.util.Array还提供了一些其他的静态方法(java.util.Array的所有方法都是静态方法),(1)fill()填充方法用指定的对象来添加,数组中的某些对象,(2).equals,比较两个数组是否全部相等, (3).copyOf,负责复制数组元素的值,(4).copyOfRange用于复制指定位置的数组的值,(5).asList:返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)此方 法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了RandomAccess。
此方法还提供了一个创建固定长度的列表 的便捷方法,该列表被初始化为包含多个元素:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
hashCode:基于指定数组的内容返回哈希码。对于任何两个满足 Arrays.equals(a, b) 的 short 型数组 a 和 b,也可用说 Arrays.hashCode(a) == Arrays.hashCode(b)。 注意当量数组数据的 值相等的时候,才会返回相同的hashcode;
5.多维数组
数组分一维数组,二维数组..多维数组,如以下的定义:
type[][] i = new type[2][3];(推荐)
type i[][] = new type[2][3];
以上的定义只能针对固定长度的二位数组,也就是每一个二维数组的长度是固定的,但是有些情况下,二维数组的长度是不定的对于二维数组第二维长度不一样的情况,我们必须先保证其一维的长度要固定,如下实现方式:
int[][] a = new int[3][];
a[0] = new int[2];
a[1] = new int[3];
a[2] = new int[1];
也可以这样定义:
int[][] c = new int[][]{{1, 2, 3},{4},{5, 6, 7, 8}};