Java中的自定义数组队列
在Java中,作为所有数据结构中存储和获取速度最快的一种,数组凭借其这种简单易用的优势在各个方面都能大显神威。但是数组也有自身的局限性。数组的长度必须是固定的一旦定义之后就无法动态的更改,这就会造成这样的问题,如果数组已满,就无法继续添加数据(当然你可以定义一个“足够大的数组”,但问题是多大才是足够大呢?太小不够,太大浪费内存空间)。如果删除一个数据,它的内存空间空着没有被使用。另外数组只能存储同一类型的数据,如果把它设置成Object类型的话,是可以存不同类型的数据了,但是设想这样一种情况:现在项目中有定义了一个Object类型的数组。项目中拥有很多的图形类,确实这个数组都能保存,但问题是这时用户保存了一个其他类型的东西,程序是不会报错的,因为类型是Object。这样肯定是不行的。另外在Java中向上转型是安全的,Object类型可以适应一切类型,但是向下转型确是不安全的。比如下面的代码:
package Cbs;
public class Test {
public static void main(String[] args) {
//定义Object类型的数组
Object[] array=new Object[10];
//使用基本数据类型的包装类
Integer i=10;
Float f=12.0f;
//向上转型,没有问题
array[0]=i;
array[1]=f;
//向下转型
int i1=(int)array[0];
//注意array[1]中存储的是12.0,但是这样子语法没有问题,编译不会出错
int i2=(int)array[1];
System.out.println(i1);
System.out.println(i2);//抛出ClassCastException异常
}
}
package com.cbs; /**
* 自定义数组队列
* @author CBS
*/ public class MyList<E> {//使用泛型E
//声明一个Object数组
private Object[] array;
private int size=0;//记录队列中数据类型的长度
private int initCount=0;//初始化时数组的大小,默认为0
private int incresCount=1;//数组已满时,每次数组的增长长度
/**
* 构造方法
* @param initCount 为数组的初始长度
*/
public MyList(int initCount){
this.initCount=initCount;
array=new Object[initCount];
}
/**
* 构造方法
* @param initCount 为数组的初始长度
* @param incresCount 为数组满是每次的增长长度
*/
public MyList(int initCount, int incresCount) {
this.initCount = initCount;
this.incresCount = incresCount;
array=new Object[initCount];
} //实现数据的添加
public void add(E e){
if(size<initCount){
array[size]=e;
}
else{
Object[] newArray=new Object[array.length+incresCount];
newArray[size]=e;
for(int i=0;i<array.length;i++){
newArray[i]=array[i];
}
initCount+=incresCount;
array=newArray;
}
size++;
}
//实现删除指定下标位置的数据
public void delete(int i){
size--;
initCount--;
Object[] newArray=new Object[array.length-1];
for(int j=0;j<i;j++)
newArray[j]=array[j];
for(int j=i+1;j<array.length;j++)
newArray[j-1]=array[j];
array=newArray;
}
//实现插入指定下标位置的数据
public void insert(E e,int i){
if(size<initCount && i>=0 && i<size-1){
for(int j=size;j>i;j--)
array[j]=array[j-1];
array[i]=e;
}
else{
Object[] newArray=new Object[array.length+incresCount];
for(int j=0;j<array.length;j++){
newArray[j]=array[j];
}
initCount+=incresCount;
array=newArray;
for(int j=size;j>i;j--)
array[j]=array[j-1];
array[i]=e;
}
size++;
}
//实现获取指定下标位置的数据
public E get(int i){
if(i<0 || i>=size)
return null;
else
return (E) array[i];
}
//实现更新指定下标位置的数据
public void upDate(E e,int i){
if(i>=0 && i<size)
array[i]=e;
}
//获取数组队列中存储的元素个数
public int legnth(){
return size;
} }
这样一个自定义的数组对列就完成了。当然这里对自定义的数组对列做了一定的优化,可以由用户指定初始的队列长度和每次队满时增长的长度。相比于上面所说的每次长度加一,这样做就不用每次都新建一个新的数组了。这样以后只要在类中实例化MyList的对象就可以很方便的操作数组队列啦。
Java中的自定义数组队列的更多相关文章
- Java中的5大队列,你知道几个?
本文已收录至 https://github.com/vipstone/algorithm <算法图解>系列. 通过前面文章的学习<一文详解「队列」,手撸队列的3种方法!>我们知 ...
- 在Java中怎样把数组转换为ArrayList?
翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...
- [转]Java中实现自定义的注解处理器
Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...
- Java中创建泛型数组
Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...
- Java中使用自定义类封装数组,添加类方法实现数据操作
1.具体见注释 2.后续或有更新 public class MyArray { private long[] array; private int cnt; // 自定义数组类的元素个数 /** 使用 ...
- JAVA中常见的阻塞队列详解
在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...
- 浅谈Java中的Condition条件队列,手摸手带你实现一个阻塞队列!
条件队列是什么?可能很多人和我一样答不出来,不过今天终于搞清楚了! 什么是条件队列 条件队列:当某个线程调用了wait方法,或者通过Condition对象调用了await相关方法,线程就会进入阻塞状态 ...
- Java中方法与数组
1:方法(掌握) (1)方法:就是完成特定功能的代码块. 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法. (2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参 ...
- JAVA中list,set,数组之间的转换详解
JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:import org.apache.commons.coll ...
随机推荐
- 输入和输出--javase中的路径
就目前为止, javase中经常用到路径来读取一个资源文件的所有情况都已经整理在博客里面了,这里做一个统一的整理: 1,IO流来读取一个文件,比如说new FileInputStream(" ...
- Ceph,TFS,FastDFS,MogileFS,MooseFS,GlusterFS 对比
系统整体对比 对比说明 /文件系统 TFS FastDFS MogileFS MooseFS GlusterFS Ceph 开发语言 C++ C Perl C C C++ 开源协议 GPL V2 GP ...
- php中curl模拟post提交多维数组(转载)
原文地址:http://www.cnblogs.com/mingaixin/archive/2012/11/09/2763265.html 今天需要用curl模拟post提交参数,请求同事提供的一个接 ...
- JavaSE基础篇—MySQL三大范式—数据库设计规范
1.概 念 范式是一种符合设计要求的总结,要想设计一个结构合理的关系型数据库,必须满足一定的范式.各个范式是以此嵌套包含的,范式越高,设计等级越高,在现实设计中也越难实现,一般数据库只要打 ...
- C#基础(七)虚函数
若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法.虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代是通过方法的重写实现的(以后再讲)虚方法的特点:虚方法前不允 ...
- Redis进阶实践之十 Redis主从复制的集群模式
一.引言 Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习.从今天开始来讲一下有关Re ...
- sql集锦
1. emp表中取出1981年入职的员工信息--sql select * from emp where extract(year from emp.hiredate)='1981'; ...陆续添加
- JFinal源码 分析之 Core包分析
ActionHandler.java 这个类继承了上面 说的Handler类,首先我们 上 几个属性 ,下面几个 属性我们 需要 关心哪些东西 呢?首先 是ActionMapping和RenderMa ...
- python各种运算优先级一览表
##python各种运算的优先级 运算符 描述 lambda Lambda表达式 or 布尔"或" and 布尔"与" not x 布尔"非" ...
- 记录下直接在git里读取出差异并打包的代码
一行命令: git diff --name-only HEAD commit_id | xargs tar -zcvf diff_head.tar.gz 这里的HEAD可以理解为最新的版本 HEAD本 ...