提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、什么是数组
- 数组本质上就是让我们能“批量”创建相同类型的变量(一次定义N个相同数据类型的变量)
- 什么是数据结构(把一堆数字保存起来的结构),数据结构关心的是如何高效的读写数据
二、数据的创建和初始化
一旦创建了数组 , 就不能再改变它的大小 ( 尽管可以改变每一个数组元素)
1.数据的动态初始化
数据动态初始化:
- 数据类型[] 数组名称 = new 数据类型[] {初始化数据}
- 数据类型[] 数组名称 = new 数据类型[num]
- 注:在创建数组时,若没有使用{}来初始化每个元素的值,每个元素都是该数据类型的默认值
- 数据类型 数组名称[],也可以用来声明数组,只是大多数程序员喜欢第一种风格,因为它将类型与变量名分割开来。
定义代码如下(示例):
int[] arr1 = new int[]{
1,2,3,4};
int[] arr2 = new int[4];
2.数组的静态初始化
数组的静态初始化:
- 数据类型[] 数组名称 = {初始化数据}
- 数组的静态初始化其实就是语法糖
- 注:javac编译后,静态初始化就是动态初始化
- 语法糖:只存在编译期之前的语法,编译器为了方便程序员简化写法
int[] arr = {
1,3,5,7,9}
- 获取一个数组的长度,使用数组名.length
如何访问数组元素:
- 使用数组名称[要访问的元素相对于第一个元素的偏移量]
- 使用数组名称[元素的索引]
索引其实就是“偏移量”,相较于数组的第一个元素的单位长度- 注:数组的元素下标是从0开始
- 注:数组在内存中存储是,每个元素之间都是顺序存、储的
遍历数组
- 两种不同的for循环遍历数组
- 第一种for循环里的i表示数组中每个元素的下标,注意是从0开始
- 第二种叫做for-each循环,是指从数组的第一个元素开始取值,把数组中的每一个元素拷贝一份,知道遍历结束
注:第二种循环只能读取数组中每一个元素的值,无法修改数组中的元素,知识一种拷贝
可以看出for-each循环并不能更改数组中的元素
数组作为方法参数
之前说过,我们如果想交换两个数值型变量,是不能交换成功的,需要利用引用类型数组
这里是为什么呢,这就涉及到JVM内存中的栈区和堆区问题,首先JVM将内存分为6个区域,现在先涉及堆区和栈区。
- 栈是一个先进先出的数据结构,方法的调用时在栈区进行的,每个方法的调用,都会伴随着入栈和出栈的过程
- 方法的局部变量和形参都存储在栈区,并且随着方法的调用结束,临时变量被销毁
+堆区是所有对象的存储区域,比如数组对象,类的实例化对象,接口对象等- int[] arr = new int[5];这是数组的一个引用,引用就是将这个对象起一个别名,保存的数值是这个对象的地址,对于数组来说,arr保存的就是这个长度为5的数组
- new这个关键字,就是在堆中开辟一块新的内存空间
三、数组的一些基本练习
1. 数组转换为字符串
- 实现一个方法 toString, 把一个整型数组转换成字符串. 例如数组 {1, 2, 3} , 返回的字符串为 “[1, 2, 3]”,注意 逗号 的位置和数量.
2.数组的排序之冒泡排序
算法思路:每次尝试找到当前待排序区间中最小(或最大)的元素,放到数组最前面(或最后面)
代码实现
public static void main(String[] args) {
int[] arr = new int[]{
1,4,5,2,8,6};
maopao(arr);
System.out.println(Arrays.toString(arr));
}
public static void