在Java编程中,常常会遇到需要存储和处理大量同类信息的时候,这时候就要运用数组或者队列的数据存储结构来方便操作。
1.数组
定义:数组是属于数据结构中一种线性的数据结构,因为其对象在内存中的存储方式是一个连续的存储空间。
数组在使用时的书写格式:(以一维数组为)
定义和实例化对象同步进行:
已知存储数据的类型和长度时:数据类型 [] 数组名 = new 数据类型[长度];
已经知道具体的每一项数据时:数据类型 [] 数组名 = {数据,...};
已经知道具体的每一项数据同时规定数据类型时:数据类型 [] 数组名 = new 数据类型[]{数据,...};
先定义再实例化对象:
定义:数据类型 [] 数组名;
数组名 = new 数据类型[长度];
数组名 = new 数据类型[]{数据,...};
特殊的二维数组书写方式:
数据类型 [][] 数组名 = new 数据类型[行][列];
数据类型 [][] 数组名 = {{数据,...},...};
数组是一个Java中已经定义好的类,但是这个类只有一个length属性,没有方法。
Length这个属性是用来定义数组长度的。所以在定义数组时,一定要事先定义好其长度。
在获取或者设置一维数组具体的某个位置的数据时,就要使用该书写格式:数组名[下标]
另外,如果一个数组没有特殊的规定,数组的下标是从0开始的。所以其编号是从0到length-1但是一个数组中能存储元素的最大量是由length决定:数组名.length。
在获取或设置二维数组中某一个位置的数据:数组名[行下标][列下标]
获取二维数组的行数:数组名.length
获取二维数组的列数:数组名[行下标].length
获取二维数组能存储多少个元素:
数组名.length*数组名[行下标].length
数组名[行下标].length+… 而不是简单的行数*列数,因为定义二维数组时,每一列的长度可以不同。
同时注意:在数组的操作中,除了0是直接给的数字之外,其他的都通过length来获取。同时数组下标只会从0开始。
数组的优点和缺点?
优点:
存取数据是所有数据结构中速度最快的一种,你在获取或设置数据时,
可以直接通过下标定位。
缺点:
如果你要存储的数据不确定时,数组在创建时需要给予的长度就是缺点。
1.创建数组小了,存储不下数据
2.创建数组大了,浪费内存空间
如果在项目中特定情况下只能存储一种数据类型;在项目的两一个位置
需要存储N种数据类型;这样数组在创建时需要指定固定的类型就会是缺点。
2.数组队列
从数组中可以知道,要使用一个数组,就必须知道其长度,同时数组中所有数据的类型都是统一的,如果需要存储不同数据类型的数据,并且不知道数据量的大小时,就可以使用数组队列。
数组队列的实现原理:借助于数组名中存储的是数组对象在内存中的首地址。也就是说如果加入或者删除了数据,就新建一个新的数组,先修改改动的内容,再将没改动的内容复制过来。
Java中包含了自己定义好的ArrayList类,但是如果需要自己定义一个类时可能需要用到的接口和类:
interface MyArrayList.java 父接口,定义数组中所需要实现的方法。
class MyArrayListImpl.java 子类,实现MyArrayList接口中所有的抽象方法。
Object类是所有类的父类,所以利用Object就可以实现在ArrayList中存储任意类型的数据,但是如果使用者又想要规定一个ArrayList的数据类型时,就需要使用泛型<E>。
泛型是Java中的一种特殊符号,不能把它当做任何一个种数据类型。
但是它可以泛指Java所有的数据类型(基本数据类型,引用类型)。
例如:
public interface MyArrayList<E>{
}
<E>就代表的是泛型,E的类型决定了该ArrayList的数据类型
Java中的泛型有E(元素)、K(键)、V(值)。 K、V在实现五子棋的hash表中有过运用。