一、数组的定义与特点

(1)数组是相同数据类型的元素的集合。
(2)数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。内存地址
(3)数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。
image.png

二、数组的优劣势

数组优势:数组拥有非常高效的随机访问能力,只要给出下标,就能用常量时间找到对应元素;
数组劣势:在插入和删除元素的时候,如果插入的数据不是在最后或者删除的不是最后一个,在进行插入和删除时,由于数组元素连续紧密地存储在内存中,因此需要频繁地移动元素。
因此,数组适合读操作多,写操作少的场景。

1.3ArrayList

本质还是一个数组,不过是JDK帮我们进行了封装,不需要我们去维护数组扩容,如果在不知道数组长度的情况下一般用ArrayList。

三、下面我们模拟实现对一个数组的增删改查功能

  1. public class MyIntArray {
  2. public int size; //数组的大小
  3. public int curSize; //当前数组已经使用的大小
  4. public int[] data;
  5. public MyIntArray(int size) {
  6. this.size = size;
  7. this.curSize = 0;
  8. this.data = new int[size];
  9. }
  10. /**添加*/
  11. public void add(int index, int val) { //时间复杂度o(n)
  12. if(index+1 < size){
  13. for(int i = size-1; i>index;i--){
  14. data[i] = data[i-1];
  15. }
  16. data[index] = val;
  17. }
  18. this.curSize++;
  19. //做数组扩容
  20. }
  21. /**删除*/
  22. public void del(int index) { //时间复杂度o(n)
  23. data[index] = 0;
  24. for(int i = index; i<size-1;i++){
  25. data[i] = data[i+1];
  26. }
  27. this.curSize--;
  28. }
  29. /**更新*/
  30. public void update(int index, int val) { //时间复杂度o(1)
  31. data[index] = val;
  32. }
  33. /**查找*/
  34. public int find(int index) { //时间复杂度o(1)
  35. return data[index];
  36. }
  37. /**打印数组*/
  38. public void print(){
  39. for (int i = 0;i<size;i++) {
  40. System.out.println(i+":"+data[i]);
  41. }
  42. }
  43. }
  1. MyIntArray myIntArray = new MyIntArray(8);
  2. System.out.println("----add----");
  3. myIntArray.add(0,0);
  4. myIntArray.add(1,1);
  5. myIntArray.add(2,2);
  6. myIntArray.add(1,11);
  7. myIntArray.print();
  8. System.out.println("----del----");
  9. myIntArray.del(1);
  10. myIntArray.print();
  11. System.out.println("----update----");
  12. myIntArray.update(1,111);
  13. myIntArray.print();
  14. System.out.println("----find----");
  15. System.out.println(myIntArray.find(1));

image.png