重生之霸道Java强制爱(数组)

本文探讨了数组在IT技术中的基础概念,包括数组的动态和静态初始化,值传递与引用传递的区别,JVM内存模型,数组拷贝、翻转和扩容,以及冒泡排序、二分查找等排序算法的应用。同时涉及了字符串比较和多维数组,强调实践编程思维的重要性。
摘要由CSDN通过智能技术生成

 数组简直是太霸道了......

数组

学过C的我们都知道,数组是从0开始的,需要注意,但是不需要过多解释。

数组的长度,大小可以用:数组名.length

数组的使用

1.动态初始化

2.动态分配

第一种分配方法

第二种分配方法

先声明数组,再分配空间。

3.静态初始化

注意:

基本数据类型赋值是值传递,但是数组在默认情况下是引用传递,赋值赋的是地址。

数组拷贝

值传递和引用传递

这个话题就涉及到java运行更深层次的原理,大体原理与C语言相同,但是运行机制却不同。

【JVM】JVM内存模型(详细)-CSDN博客

这个是比较详细的介绍。

问:创建数组arr1,输入一些数字,再创建数组arr2,将arr1每个元素遍历拷贝到arr2对应位置中,arr1与arr2的地址一样吗?

答:不一样。

数组翻转

1.利用for循环和空变量进行翻转。(找规律)

2.逆序赋值

此时arr的地址就是arr2的地址。

数组扩容

当我们已经创建赋值了一个数组,但是因为需要,我们需要再次扩大数组的空间。

这个只是添加了一个,但是在实际应用中,我们需要的不只是一个。下面这个代码解决了单一的问题。

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);
System.out.println("你退出了添加...");
        }
}

数组排序

排序是指将多个数据。依靠指定顺序进行排序。

1.内部排序
指将需要处理的所有数据都加载到内部存储器中进行排序。包括 ( 交换式排序法、选择
式排序法和插入式排序法 )

8.【史上最全内部排序算法】(直接插入、折半插入、希尔) +(冒泡、快速)+(简单选择、堆{含元素的增删})+(归并)+ (基数)排序 + 对比总结_5. 内部排序算法的实现与比较 【问题描述】 从折半插入排序、希尔排序、冒泡排序-CSDN博客

2.外部排序
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括 ( 合并排序法和直接合并排序法 )

408数据结构学习笔记——外部排序_考研外部排序笔记-CSDN博客

冒泡排序

冒泡排序是利用嵌套循环,进行内外层循环进行冒泡。

思路:

  1. 比较相邻的两个元素,如果第一个比第二个大(小),则交换他们位置。
  2. 对每一对相邻元素做上述的工作,从开始第一对到结尾的最后一对,则最后的元素应该会是最大(最小)的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每趟对越来越少的元素重复上面的步骤,直到没有任何一对元素需要交换。

我们需要进行好多次比较,然后就会占用很多空间。所以有很多优化方法可以减少我们占用的空间。

【排序算法】:冒泡排序及其三种优化(Java)_冒泡排序如何减少比较次数-CSDN博客

(这个很算法的冒泡排序很拓宽思路,但是得看好几次)

【Java】冒泡排序_冒泡排序java-CSDN博客

(这个适合新手看理解,上面的编程思想有些上高度)

排序的算法浓度很高,所以在这里我们先不过多涉及,在之后会有详细讲解。

查找

在 java 中,我们常用的查找有两种:
1) 顺序查找
2) 二分查找【二分法,我们放在算法讲解】

我觉得顺序就是利用for循环遍历之后利用if 判断。

这样会占用许多空间。

所以二分查找,我们从中间对半分,找有符合项的那部分,再对半分,进行循环,直到找到符合项。

字符串的比较

//定义一个字符串数组
String[] names = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入名字");
String findName = myScanner.next();
//遍历数组,逐一比较,如果有,则提示信息,并退出
//这里老师给大家一个编程思想/技巧, 一个经典的方法
int index = -1;
for(int i = 0; i < names.length; i++) {
    //比较 字符串比较 equals, 如果要找到名字就是当前元素
    if(findName.equals(names[i])) {
    System.out.println("恭喜你找到 " + findName);
    System.out.println("下标为= " + i);
    //把 i 保存到 index
    index = i;
    break;//退出
    }
}
if(index == -1) { //没有找到
System.out.println("sorry ,没有找到 " + findName);
        }
    
    }
}

equals函数。

多维数组(二维数组)

二维数组的每个元素是一维数组 , 所以如果需要得到每个一维数组的值还需要再次遍历。
如果我们要访问第 (i+1) 个一维数组的第 j+1 个值 arr[i][j]; 举例 访问 3, =》 他是第 3 个一维数组的
4 个值 arr[2][3]。

使用方法

1.动态初始化

1) 语法 : 类型 [][] 数组名 =new 类型 [ 大小 ][ 大小 ]
2) 比如 : int a[][]=new int[2][3]

2.动态初始化——列数不确定性

3.静态初始化

定义 类型 数组名 [][] = {{ 1, 2..},{ 1, 2..},{ 1, 2..}}
使用即可 [ 固定方式访问 ]

public class TwoDimensionalArray05 {
    //编写一个 main 方法
        public static void main(String[] args) {
    /*
    int arr[][]={{4,6},{1,4,5,7},{-2}}; 遍历该二维数组,并得到和
      思路
    1. 遍历二维数组,并将各个值累计到 int sum
    */
    int arr[][]= {{4,6},{1,4,5,7},{-2}};
    int sum = 0;
    for(int i = 0; i < arr.length; i++) {
    //遍历每个一维数组
        for(int j = 0; j < arr[i].length; j++) {
            sum += arr[i][j];
            }
        }
    System.out.println("sum=" + sum);
    }
}

每个一维数组的个数都不相同。

例题:杨辉三角形

import java.util Scanner
public class Switch{
	public static void main (String[] args){
		Scanner myScanner = new Scannner(System.in);
		int number = Scanner.nextInt();//读取三角形行数
		int a[][] = new int [number][number];//给二维数组开辟新的空间

		for(int x = 0;x < number;x++){
			for (int y = 0;y < = x ;y++ ) {
				if(y == 0||y == x){
					a[x][y] = 1;
				}else{
					
					a[x][y] = a[x-1][y-1] + a[x-1][y];//我们发现规律用代码如上表示
				}
				//赋值完就输出
                System.out.print(a[x][y] + " ");

			}
			 //保证换行
            System.out.println();

		}



	}
}

到目前为止我们都是对概念的学习,顺便学习一下最简单的编程思想。

我建议大家不要光看,看懂并不代表会打,你自己去思考思路,思考需要创建什么变量,需要用什么方法,然后再去实行,你就会发现你有很多看过却模糊遗忘的细节。都是看过的,但是却不会用,就是竹篮打水一场空。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值