Java基础数组知识点概要

121 阅读7分钟

@TOC

数组简介

简介:

  • 数组是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
  • 数组本身是引用数据类型,数组的元素可以是引用数据类型也可以是基本数据类型。
  • 数据的长度一旦确定了就不能修改。
  • 创建数据一般形式: 数组类型 [] 数组标识符 = new 数组类型 [数组长度] ;
  • 而这个表达式一般在主方法或方法中运行。
  • 因此会在内存空间中的栈空间创建一个标识符的变量(局部变量)。
  • 而后面的 new 数组类型 会在内存的堆空间中开辟一个连续空间,并把首地址栈空间中的标识符,意味着标识符指向堆空间这个连续空间。
  • 而一旦方法运行结束,意味着栈空间中的局部变量出栈了。那么堆空间中的连续空间也没有被引用了,那么JVM中的垃圾回收就会将其回收,从而避免浪费内存空间。
  • 比如有这样一个数组arr,然后进行word = arr,这样不是把arr的元素复制到word中,而是把arr的地址赋值到word,如果我们修改word的元素,那么arr中的元素也还会修改,这一位置他们在栈空间中是不一样的变量,但他们同时指向同一个堆空间。而如果我们想复制一个arr,必须new多一个复制,再进行迭代逐个赋值。(因为我们打印arr时出现的是arr数组的首地址值)

在这里插入图片描述 数组的length:

  • s.length是针对java中数组的,length是数组的一个属性,用来表示数组的长度。
  • s.length()则是字符串的一个方法,用来返回字符串的长度的
  • 字符串是没有length属性的,只有length()方法
  • 数组有length属性,而没有length()方法

一维数组

简介:

  • 一维数组的声明方式:type var[] 或 type[] var; 创建一维数组有几种方式(用int类型举例):
  • int[] a = new int[10]; 这种形式叫做动态分配,系统在声明的时候会默认数组的各个元素赋值,如int类型是 0。但数组的元素可以在后面以 a[0] = 1;的形式来重新赋值。
  • int[] a = new int[] {0,1,2,3,4};这种形式叫做静态分配,数组的元素在声明的时候同时给数组一个初始化的值这种形式也可以省略new int[],以int[] a = {0,1,2,3,4};这种形式,因为系统可以根据前面的声明进行类型推断,从而可以省略。但如果数组的声明和初始化分开就不可以了。如先进行声明int[] a,再进行初始化a = {0,1,2,3,4};这个时候就会报错。
  • 也可以创建一个匿名数组: System.out.println(new String[]{"a","b"});//这里创建了一个匿名数组,并打印输出。
  • 个人理解:数组也是一个对象,对于int类型的一维数组,必须指定长度,指定了长度之后,堆上的空间大小就可知了,即可分配,new命令创建对象之后会初始化所有值为0。

二维数组

简介:

  • 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。
  • 下面我从他的内存解析来说明,如我现在创建一个二维数组 int[][] arr = new int[3][2]; ①首先会在内存的栈空间创建一个名为arr的变量 ,然后在堆空间中创建一个长度为3的堆空间,并将这个堆空间的首地址值赋给栈空间中的arr变量。然后再创建再在堆空间中创建三个长度为2的堆空间,并分别赋给这个长度为3的堆空间中在索引为0,1,2的空间上。(光说可能有点抽象) ②下面是图像说明: 在这里插入图片描述
  • 创建二维数组有几种方式(用int类型举例): ①int[][] arr = new int[3][2]; 动态分配 ,系统会为每个元素赋值0,后面可以通过arr[0][0]来给每个元素赋值。int[][] arr = new int[][]{(0,1),(2,3),(4,5)};,静态分配,同一维数组一样可以省略new int[][]。原理相同。
  • 这里有一个注意的点: ①int[][] arr = new int[3][];以这种形式创建也是可以的,意味着创建一个二维数组但堆空间中的长度为3的连续空间里的每个单独的空间还没有指向 ②我们可以在后面以arr[0]=new int[2]的形式来创建并指向。而如果我们没用指向直接去打印arr[0][2]则会报错空指针,意味着此处指向null。 ③所以也印证了前面提到的一句话数组本身是引用数据类型,以及系统会默认给引用数据类型赋值为null。

数组中常见算法

简介:

  • 数组常见的算法有排序算法和查找算法。
  • 排序算法比较常见的有冒泡排序,快速排序,堆排序及归并排序。冒泡排序的思想就是对相邻的两个元素进行比较,如果两个元素逆序,则进行调换。这样遍历一次数组从而可以把最大或最小的元素排到最后面,接着再进行这样的操作,不过第二次遍历不用遍历数组的最后一个元素了。 ②快速排序的思想就是拿取数组中的其中一个值,比如在[90, 8, 4, 18, 11, 32, 51, 99, 102]拿取32。然后再拿去一个高节点(意味着在索引为length-1的值)和一个低节点的值(意味着在索引为0的值),然后分别由低节点和高节点相向出发与前面拿取得值比较如果大于拿去的值则放在值的右边,小于则放在值的左边。这样就形成[8,4,11,18,11,32,90,51,99,102],然后再分别在两边递归这样的算法。
  • 查找算法比较常见的有二分查找和线性查找。二分查找的前提是数组必须是有序的,比如要在[2, 4, 8, 10, 17, 27, 50, 80, 100]中查找4的位置,我们的思想是把整个数组分为两部分,因此需要取中间值,然后将中间值跟查找的元素比较,如果元素大则在后半部分查找,如果元素小则在前半部分查找。这样递归下去则可以找到元素的所在位置。 ②线性查找的思想就是迭代整个数组,当数组容量大时,这样效率很低!

Arrays工具类的使用

简介:

简介关键字
数组复制copyOfRange()
转换为字符串toString()
排序sort()
搜索binarySearch()
判断是否相同equals()
填充fill()
转换成ListasList()

Arrays.asList() 详解:

  • 该方法是将数组转化成List集合的方法。
  • List list = Arrays.asList("a","b","c");
  • 注意: (1)该方法适用于对象型数据的数组(String、Integer...) (2)该方法不建议使用于基本数据类型的数组(byte,short,int,long,float,double,boolean) (3)该方法将数组与List列表链接起来:当更新其一个时,另一个自动更新 (4)不支持add()、remove()、clear()等方法

数组中常见的异常

简介:

  • 编译时,不报错! !
  • 数组脚标越界异常(ArrayIndexOutOfBoundsException):访问到了数组中的不存在的脚标时发生。
int[ arr = new int[2];
System.out. println(arr[2]);
System.out. println(arr[-1]);
  • 空指针异常(NullPointerException):arr引用没有指向实体,却在操作实体中的元素时。
int] arr = null;
System.out.println(arr[O]);