数组与数组队列
一、数组:
数组是有序的在定义时已经设定好大小,能存储多种数据类型,根据用途还可以分为n维数组。以下是数组的定义方式:
一维数组
1、数组类型[]数组名=new 数据类型[长度];
2、数据类型 [] 数组名 = {值,...};
3、数据类型 [] 数组名 = new 数据类型[]{值,...};
4、数据类型 [] 数组名;
数组名 = new 数据类型[长度];
5、数组名 = new 数据类型[]{值,...};
二维数组
1、数据类型 [][] 数组名 = new 数据类型[行][列];
2、数据类型 [][] 数组名 = {{值,...},...};
3、数据类型 [][] 数组名 = new 数据类型[][]{{值,...},...};
4、数据类型 [][] 数组名;
数组名 = new 数据类型[行][列];
5、数组名 = new 数据类型[][]{{值,...},...};
数组的使用必须先给对象(实例化),再使用:
Array[0]=new Object();
Object obj=Array[0];
obj.方法名(参数);
数组的使用涉及到了数组越界的问题,那么如何来获得数组的界限呢?
1、获取一维数组的元素总数:数组名.length;
2、获取二维数组的行的列数:数组名[r].length;(所谓二维数组,其实是一维数组的一维数组,所以可以认为 数组名[][] 为数组名为数组名[]的一维数组 );
3、获取二维数组的行数:数组名.length;
而获取指定位置的数据:数组名[下标];
数组名[行下标][列下标];(二维数组中的位置抽象为行与列的存在)。
二、数组的优点与缺点
优点:数组在使用时可以说是很方便了,每一个数据都有他的下标,所以需要用到指定位置的数据时只需要,给定下标就好,寻找方便;
缺点:大小是固定,不能根据数据总数的变化进行更改大小。
三、数组队列:
数组队列的主要作用是优化数组,对其缺点进行覆盖。首先需要想到数组名中存储的是什么?是在堆空间中的内存首地址。所以我们可以创建一个数组队列类,在其中定义一个初始大小为0的数组;在其中添加数据、删除数据、查找数据、修改数据的方法。
四、数组队列的代码实现:
1、代码如下:
public class Arrayqueue {
//原数组
private Object[] obj_1=new Object[0];
private int size;//存储数组的大小
//添加数据
public void add(Object date){
//新建一个数组 是原数组长度+1
//数组必须先给对象才能用
Object[] obj_2=new Object[obj_1.length+1];
//将原数组的数据移进新数组
for(int i=0;i<obj_1.length;i++){
obj_2[i]=obj_1[i];
}
//将要加入的数据加到最后一位
obj_2[obj_1.length]=date;
//交换(删除原数组)原数组指向新数组
obj_1=obj_2;
size++;
}
//根据索引删除
public void delete(int index){
if(index < 0 || index >= size){
throw new RuntimeException("索引越界!");
}else
{
//新建一个数组 是原数组长度+1
Object[] obj_2=new Object[obj_1.length-1];
for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组
obj_2[i]=obj_1[i];
}
for(int j=index;j<obj_2.length;j++){//将所要删除的位置之后的所有数据赋予新数组
obj_2[j]=obj_1[j+1];
}
//交换(删除原数组)原数组指向新数组
obj_1=obj_2;
size--;
}
}
//根据索引查找
public Object find(int index){
if(index < 0 || index>= size){
throw new RuntimeException("索引越界!");
}else{
return obj_1[index];//返回查找的数据
}
}
//修改
public Object redo(int index,Object date){
if(index < 0 || index>= size){
throw new RuntimeException("索引越界!");
}else{
obj_1[index]=date;
return obj_1[index];//返回修改的数据
}
}
public int size(){
return size;//返回数组的大小
}
}
2、写一个测试类对其进行测试:
public class Test_1 {
// 程序入口
public static void main(String[] args) {
//实例化Arrayqueue的对象
Arrayqueue aq=new Arrayqueue();
for(int i=0;i<8;i++){
Object obj1=new Object("张三"+i,i);
aq.add(obj1);
}
//修改数据
Object date=new Object("李四 ",100);
aq.redo(0, date);
//删除
aq.delete(3);
//添加数据(加到最后一位)
Object date_1=new Object("王五 ",300);
aq.add(date_1);
Print(aq);//打印数据
}
//打印数据的方法
public static void Print(Arrayqueue aq){
for(int t=0;t<aq.size();t++){
Object obj= (Object) aq.find(t);
obj.Show();
}
}
}
3、简单的Object类:
public class Object {
private String name;
private int grade;
public Object(String name,int grade){
this.name=name;
this.grade=grade;
}
public void Show(){
System.out.println("name: "+name+" "+"grade: "+grade);
}
}
五、结
数组队列的实现还是遇到了不少的坎的,但是在真正理解了以后每一句代码又是那么的明了。以下浅谈我遇到的问题
1、空指针异常:
【Exception in thread "main" java.lang.NullPointerException
at com.czj1109.Test_1.Print(Test_1.java:33)
at com.czj1109.Test_1.main(Test_1.java:26)
name: 李四 grade: 100
name: 张三1 grade: 1
name: 张三2 grade: 2】编译结果
********引起错误的代码********
//根据索引删除的方法
public void delete(int index){
if(index < 0 || index >= size){
throw new RuntimeException("索引越界!");
}else
{
//新建一个数组 是原数组长度+1
Object[] obj_2=new Object[obj_1.length-1];
for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组
obj_2[i]=obj_1[i];
}
for(int j=index+1;j<obj_1.length-1;j++){//将所要删除的位置之后的所有数据赋予新数组
obj_2[j]=obj_1[j+1];
}
//交换(删除原数组)原数组指向新数组
obj_1=obj_2;
size--;
}
}
********修改错误之后的代码********
//根据索引删除的方法
public void delete(int index){
if(index < 0 || index >= size){
throw new RuntimeException("索引越界!");
}else
{
//新建一个数组 是原数组长度+1
Object[] obj_2=new Object[obj_1.length-1];
for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组
obj_2[i]=obj_1[i];
}
for(int j=index;j<obj_2.length;j++){//将所要删除的位置之后的所有数据赋予新数组
obj_2[j]=obj_1[j+1];
}
//交换(删除原数组)原数组指向新数组
obj_1=obj_2;
size--;
}
}
2、有待完善的地方
//根据内容删除(需重写equals方法)
public void delete(Object date){
}
这一方法还没能够实现。
以上便是我在实现数组队列时的优化分析、思路、以及遇到的问题。
2014 11 15
梣梓