总结java学习(B站狂神说和动力节点老杜)——day5数组和八大算法

Java数组

数组概述

数组的定义

具有相同类型的一组数据的有序集合


数组的声明和创建

数组的声明

/dataType:int, double, float/

  1. 首选方法

    dataType[] arrayRefVar;

  2. 效果相同,但是不推荐

    dataType arrayRefVar[];

数组的创建

dataType[] arrayRefVar = new dataType[arraysize];

ex: int[] numbers = new int[10];

数组长度的获取

arrays.length;//返回值是一个int

内存图分析

  1. 声明数组

    int[] array = null;

  2. 创建数组

    array = new int[10];

一维数组内存图

三种初始化

静态初始化

int[] a = {1, 2, 3};

Man[] max = {new Man(1, 1),new Man(2, 2)};

动态初始化

int[] a = new int[2];

a[0] = 1;

a[1] = 2;

数组的默认初始化

数组是引用数据类型,他的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被系统赋予默认值


数组边界

ArrayIndexOutOfBoundsException

数组下标越界异常

小结
  1. 数组是相同数据类型
  2. 数组也是对象。数组元素相当于对象的成员变量
  3. 数组长度是确定的,不可变的。

总结

数组的四个基本特点
  1. 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

  2. 其元素必须是相同的类型,不允许出现混合类型

  3. 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型

  4. 数组变量属于引用数据类型,数组对象可以看成是对象,数组中的每个元素相当于该对象的成员变量。

    数组本身就是对象,java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,

    对象本身是在堆当中的。


数组的使用

普通for循环
for-Each循环
for ( 变量类型  变量名 : 数组名 ) {
    
    需要执行的循环语句;
 
}
boolean found = false;
	for ( int k : data ) {
		if ( k==x ) {
			found = true;
			break;
		}
	}
数组作方法入参
public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};  
    
        int[] result = reverse(array);
    
        for (int i : result) {
            System.out.println(i);
        }
 }
public static int[] reverse(int[] arrays){
    
	int[] result = new int[arrays.length];
    
	for (int i = 0; i < arrays.length; i++) {
		result[i] = arrays[arrays.length - 1 - i];
	}
	return result;
}
数组作为返回值

多维数组★★★★★

数组中的元素是数组

二维数组
int[][] array = {{1, 2},{3, 4},{5, 6}};
遍历二维数组的元素
  1. 直接打印array[i]

    for (int i = 0; i < array.length; i++) {
    	System.out.println(array[i]);
    }
    /*[I@119d7047
    [I@776ec8df
    [I@4eec7777*/
    

    打印出来的是数组每行首个元素在堆中的地址

    以下代码效果相同

    for (int[] ints : array) {
    	System.out.println(ints);
    }
    
  2. 正确打印

    for (int i = 0; i < array.length; i++) {
    	for (int j = 0; j < array[i].length; j++) {
    		System.out.println(array[i][j]);
    	}
    }
    

    以下代码效果相同

    for (int[] ints : array) {
    	for (int i : ints) {
    		System.out.println(i);
    	}
    }
    

Arrays类

打印数组元素

注意:Arrays.toSrting(数组名);只能打印一维数组的元素,如果是二维数组,要打印,那么必须要降维

  1. 一维数组

    int[] array2 = {1, 2, 3, 4};
    System.out.println(Arrays.toString(array2));
    /* [1, 2, 3, 4]*/
    
  2. 二维数组

    int[][] array = {{1, 2}, {3, 4}, {5, 6}};
    for (int[] ints : array) {
    	System.out.println(Arrays.toString(ints));
    }
    /*[1, 2]
    [3, 4]
    [5, 6]*/
    
排序数组元素

注意:Arrays.sort(数组名);只能排序一维数组的元素,如果是二维数组,要排序,那么必须要降维,并且排序只排序一维数组,调换二维数组顺序之后,没有作用

int[] array2 = {5, 9 ,654 ,8};
Arrays.sort(array2);
System.out.println(Arrays.toString(array2));
/*[5, 8, 9, 654]*/
填充数组元素

Arrays.fill(数组名,想要填满的数字);

int[] array3 = new int[8];
Arrays.fill(array3,9);
System.out.println(Arrays.toString(array3));
/*[9, 9, 9, 9, 9, 9, 9, 9]*/

八大排序算法★★★★★

冒泡排序

从头开始比较两个相邻数的大小,按照定好的顺序(从大到小或者从小到大的顺序)判断是否需要在数组中交换两个数

第一轮会找出一个最大(或最小)的值并且已经放放到了数组的第一位(或者最后一位),那么第二轮就不需要比较这个数了,比较次数减少1

第二轮也会找出一个最大(或最小)的值并且已经放放到了数组的第二位(或者最后第二位),那么第三轮就不需要比较这两个数了,比较次数减少2

int[] array = {5, 9 ,654 ,8, 984, 12 ,4, 6, 21};
int flag = array.length - 1;
for (int i = 0; i < array.length; i++) {
	for (int j = 0; j < flag - i; j++) {
		if (array[j] > array[j + 1]) {
			int temp = array[j];
			array[j] = array[j + 1];
			array[j + 1] = temp;
		}
	}
}
System.out.println(Arrays.toString(array));
选择排序

每此都从数组中剩余的数中选择一个最小(最大)的数,放在数组最前(最后)

int[] array = {5, 9 ,654 ,8, 984, 12 ,4, 6, 21};
for (int i = 0; i < array.length; i++) {
	int min = i;
	for (int j = i + 1; j < array.length; j++) {
		if (array[min] > array[j]){
			min = j;
		}
	}
	int temp;
	temp = array[i];
	array[i] = array[min];
	array[min] = temp;
}
System.out.println(Arrays.toString(array));
直接插入排序(二分法优化)

把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程

int[] array = {5, 9, 654, 8, 984, 12, 4, 6, 21};
int low, high, mid;//将mid设置为哨兵
for (int i = 1; i < array.length; i++) {
    low = 0;
    high = i - 1;
    mid = (low + high) / 2;
    if (array[i] >= array[high]) {
        continue;
    }
    while (high >= low) {
        if (array[i] > array[mid]) {
            low = mid + 1;
            mid = (low + high) / 2;
        } else if (array[i] < array[mid]) {
            high = mid - 1;
            mid = (low + high) / 2;
        }
    }
    if (array[i] >= array[mid]) {
        int temp = array[i];
        for (int j = i; j > mid + 1; j--) {
            array[j] = array[j - 1];
        }
        array[mid + 1] = temp;
    } else {
        int temp = array[i];
        for (int j = i; j > mid ; j--) {
            array[j] = array[j - 1];
        }
        array[mid] = temp;
    }
}
System.out.println(Arrays.toString(array));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: B站上有一位用户称为"狂神",他分享了很多关于Spring Boot的网盘资料。Spring Boot是一种用于开发Java应用程序的框架,具有简化配置和快速开发的特点。狂神通过分享这些资料,帮助了很多对Spring Boot感兴趣的开发者。 这些资料中包含了许多有用的教程、示例代码和项目实战,涵盖了Spring Boot的各个方面。开发者们可以根据自己的需求和兴趣选择合适的资料进行学习和实践。这些资料不仅能够帮助开发者快速入门Spring Boot,还能够提高他们的开发能力和解决实际项目中的问题。 此外,狂神还经常更新和分享最新的Spring Boot资讯和技术文章,使开发者们能够跟上最新的开发趋势和技术进展。他的分享得到了广大开发者的赞赏和支持,在B站上积累了很高的人气和观看量。 总而言之,狂神B站上分享的Spring Boot网盘资料为开发者们提供了学习和实践的机会,帮助他们提升技术水平和解决问题能力。感谢狂神的分享,希望他能继续分享更多有价值的资料,为开发者们带来更多的帮助。 ### 回答2: B站狂神SpringBoot网盘资料是一份非常有价值的学习资源。SpringBoot是一种基于Spring框架的轻量级开发框架,它极大地简化了Java应用程序的开发和部署过程。狂神B站上非常受欢迎的编程博主,他的视频课程非常系统和深入,非常适合想要学习SpringBoot的开发者。 在狂神的SpringBoot网盘资料中,我们可以找到很多有关SpringBoot的学习资源。首先,他会提供一些关于SpringBoot框架的介绍和基本概念的视频教程,这些教程可以帮助初者快速入门,并理解SpringBoot的设计理念和核心功能。 其次,在资料中还包括了一些实战项目的视频课程,这些课程会教我们如何使用SpringBoot来开发不同类型的应用程序,如Web应用、RESTful API等。通过跟随实际项目的开发过程,我们可以更好地理解SpringBoot的使用方法和技巧。 此外,狂神的网盘资料中还会包含一些与SpringBoot相关的常用工具、插件和框架的介绍和使用方法。这些工具和框架能够提供更便捷和高效的开发体验,如MyBatis、Spring Data JPA、Spring Security等。 综上所述,B站狂神SpringBoot网盘资料是一份非常有价值的学习资源,通过学习和实践,我们可以快速掌握SpringBoot的开发技术,并在实际项目中运用它。无论是初者还是有一定经验的开发者,这份资料都是非常值得一看的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值