数组
数组属于引用数据类型。
什么是数组
当保存或使用多个同类型的变量时,多个变量之间用逗号分隔,且必须赋值后才能使用。数组就是保存相同类型元素的一个集合(数组是一个线性表的数据结构)。数组在内存中是一段连续的空间,类似现实生活中的车库。
数组的特点
a、数组中存放的元素类型是完全相同的;
b、数组的空间是连续的,相邻元素紧挨着存储;
c、数组中每个空间都有其编号(相较于首元素的偏移量),称为数组元素的下标。
d、一旦声明创建一个数组之后,数组长度固定,无法修改。
数组的初始化
数组的动态初始化:创建数组时,规定长度,不给元素赋值,每个数组元素的值都是默认值。
语法:数据类型[] 数组名称 = new 数据类型[数组长度]
数组的静态初始化:声明并创建数组时,就给对应的元素进行赋值。
语法1:数据类型[] 数组名称 = {data1,data2,......,datan}
语法2:数据类型[] 数组名称 = new 数据类型[不写长度]{data1,data2,....,datan}
数组的使用
1、数组元素的访问
数组在内存中是一块连续的空间,空间编号从0开始一次递增,这个编号就称为数组的下标。最终访问数组元素就是根据数组名称[下标]
来取得对应的元素,而当访问了不合法的数组下标,就会抛出数组越界异常。
2、数组的遍历:按照一定的规则访问数组中的每个元素。
普通的for循环:可以进行增删改查
增强的for-each循环:只能用于数组的元素读取,不能修改元素。
语法:`for(数据类型,临时变量名称:数组名称){}
堆区和栈区
引用数据类型变量
基本数据类型变量保存的都是具体的数值,引用数据类型变量保存的是对应对象的地址(堆内存的地址)。引用数据类型就是给对象起别名,对象是实实在在的实体,通过new关键字产生,保存在堆内存中,引用就是给这个对象起名字,通过这个引用来访问对象。对于数组而言,引用保存了产生的数组对象的首元素地址,若此时改引用定义在main中,就属于临时变量在栈中存储。
引用数据类型的默认值null
当一个引用数据类型的值为null时,表示该引用不指向任何的内存空间,因此无法使用该引用获取任何值。一旦使用值为null的引用访问任何数值时,就会抛出空指针异常(NPE)。
引用数据类型作为方法的参数
回顾之前的swap函数:
引用数据类型作为方法的返回值
数组练习
1、数组转字符串
自定义实现:
2、数组拷贝
使用JDK提供的Arrays.copyOf方法可以真正复制一个数组(在堆上产生一个新空间,并将原数组内容拷贝过来)。
当新数组的长度和原数组长度相同,称为完全拷贝;
当新数组的长度小于原数组,称为部分拷贝,此时从第一个元素开始复制,直到复制到新数组长度为止;
当新数组的长度大于原数组,此时超过长度的新数组元素使用数据类型的默认值填充。
自定义实现:
2、数组元素的查找:二分查找,前提是有序数组
在查找元素时,每次都在和区间的中间位置进行比较,然后将待查区间一分为二,直到区间变为0。
3、数组的排序:冒泡排序
核心思想:不断的将前一个元素和后一个元素进行大小比较,若前一个比后一个大,就两两交换彼此位置,不断重复此过程,直到数组有序。
4、数组的逆序
二维数组
二维数组本质上就是个表格。
动态初始化:数据类型[][] 数组名称 = new 数据类型[行数][列数]
;
静态初始化:数据类型[][] 数组名称 = new 数据类型[][]{{第一行数据},{第二行数据},.......}
二维数组的遍历