容器第三课,JDK源码分析,自己实现ArrayList数组扩容
2015-03-09 16:38
585 查看
package com.pkushutong.Collection; /** * 测试底层方法的实现,参照这JDK源码 * @author dell * */ public class Test02{ private Object[] elementData; private int size; private int size(){ return size; } private boolean isEmpty(){ return size == 0; } public Object get(int index){ rangeCheck(index); return elementData[index]; } public Test02(){ this(10); } public Test02(int initialCapacity){ if(initialCapacity < 0 ){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } elementData = new Object[initialCapacity]; } public void add(Object obj){ //数组扩容 if(size == elementData.length){ Object[] NewObject = new Object[size * 2 + 1]; //旧数组数据拷贝到新数组里 System.arraycopy(elementData, 0, NewObject, 0, elementData.length); elementData = NewObject; } elementData[size++] = obj; } public void remove(int index){ rangeCheck(index); //删除指定位置的对象 int numMoved = size - index - 1; if (numMoved > 0){ System.arraycopy(elementData, index+1, elementData, index,numMoved); } elementData[--size] = null; // clear to let GC do its work } public void remove(Object obj){ for(int i=0; i<size; i++){ if(get(i).equals(obj)){ remove(i); } } } public Object set(int index, Object obj){ rangeCheck(index); Object oldValue = elementData[index]; elementData[index] = obj; return oldValue; } private void rangeCheck(int index){ if(index < 0 || index >= size){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } } public void add(int index, Object obj){ rangeCheck(index); ensureCapacityInternal(); System.arraycopy(elementData, index, elementData, index + 1,size - index); elementData[index] = obj; size++; } private void ensureCapacityInternal() { //数组扩容 if(size == elementData.length){ Object[] NewObject = new Object[size * 2 + 1]; //旧数组数据拷贝到新数组里 System.arraycopy(elementData, 0, NewObject, 0, elementData.length); elementData = NewObject; } } public static void main(String[] args) { Test02 t = new Test02(3); t.add("123"); t.add("234"); t.add("345"); t.add("456"); t.add("567"); System.out.println(t.size()); System.out.println(t.get(5)); } }
相关文章推荐
- 数组第二十四课,模拟ArrayList容器的底层实现,JDK源码分析
- 59_数组_模拟ArrayList容器的底层实现_JDK源码分析ArrayList
- java学习之旅59--模拟ArrayList容器的底层实现_JDK源码分析ArrayList
- java学习之旅56--数组_StringBuilder和StringBuffer的使用_常用方法_方法链的实现_JDK源码分析
- java容器源码分析--ArrayList(JDK1.8)
- 101-102_容器_JDK源代码分析_自己实现ArrayList
- Java容器深入研究(jdk 1.8)--- ArrayList总结与源码分析
- java并发容器CopyOnWriteArrayList实现原理及源码分析
- java非并发容器ArrayList 和 LinkedList 优缺点比较及其实现源码分析
- Android版数据结构与算法(二):基于数组的实现ArrayList源码彻底分析
- 56-58_数组_StringBuilder和StringBuffer_常用方法_方法链的实现_JDK源码分析_常见面试题
- (7) java源码分析------之ArrayList (对应数据结构中线性表中的顺序表,JDK1.6)
- 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
- java数组与容器之间的转换,实现数组扩容
- Java Collections Framework之ArrayList源码分析(基于JDK1.6)
- struts2源码分析-IOC容器的实现机制(上篇)
- Java中ArrayList源码深入分析(JDK1.6)
- ArrayList源码分析(基于JDK1.6)
- Java concurrent Framework并发容器之CopyOnWriteArrayList(1.6)源码分析
- Java Collections Framework之Queue(LinkedList实现)源码分析(基于JDK1.6)