开门见山,这篇文章介绍Java数组的相关知识,博主还在学习中,有不足或错误还请指出,谢谢大家!!!
目录
一、数组是什么?怎么定义?
1.1 数组是什么
数组是一种数据结构,可以用来存储多个相同类型的元素。例如一个班同学的考试成绩,都是同一个类型,但是创建很多变量又很麻烦,所以引入数组
1.2数组的定义和初始化
下面展示做法:
错误的定义方法
二、如何打印出一个数组?
2.1 循环遍历数组
创建一个字符串用来接收数组中的值,利用循环从0下标遍历数组,最后打印字符串。
2.1.1 用for each循环遍历数组
还可以用增强for循环来进行遍历数组,遍历array2,取出每个元素放入x中
2.2 用自带方法遍历数组
这里介绍idea自带的方法,来遍历数组,操作很简单
三、为什么不能直接打印数组?
为什么我们要用各种方法去遍历输出数组,而不是直接打印出来,我们先来试试,直接打印
打印出来结果是:
这说明arr本身存储的是一个如上图的信息,我们叫这个叫引用,里面包含了数组类型和一串我们叫地址的数据,我们下面来介绍在Java中数组到底是怎么存储的
3.1 JVM的内存分配
在Java虚拟机中我们有堆和栈,而数组的定义和存储就在它们两个之间进行的
3.2 数组在内存的定义
我们由图看,数组本身是一个引用,它存储在栈中,而实际的数据存储在堆中,创建成了一个对象,堆给了这串数据一个地址,然后我们的数组通过这个引用指向了这个对象,这就是他们的存储形式
我们来用另一个方法印证一下
结果是!!!!
这就印证了上面的说话,它们两个现在的分布是下面这样的,两个引用指向了同一个对象
四、有返回值为数组的方法吗?
4.1 遍历数组方法(自己写的)
这是写成方法的打印数组的方法,大家可以自己试试
从下我们就能看出数组可以作为方法的返回值的方法了
4.2 数组每个值*2的方法
调用方法就不展示了,大家可以直接用打印方法,打出来。
4.3 数组冒泡排序(常见,经典)
4.3.1 什么是冒泡排序?
冒泡排序是一种简单的排序算法,每次比较相邻的两个元素,如果顺序错误则交换位置,直到没有任何两个相邻元素需要交换位置为止。重复这个过程直到所有的元素都按照顺序排列。
4.3.2 教会你写冒泡排序
我们介绍一些在数组这块常用的算法,经典的冒泡排序,直接看代码
代码三个要点,理清楚你就不用去背代码了,代码是死记硬背不了的
1. 为什么我们要两个循环?
2. i < array.length-1是为什么?
3. j < array.length-1-i 是为什么?
4. 返回时这么操作的好处?
提供源码,大家复制了直接用
public static void BubbleSort(int[]array){
//i代表趟数,这里解释一下,如果你去1一个个数字冒泡排序,
// 你会发现,实际需要比较的趟数是array.length-1趟。
// j代表实际数组下标
for (int i = 0; i <array.length-1 ; i++) {
boolean flg = false;
for (int j = 0; j <array.length-1-i ; j++) {
if (array[j] > array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flg = true;
}
}
if(flg==false){
return ;
}
}
}
4.4 有序数组的二分查找方法
直接代码讲解
定义左下标,右下标,它们的中间值用来比较
源代码:
public static int binarysearch(int[]array,int key){
int lift = 0;
int right = array.length;
while(lift < right){
int m = (lift + right)/2;
if(array[m]==key){
return m;
}
else if (array[m]>key) {
right = m;
} else if (array[m]<key) {
lift = m;
}
}
return -1;
}
五、二维数组怎么定义呢?
5.1二维数组在JVM中内存的分配
实际上二维数组是一种特殊的一维数组,拿一个定义的数组画图解释:
本质上二维数组就是存储了两个引用和两个对象
我们可以打印看看它们的引用
结果确实是这样
5.2 二维数组定义与初始化
来看代码:
5.2.1 不规则二维数组
5.3 遍历二维数组
三种方式,推荐第三种