个人随笔
目录
JAVA集合框架-1-手写ArrayList
2019-02-18 21:45:13

本次手写是对照着ArrayList的源码来写的,没有封装接口什么的,只是单纯的实现功能

原理:数组、扩容

代码如下:

  1. package cn.myforever.mylist;
  2. import java.util.Arrays;
  3. /**
  4. * 手写ArrayList
  5. * 原理:数组,扩容
  6. * @author forever
  7. * @param <E>
  8. */
  9. public class MyArrayList<E> {
  10. private int size;//大小
  11. private int initSize = 10;//初始容量
  12. private Object[] obj=null;//数组
  13. public MyArrayList(){
  14. }
  15. public MyArrayList(int initSize){
  16. this.initSize = initSize;
  17. }
  18. /**
  19. * 添加数组
  20. * @param e
  21. */
  22. public Boolean add(E e) {
  23. //1、初始化以及判断是否需要扩容
  24. capacity(size+1);
  25. //2、加入数组,先加入后大小增加1
  26. obj[size++] = e;
  27. return true;
  28. }
  29. /**
  30. * 指定位置添加
  31. * @param index
  32. * @param e
  33. * @return
  34. */
  35. public Boolean add(int index,E e) {
  36. checkIndex(index);
  37. //1、初始化以及判断是否需要扩容
  38. capacity(size+1);
  39. System.arraycopy(obj, index, obj, index + 1,size - index);
  40. obj[index] = e;
  41. size++;
  42. return true;
  43. }
  44. /**
  45. * 容器库扩容判断
  46. * @param i 需要的容量大小
  47. */
  48. private void capacity(int i) {
  49. if(obj==null) {
  50. obj = new Object[initSize];
  51. }
  52. //获取现在数组的长度
  53. int objSize = obj.length;
  54. //如果需要的数组长度大于现在的长度,就需要扩容1.5倍 Vector是扩容两倍,并且是线程安全带的,加了关键字synchronized
  55. if(i>objSize) {
  56. System.out.println("数组不够长啦,需要进行扩容,扩容1.5倍");
  57. //objSize>>1 除以2
  58. int newSize = objSize+(objSize>>1);
  59. System.out.println("扩容后的大小:"+newSize);
  60. //这里会有个问题,若是newSize==1,那么1+1/2转成整形后还是1,这样就相当于没有扩容,不过若是不指定初始化大小的话就没事
  61. if(newSize<i) {
  62. System.out.println("由于初始值为1,扩容后的大小还是为1,所以要用所需大小来当做扩容值");
  63. newSize = i;
  64. }
  65. //这里进行扩容
  66. obj = Arrays.copyOf(obj,newSize);
  67. }
  68. }
  69. /**
  70. * 获取集合的大小
  71. * @return
  72. */
  73. public int size() {
  74. return size;
  75. }
  76. /**
  77. * 移除
  78. */
  79. public E remove(int index) {
  80. //判断下标有没有越界
  81. checkIndex(index);
  82. //获取该下标的值
  83. E e = get(index);
  84. if(e!=null) {
  85. int move = size-index-1;
  86. System.arraycopy(obj, index+1, obj, index, move);
  87. obj[--size]=null;//让GC回收器尽快回收
  88. }
  89. return e;
  90. }
  91. /**
  92. * 移除
  93. * @param e
  94. * @return
  95. */
  96. public Boolean remove(E e) {
  97. if(e==null) {
  98. for(int i=0;i<size;i++) {
  99. if(obj[i]==null) {
  100. remove(i);
  101. return true;
  102. }
  103. }
  104. }else {
  105. for(int i=0;i<size;i++) {
  106. if(e.equals(obj[i])) {
  107. remove(i);
  108. return true;
  109. }
  110. }
  111. }
  112. return true;
  113. }
  114. /**
  115. * 获取值
  116. * @param index
  117. * @return
  118. */
  119. @SuppressWarnings("unchecked")
  120. public E get(int index) {
  121. checkIndex(index);
  122. E e = (E) obj[index];
  123. return e;
  124. }
  125. private void checkIndex(int index) {
  126. if(index>=size||index<0) {
  127. throw new IndexOutOfBoundsException("下标越界:"+index);
  128. }
  129. }
  130. public void clear() {
  131. for (int i = 0; i < size; i++) {
  132. obj[i] = null;
  133. }
  134. size = 0;
  135. }
  136. public boolean isEmpty() {
  137. return size == 0;
  138. }
  139. @Override
  140. public String toString() {
  141. String str="";
  142. for(int i=0;i<size;i++) {
  143. str+=obj[i]+";";
  144. }
  145. System.out.println(str);
  146. return "";
  147. }
  148. }

当然,这个是比较简单的,只要你会原理,基本上都可以手写出来。
这里提供git地址:https://github.com/suibibk/my-arraylist.git

 190

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2