基础数据结构-数组 - 图1

1. 数组

1.1 数组是什么

数组是一组数据类型相同的数据元素集合,数组的大小声明后不可改变,数组中的数据元素存储空间在内存中的表现形式是连续的。
基础数据结构-数组 - 图2

1.2 数组有哪些优缺点

得益于数组是在内存空间中连续存储的,所以数组具有随机读取的特性。

  • 优点:

查找速度快:数组查找数据的时间复杂度是O(1),因为数组是连续存储的所以直接通过数组下标就能够找到指定位置的元素。一维数组大致的寻址公式为:空间地址+下标索引*类型大小

  1. public class HelloWorld{
  2. public static void main(String[]args){
  3. int[]arr = new int[5];
  4. /*
  5. 假设arr[0]的位置是10001,那么根据寻址公式可知:
  6. arr[0]===>10001+0+typesize
  7. arr[1]===>10001+1+typesize
  8. arr[2]===>10001+2+typesize
  9. arr[3]===>10001+3+typesize
  10. arr[4]===>10001+4+typesize
  11. */
  12. }
  13. }
  • 缺点:

修改、删除元素的速度比较慢:原因在于数组如果要添加一个元素那么这个坐标之后包括插入位置坐标元素都需要依次往后移,如果是删除一个元素那么就是删除下标后边的元素往前挪动。删除和修改数组的时间复杂度为O(n)。
image.png

1.3 数组有哪些类型

  1. 一维数组 ```java public class OneArray{

    public static void main(String[]args){

    1. //声明一个一维数组
    2. int[]arr = new arr[10];
    3. //为一维数组赋值
    4. int[0] = 1;
    5. int[1] = 2;
    6. int[2] = 3;

    }

}

  1. 2. 多维数组
  2. ```java
  3. public class TwoArray{
  4. public static void main(String[]args){
  5. //声明一个二维数组
  6. int[][]arr = new int[5][10];
  7. //为二维数组赋值
  8. int[0][0] = 1;
  9. int[0][1] = 2;
  10. int[1][0] = 3;
  11. int[1][1] = 4;
  12. }
  13. }

1.3 数组的基本操作

  1. package com.muzili.array;
  2. /**
  3. *
  4. * @author: muzili(李敷斌)
  5. * @date: 2021/6/29
  6. * @version: v0.0.1
  7. * @description: 动态数组 类ArrayList实现
  8. */
  9. public class DynamicArray<T> {
  10. private int size = 10;
  11. private T[] arr;
  12. public DynamicArray(){
  13. arr = (T[]) new Object[size];
  14. }
  15. public DynamicArray(int size){
  16. if (size==0){
  17. return;
  18. }
  19. arr = (T[]) new Object[size];
  20. }
  21. public int getSize() {
  22. return size;
  23. }
  24. public T[] getArr() {
  25. return arr;
  26. }
  27. /**
  28. * 向指定位置插入一个元素
  29. * @param loc
  30. * @param ele
  31. */
  32. public void add(Integer loc,T ele){
  33. if (loc < size){
  34. //从最后一个元素开始移动
  35. for (int i = size - 1; i > loc; i--) {
  36. arr[i] = arr[i-1];
  37. }
  38. arr[loc] = ele;
  39. return;
  40. }
  41. //如果 最大maxIndex自加后大于size则需要扩容
  42. expansion();
  43. add(loc, ele);
  44. }
  45. /**
  46. * 数组扩容
  47. */
  48. private void expansion(){
  49. //扩容2倍
  50. int tmpSize = size * 2;
  51. T[]tmpArr = (T[]) new Object[tmpSize];
  52. for (int i = 0; i < arr.length; i++) {
  53. tmpArr[i] = arr[i];
  54. }
  55. arr = tmpArr;
  56. size = tmpSize;
  57. }
  58. /**
  59. * 删除自定位置的元素
  60. * @param loc
  61. */
  62. public void remove(int loc){
  63. if (loc >= size){
  64. return;
  65. }
  66. for (int i = loc; i < size-1; i++) {
  67. arr[i] = arr[i+1];
  68. }
  69. arr[size-1] = null;
  70. }
  71. /**
  72. * 获取原始
  73. * @param loc
  74. * @return
  75. */
  76. public T get(int loc){
  77. if (loc >= size){
  78. return null;
  79. }
  80. return arr[loc];
  81. }
  82. public static void main(String[] args) {
  83. DynamicArray<String> strArr = new DynamicArray<String>(10);
  84. strArr.add(0,"1");
  85. strArr.add(0,"2");
  86. strArr.add(2,"3");
  87. strArr.add(3,"4");
  88. strArr.add(2,"4");
  89. strArr.add(12,"5");
  90. Object[] arr = strArr.getArr();
  91. for (int i = 0; i < arr.length; i++) {
  92. System.out.println("元素下标["+i+"],元素值="+arr[i]);
  93. }
  94. //删除下标为1的元素
  95. strArr.remove(1);
  96. System.out.println("==========================================");
  97. arr = strArr.getArr();
  98. for (int i = 0; i < arr.length; i++) {
  99. System.out.println("元素下标["+i+"],元素值="+arr[i]);
  100. }
  101. }
  102. }

2. Java中的内存

基础数据结构-数组 - 图4

2.1 堆内存

在Java中,通过new创建的对象都是存放在堆内存中的,堆内存由GC垃圾回收器管理,当一个对象不再被引用那么它就会被垃圾回收器回收。堆内存是灵活的,它实现了内存的按需分配,而且它能够自动释放内存。

2.2 栈内存

在Java中,栈内存用于存储基本数据类型的变量、指令代码、常量以及对象引用(对象句柄),栈内存由编译器进行管理,它的生命周期是比较短的,它可能随着一个方法调用的结束内存就被立即释放,正是由于这一特性,所以栈内存的效率比较高,仅次于寄存器。

2.3 面试题

分析以下代码中,声明的变量是属于栈内存还是堆内存?

  1. String str1 = "abc";