Hi i,m JinXiang
⭐ 前言 ⭐
本篇文章主要介绍Java数组、冒泡排序使用以及部分理论知识
🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁
🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言
目录
一、数组
数组介绍
- 数组可以存放多个同一类型的数据。
- 数组也是一种数据类型,是引用类型。
- 即:数组就是一组数据
数组的使用
1.1、动态初始化
数组的定义
数据类型 数组名[] = new 数据类型【大小】
int a[]=new int[5];
//创建了一个数组,名字a,存放5个int
说明:这是定义数组的一种方法。
1.2、动态初始化
-
1、先声明数组
- 语法:数据类型数组名[];也可以数据类型[]数组名;
- inta[];或者int[]a;
-
2、创建数组
- 语法:数组名=new数据类型[大小];
- a=newint[10];
1.3、静态初始化
- 1、初始化数组
- 语法:数据类型 数组名[] = (元素值 , 元素值..}
- int a[]={2,5,6,7,8,89,90,34,56},如果知道数组有多少元素,具体值上面的
- 用法相当于: int a[] =new int[9];
- a[0]= 2;a[1]=5;a[2]=6; a[3]=7;a[4]=8;
- a[5]=89;a[6] =90;a[7]=34;a[8]=56;
- 用法相当于: int a[] =new int[9];
数组使用注意事项和细节
-
1)数组是多个相同类型数据的组合,实现对这些数据的统一管理
-
2)数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
-
3)数组创建后,如果没有赋值,有默认值
- int0,short0,byte0,long0,float0.0,double0.0,char\u0000,booleanfalse,Stringnull
-
4)使用数组的步骤1.声明数组并开辟空间2给数组各个元素赋值3使用数组
-
5)数组的下标是从0开始的。
-
6)数组下标必须在指定范围内使用,否则报:下标越界异常,比如
- int[]arr=newint[5];则有效下标为0-4
-
7)数组属引用类型,数组型数据是对象(object)
代码示例--错误释放
java
package com.example.han_severejava.XunHuan;
public class 数组 {
public static void main(String[] args) {
//1.数组是多个相同类型数据的组合,实现对这些数据的统一管理
//int[]arr1={1,2,3,60,"hello"};//String->int
double[]arr2={1.1,2.2,3.3,60.6,100};//int->double
//2.数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
String[]arr3={"北京","jack","milan"};
//3.数组创建后,如果没有赋值,有默认值
//int 0,short0,byte0,long0,
//float0.0,double0.0,char\u0000,
//booleanfalse,Stringnull
short[]arr4=new short[3];
System.out.println("=====数组arr4=====");
for(int i=0;i<arr4.length;i++){
System.out.println(arr4[i]);
}
//6.数组下标必须在指定范围内使用,否则报:下标越界异常,比如
// int[]arr=newint[5];则有效下标为0-4
//即数组的下标/索引最小0最大数组长度-1(4)
int[]arr=new int[5];
System.out.println(arr[5]);//数组越界
}
}
数组赋值机制
- 1、基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
- int n1 = 2;
- int n2 = n1;
- 2、数组在默认情况下是引用传递,赋的值是地址。
- 看一个案例,并分析数组赋值的内存图(重点,难点.)。
int[]arr1={1,2,3};
int[]arr2=arr1;
数组拷贝
数组拷贝介绍
将 int[]arr1={10,20,30}; 拷贝到 arr2 数组 , 要求数据空间是独立的
代码示例拷贝过程
java
package com.example.han_severejava.XunHuan;
public class 数组拷贝 {
public static void main(String[] args) {
//将int[]arr1={10,20,30};拷贝到arr2数组,
//要求数据空间是独立的.
int[]arr1={10,20,30};
//创建一个新的数组arr2,开辟新的数据空间
//大小arr1.length;
int[] arr2=new int[arr1.length];
//遍历arr1,把每个元素拷贝到arr2对应的元素位置
for(int i=0;i<arr1.length;i++){
arr2[i]=arr1[i];
}
//老师修改arr2,不会对arr1有影响.
arr2[0]=100;
//输出arr1
System.out.println("====arr1的元素====");
for(int i=0;i<arr1.length;i++) {
System.out.println(arr1[i]);//10,20,30
}
//输出arr2
System.out.println("====arr2的元素====");
for(int i=0;i<arr2.length;i++) {
System.out.println(arr2[i]);//
}
}
}
结果展示
数组反转
要求:把数组的元素内容反转。
arr{11,22,33,44,55,66} {66,55,44,33,22,11}
代码示例内容反转过程
java
package com.example.han_severejava.XunHuan;
public class 数组反转 {
public static void main(String[] args) {
//定义数组
int[]arr={11,22,33,44,55,66};
//规律
//1.把arr[0]和arr[5]进行交换{66,22,33,44,55,11}
//2.把arr[1]和arr[4]进行交换{66,55,33,44,22,11}
//3.把arr[2]和arr[3]进行交换{66,55,44,33,22,11}
//4.一共要交换3次=arr.length/2
//5.每次交换时,对应的下标是arr[i]和arr[arr.length-1-i]//代码
//优化
int temp=0;
int len=arr.length;//计算数组的长度
for(int i=0;i<len/2;i++){
temp=arr[len-1-i];//保存
arr[len-1-i]=arr[i];
arr[i]=temp;
}
System.out.println("===翻转后数组===");
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");//66,55,44,33,22,11
}
}
}
图片介绍操作
另一种方法----看图诠释
结果展示
数组扩容
扩容介绍
要求:实现动态的给数组添加元素效果,实现对数组扩容
- 1、原始数组使用静态分配int[]arr={1,2,3}
- 2、增加的元素4,直接放在数组的最后arr={1,2,3,4}
- 3、用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
代码示例扩容
java
package com.example.han_severejava.XunHuan;
import java.util.Scanner;
public class 数组扩容 {
public static void main(String[] args) {
/*
要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java
1.原始数组使用静态分配int[]arr={1,2,3}
2.增加的元素4,直接放在数组的最后arr={1,2,3,4}
3.用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
思路分析
1.定义初始数组int[]arr={1,2,3}//下标0-2
2.定义一个新的数组int[]arrNew=newint[arr.length+1];
3.遍历arr数组,依次将arr的元素拷贝到arrNew数组
4.将4赋给arrNew[arrNew.length-1]=4;把4赋给arrNew最后一个元素
5.让arr指向arrNew;arr=arrNew;那么原来arr数组就被销毁
6.创建一个Scanner可以接受用户输入
7.因为用户什么时候退出,不确定,老师使用do-while+break来控制
*/
Scanner myScanner=new Scanner(System.in);//初始化数组
int[]arr={1,2,3};
do {
int[] arrNew = new int[arr.length + 1];
//遍历arr数组,依次将arr的元素拷贝到arrNew数组
for (int i = 0; i < arr.length; i++) {
arrNew[i] = arr[i];
}
System.out.println("请输入你要添加的元素");
int addNum = myScanner.nextInt();
//把addNum赋给arrNew最后一个元素
arrNew[arrNew.length - 1] = addNum;
//让arr指向arrNew,
arr = arrNew;
//输出arr看看效果
System.out.println("====arr扩容后元素情况====");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println("是否继续添加(y/n)");
char key = myScanner.next().charAt(0);
if (key == 'n') {//如果输入n,就结束
break;
}
//问用户是否继续
} while (true);
}
}
代码图片解释
结果展示
数组缩减
- 有一个数组{1,2,3,4,5},可以将该数组进行缩减,
- 提示用户是否继续缩减,每次缩减最后那个元素。
- 当只剩下最后一个元素,提示,不能再缩减。
二、排序介绍
排序是将多个数据,依指定的顺序进行排列的过程。
内部排序
指将需要处理的所有数据都加载到内部存储器中进行排序。包括 ( 交换式排序法、选择
式排序法和插入式排序法 ) ;
外部排序
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括 ( 合并排序法和直接合并排序法 ) 。
三、冒泡排序法
冒泡排序介绍
冒泡排序( BubbleSorting )的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
冒泡排序案例
冒泡排序代码诠释
四、查找
1、顺序查找
案例演示:
1)有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】要求 : 如果找到了,就提示找到,并给出下标值。
java
package com.example.han_severejava.查找;
import java.util.List;
import java.util.Scanner;
public class 顺序查找 {
public static void main(String[] args) {
//1)有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,
// 判断数列中是否包含此名称【顺序查找】
// 要求:如果找到了,就提示找到,并给出下标值。
String names[] = {"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"};
Scanner input = new Scanner(System.in);
System.out.println("请输入一个名称:");
String findName = input.next();
int index = -1;
for (int i = 0; i < names.length; i++) {
if (findName.equals(names[i])) {
System.out.println("已找到"+findName+",当前下标是:"+i);
index = i;
break;
}
}
if (index == -1){
System.out.println("未找到"+findName);
}
}
}
结果:
2、二分查找
五、二维数组
什么是二维数组?
-
- 从定义形式,上看int[][ ]
-
- 可以这样理解,原来的一维数组的每个元素是一维数组,就构成二维数组
java
package com.example.han_severejava.二维数组;
public class 什么是二维数组 {
public static void main(String[] args) {
//二维数组的格式 数组类型 [][] 数组名称 = {{},{},{}}
int [][] arr = {
{0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0},
{0, 2, 0, 3, 0, 0},
{0, 0, 0, 0, 0, 0}
};
//关于一维数组的关键概念
//(1)
System.out.println("二维数组的元素个数="+ arr.length) ;
//(2)二维数组的每个元素是一维数组,所以如果需要得到每个一维数组的值,还需要再次逼历
//(3) 如果我们要访问第(i+1)个一维数组的第j+1个值 arr[i][j];
// 举例访问3, =》他是第3个一维数组的第4个值arr[2][3]
System.out.println("第3个一维数组的第4个值="+ arr[2][3]); //3
//输出二维数组
for (int i = 0; i < arr.length; i++) {//遍历二维数组的每个元素
//arr[i] 表示 二维数组的第i+1个元素 比如arr[0]:二维数组的第一个元素
//arr[i].length 得到对应的 每一个一维数组的长度
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");//输出一维数组
}
System.out.println();//换行
}
}
}
二维数组的使用
1、动态初始化
- 1)语法:类型[] []数组名=new类型[大小][大小]
- 2)比如: int a[]I[]=new int[2][3]
- 3)使用演示 ↓
- 4)二维数组在内存的存在形式 ↓
java
package com.example.han_severejava.二维数组;
public class 二维数组的内存布局 {
public static void main(String[] args) {
int arr[][] = new int[2][3]; //一个二维数组
//给他赋值(从0开始)
arr[1][2] = 8;//"[1]"表示在第二个数组中 "[2]"表示第三个数据
//遍历数组
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) { //对每个一维数组遍历
System.out.print(arr[i][j]+" ");
}
System.out.println(); //换行
}
}
}
2、动态初始化
- 1)先声明:类型 数组名[] [];
- 2)再定义(开辟空间) 数组名 = new 类型 [大小][大小]
- 3)赋值(有默认值,比如int 类型的就是0)
- 4)使用演示
3、动态初始化-列数不确定
- 1)看一个需求:动态创建下面二维数组,并输出。
- 如:
4、静态初始化
- 定义类型数组名[[] = {{值1,值2..},{值1,值2..},{值1,值2..}}
- 2.使用即可[固定方式访问]
二维数组的应用
杨辉三角练习
java
package com.example.han_severejava.二维数组;
public class 杨辉三角 {
public static void main(String[] args) {
int[][] yangHui = new int[10][];
for (int i = 0; i < yangHui.length; i++) {
//给每个一维数组(行)开空间
yangHui[i] = new int[i + 1];
//给每一个一维数组(行)赋值
for (int j = 0; j < yangHui[i].length; j++) {
//每一行的第一个元素和最后一个元素都是1
if (j==0 || j==yangHui[i].length -1){
yangHui[i][j] = 1;
}else {//中间的元素
yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
}
}
}
//输出杨辉三角
for (int i = 0; i < yangHui.length; i++) {
for (int j = 0; j < yangHui[i].length; j++) {
System.out.print(yangHui[i][j] + " ");
}
System.out.println();
}
}
}
二维数组使用细节和注意事项
总结不易,希望宝宝们不要吝啬亲爱的👍哟(^U^)ノ~YO!如有问题,欢迎评论区批评指正😁