从数组谈队列
2016-02-26 16:38
405 查看
数组和队列可谓是一对好基友,然而对于大多数编程语言初学者来说,他们对于数组与队列的理解仅限于存储空间是否“可变”这一点上,那么他们之间究竟还有什么区别?队列又是怎样做到存储空间“可变”的呢? 为了说明,首先从大家都较为熟悉的数组入手,我们知道数组比较明显的缺点有两个: 1.长度固定 数组的存储空间在定义时就已经确定,空间开辟多了会造成资源的浪费,少了则会造成数组越界。 2.类型固定 数组在定义时需要指定数据类型,当有一个大项目需要分摊给多个人执行时,每个人需要使用存储不同类型数据的数组时都要自己重新编一串代码,这样就会造成类似工作多次做的情况,浪费时间精力,且代码杂乱。 然而队列同学早已看穿了这一切,打开Java中ArrayList<E>类的源代码。 以下为ArrayList<E>中的add(E object)方法:
@Override //在队列末尾中添加对象 public boolean add(E object) { Object[] a = array; int s = size; if (s == a.length) { Object[] newArray = new Object[s + (s < (MIN_CAPACITY_INCREMENT / 2) ? MIN_CAPACITY_INCREMENT : s >> 1)]; System.arraycopy(a, 0, newArray, 0, s); array = a = newArray; } a[s] = object; size = s + 1; modCount++; return true; }
仅以上这段代码,便可看出队列同学的心机之深啊。 针对第一个问题,队列四步解决:1.重新建立一个存储空间比原先的数组A大的数组B 2.将数组A中存储的对象一一赋给数组B 3.将需要加的对象e加在数组B中其他元素的后面 4.把数组B赋给数组A(地址) 而针对第二个问题,队列用了一个“Object”,一个“泛型”便轻松解决:首先用所有类的父类Object来做到任何对象都可使用该数组,再用泛型限定使用时的具体数据类型。 了解了队列的实现方法,便可自己动手创建一个队列,下面是我自己写的一个简单队列,功能不多,仅供参考:
public class MyArrayList<E> { private Object[]array; private int size = 0; public MyArrayList(){ array = new Object[0]; } public MyArrayList(int size){ array = new Object[size]; } /** * 向队列中添加元素 * @param element */ public void add(E element){ Object[]newArray = new Object[size+1]; for(int i=0;i<size;i++){ newArray[i] = array[i]; } newArray[size] = element; size++; array = newArray; } /** * 根据索引移除对应元素 * @param index * @return */ public E remove(int index){ if(index <0||index >=size) return null; Object[]temp = new Object[size-1]; for(int i=0;i<index;i++){ temp[i] = array[i]; } for(int i=index+1;i<size;i++){ temp[i-1]=array[i]; } Object obj = array[index]; size--; array = temp; return (E)obj; } /** * 查找队列中是否有指定元素 * @param obj * @return */ public boolean find(Object obj){ for(int i=0;i<size;i++){ if(array[i]==obj){ return true; } } return false; } /** * 返回数组队列中存储的元素个数 * @return */ public int size(){ return size; } /** * 根据索引返回指定位置的元素 * @param index * @return */ public E get(int index){ if(index <0||index >=size) return null; return (E)array[index]; } }
以下是测试:
public class TestList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MyArrayList<String> list = new MyArrayList<String>(); java.util.Random rand = new java.util.Random(); int size = rand.nextInt(20); for(int i=0;i<size;i++){ String element = (char)(rand.nextInt(256))+""; list.add(element); } list.add("lishuf"); list.add("lkk"); list.add("kjhnf"); for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } } }
相关文章推荐
- YII url美化管理
- LAoj 2678 - Subsequence (DP&技巧&排序)
- Minimum Depth of Binary Tree
- hdu5634 BestCoder Round #73 (div.1)
- JAVA 后台计算 经纬度 最短距离
- Android布局自定义Shap圆形ImageView,可以单独设置背景与图片
- 2015,记录成长,给自己一个愿景
- 20160226
- Comparing Two Long Integers
- CodeForces 615 A. Bulbs(水~)
- hdu5634 BestCoder Round #73 (div.1)
- Hibernate ORM入门03
- Zabbix监控nginx性能
- 对Objective-C中runtime的理解
- 判断字符串是否中文 & 判断是否正确身份证号
- Oracle定义DES加密解密及MD5加密函数示例
- 廖雪峰python教程
- 如何选择前端框架?
- Chewbaсca and Number
- 全排序(All Rangled)