ArrayList

  1. package com.ay.arraylist;
  2. public class ArrayList<E> {
  3. public int size;
  4. private E[] elements; //所有的元素
  5. private static final int DEFAULT_CAPACITY = 10;
  6. private static final int ELEMENT_NOT_FOUND = -1;
  7. //构造方法
  8. public ArrayList(int capaticy){
  9. if (capaticy<DEFAULT_CAPACITY){
  10. capaticy = DEFAULT_CAPACITY;
  11. }else{
  12. capaticy = capaticy;
  13. }
  14. elements = (E[]) new Object[capaticy];
  15. }
  16. public void rangeCheck(int index){
  17. if (index<0 || index>= size){
  18. throw new IndexOutOfBoundsException("Index: "+index + "But Size :"+size);
  19. };
  20. }
  21. public void rangeCheckForAdd(int index){
  22. if (index<0 || index> size){
  23. throw new IndexOutOfBoundsException("Index: "+index + "But Size :"+size);
  24. };
  25. }
  26. public void add(E element){
  27. add(size,element);
  28. }
  29. public void add(int index,E element){
  30. rangeCheckForAdd(index);
  31. ensureCapacity(size+1);
  32. for (int i = size-1; i >= index ; i--) {
  33. elements[i+1] = elements[i];
  34. }
  35. elements[index] = element;
  36. size ++;
  37. }
  38. public ArrayList(){
  39. //elements = new int[DEFAULT_CAPACITY];
  40. this(DEFAULT_CAPACITY); //调用有参数的构造方法
  41. }
  42. public boolean isEmpty(){
  43. return size==0;
  44. }
  45. public E get(int index){
  46. rangeCheck(index);
  47. return elements[index];
  48. }
  49. public E set(int index,E element){
  50. rangeCheck(index);
  51. E old = elements[index];
  52. elements[index] = element;
  53. return old;
  54. }
  55. /**
  56. * 查看元素索引
  57. * @param element
  58. * @return index
  59. */
  60. public int indexOf(E element){
  61. for (int i = 0; i < size; i++) {
  62. if (elements[i]==element) return i;
  63. }
  64. return ELEMENT_NOT_FOUND;
  65. }
  66. /**
  67. * 是否包含某个元素
  68. * @param element
  69. * @return boolean
  70. */
  71. public boolean contains(E element){
  72. return indexOf(element) != ELEMENT_NOT_FOUND;
  73. }
  74. // 清楚所有元素
  75. /**
  76. * 控制size为0即可,无需清空
  77. */
  78. public void clear(){
  79. for (int i = 0; i < size; i++) {
  80. elements[i] = null;
  81. }
  82. size = 0;
  83. }
  84. // java中 打印对象会默认调用 对象.toString() 重写该方法
  85. public String toString(){
  86. // 拼接字符串
  87. StringBuilder string = new StringBuilder();
  88. string.append("size=").append(size).append(" [");
  89. for (int i = 0; i < size; i++) {
  90. string.append(elements[i]);
  91. if(i!=size-1){
  92. string.append(",");
  93. }
  94. }
  95. string.append("]");
  96. return string.toString();
  97. }
  98. public E remove(int index){
  99. rangeCheck(index);
  100. // for (int i = 0; i < size; i++) {
  101. // if (i>index){
  102. // elements[i-1] = elements[i];
  103. // }
  104. // }
  105. E old = elements[index];
  106. for (int i = index+1; i <size ; i++) {
  107. elements[i-1] = elements[i];
  108. }
  109. size --;
  110. elements[size]=null;
  111. return old;
  112. }
  113. /**
  114. * 保证要有capacity的容量
  115. * @param capacity
  116. */
  117. private void ensureCapacity(int capacity){
  118. int oldCapacity = elements.length;
  119. if (oldCapacity>=capacity){
  120. return;
  121. }
  122. // 新容量为旧容量的1.5倍
  123. int newCapacity = oldCapacity + (oldCapacity>>1);
  124. E[] newElements = (E[]) new Object[newCapacity];
  125. for (int i =0;i<size;i++){
  126. newElements[i] = elements[i];
  127. }
  128. elements = newElements;
  129. System.out.println("扩容");
  130. }
  131. }

测试类

  1. package com.ay.arraylist;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Main.test2();
  5. }
  6. // 测试person对象 添加到数组
  7. public static void test2(){
  8. Person xiaoming = new Person("xiaoming",14);
  9. Person xiaohong = new Person("xiaohong",30);
  10. // Person xiaohong = new Person("xiaohong",30);
  11. ArrayList<Person> arrayList = new ArrayList<>();
  12. arrayList.add(xiaoming);
  13. arrayList.add(xiaohong);
  14. arrayList.add(xiaohong);
  15. arrayList.add(xiaohong);
  16. System.out.println(arrayList);
  17. arrayList.clear();
  18. System.out.println(arrayList);
  19. //提醒jvm去做垃圾回收
  20. System.gc();
  21. }
  22. public static void test1(){
  23. ArrayList<Integer> arrayList = new ArrayList<>();
  24. arrayList.add(100);
  25. arrayList.add(10);
  26. arrayList.add(200);
  27. arrayList.add(300);
  28. for (int i=0;i<30;i++){
  29. arrayList.add(i);
  30. }
  31. System.out.println(arrayList);
  32. }
  33. }