【精选】java日常记录4--数组

从这里开始就正式进入java的核心部分了。

数组

那么,什么才是数组呢?他的定义又是什么呢?

数组的定义:

  1. 数组是相同类型数据的有序集合.
  2. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
  3. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们.

注意:数组的下标是从0开始的,所以10个数的话,下标就是9 ,例如a[0]=1,a[9]=10;

数组的四个基本特点:

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

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

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

4.数组变量属引用类型 ,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组 本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

数组声明创建

声明数组

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

java 复制代码
 dataType[] arrayRefVar;	//	首选的方法
或		
 dataType arrayRefVar[];	//	效果相同,但不是首选方法

如: int [] a ; int a [] 等等。

创建数组

java 复制代码
//这是在上边代码声明数组后直接使用
 arrayRefVar	=	new	dataType[arraySize];
//也可以
 dateType [] arrayRefVar = new dateType[arraySize];
java 复制代码
public static void main(String[] args) {
//1.声明一个数组
int[] myList = null;
//2.创建一个数组
myList = new int[10];
//3.像数组中存值
myList[0] = 1;
myList[1] = 2;
myList[2] = 3;
myList[3] = 4;
myList[4] = 5;
myList[5] = 6;
myList[6] = 7;
myList[7] = 8;
myList[8] = 9;
myList[9] = 10;
// 计算所有元素的总和
double total = 0;
//myList.length;获取数组的长度 这里数组长10
for (int i = 0; i < myList.length; i++) total += myList[i];
}
System.out.println("总和为: " + total);
}

java内存分析

1.声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。因此,声明数组时不能指定其长度(数组中元素的个数),例如:

int a[5]; //非法

2.声明一个数组的时候并没有数组被真正的创建。

3.构造一个数组,必须指定长度

数组的三种初始化

静态初始化

除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。

java 复制代码
int[]	a = {1,2,3};	
Man[]	mans = {new Man(1,1),new	Man(2,2)};

动态初始化

数组定义、为数组元素分配空间、赋值的操作、分开进行。

java 复制代码
int[] a = new int[2];
a[0]=1;
a[1]=2;

数组的默认初始化

数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实 例变量同样的方式被隐式初始化。

java 复制代码
public static void main(String[] args) {
	int[] a=new int[2];
	boolean[] b = new boolean[2];
	String[] s = new String[2];
	System.out.println(a[0]+":"+a[1]); //0,0
	System.out.println(b[0]+":"+b[1]);	//false,false
	System.out.println(s[0]+":"+s[1]); //null, null 
}

数组边界

下标的合法区间: [0, length-1] ,如果越界就会报错

java 复制代码
public static void main(String[] args) {
	int[] a=new int[2];
	System.out.println(a[2]);  //很明显,这里下标越界了
}

1Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2

数组使用

数组的元素类型和数组的大小都是确定的,所以当处理数组元素时候,我们通常使用基本循环或者 For- Each 循环。

java 复制代码
//该实例完整地展示了如何创建、初始化和操纵数组
public class TestArray {
	public static void main(String[] args) { 
		double[] myList = {1.9, 2.9, 3.4};
		// 打印所有数组元素
		for (int i = 0; i < myList.length; i++) { 
	 		System.out.println(myList[i] + " ");
		}
		// 计算所有元素的总和
		double total = 0;
		for (int i = 0; i < myList.length; i++) {
	 		total += myList[i];
		}
		System.out.println("Total is " + total);
		// 查找最大元素
		double max = myList[0];
			for (int i = 1; i < myList.length; i++) {
		 		if (myList[i] > max) {
					max = myList[i];
					}
			 }
		System.out.println("Max is " + max);
	}
}	

For-Each 循环

JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者加强型循环,它能在不使用下标的情况下遍历数组。

java 复制代码
for(type element: array){ 
		System.out.println(element);
}
java 复制代码
public static void main(String[] args) {
	double[] myList = {1.9, 2.9, 3.4, 3.5};

	// 打印所有数组元素
	for (double element: myList) {
		System.out.println(element);
		}
}

数组作方法入参

数组可以作为参数传递给方法。

java 复制代码
public static void printArray(int[] array) { 
	for (int i = 0; i < array.length; i++) {
		System.out.print(array[i] + " ");
	}
}

数组作返回值

java 复制代码
public static int[] reverse(int[] list) {
	//声明有一个数组
	int[] result = new int[list.length];
		
	for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
		result[j] = list[i];
	}
	return result;
}

多维数组

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维 数组。

java 复制代码
type[][] typeName =	new	type[typeLength1][typeLength2];

type 可以为基本数据类型和复合数据类型,

arraylenght1 和 arraylenght2 必须为正整数,

arraylenght1为行数,arraylenght2 为列数。

如:

int a[][] = new int [2][5];

  • 具体对二维数组的理解,我愿称之为一维数组,是一条直线,一路走到底,
  • 二维数组是个平面,可以用数学中的坐标轴表示,用 int a[][] = new int [2][5]; 表示 2 代表 x = 2 , y = 5 的那个点 ,当然这里是这么理解的,我们还得考虑数组的下标是以0开始的,从而x的取值为0,1,y的取值为0,1,2,3,4.从而这个定义的数组范围就出来了。
  • 三维就是立体的了,这个高中立体几何学的好的更加理解,这里不在啰嗦了。事实上,把多个一维数组组合在一起,每个一维数组都在不同方位上就组成了多维数组了。

获取数组长度:

  • 注意
    a.length获取的二维数组第一维数组的长度,a[0].length才是获取第二维第一个数组长度。

数组的工具类java.util.Arrays

由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。

java.util.Arrays 类能方便地操作数组. 使用之前需要导包! 具有以下常用功能:

  • 给数组赋值:通过 fill 方法。
  • 对数组排序:通过 sort 方法,按升序。
  • 比较数组:通过 equals 方法比较数组中元素值是否相等。
  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

    打印数组
java 复制代码
	public static void main(String[] args) { 	
		int[] a = {1,2};
		System.out.println(a);	//[I@1b6d3586
		System.out.println(Arrays.toString(a));	//[1, 2] 	
}

数组排序

对指定的 int 型数组按数字升序进行排序

java 复制代码
public static void main(String[] args) {
	 int[] a = {1,2,323,23,543,12,59};
	System.out.println(Arrays.toString(a)); 
	Arrays.sort(a);  //java自带的排序
	System.out.println(Arrays.toString(a));
}

二分法查找

使用二分搜索法来搜索指定的数组,以获得指定的值。必须在进行此调用之前对数组进行排序(通 过sort方法等)。如果没有对数组进行排序,则结果是不确定的。

java 复制代码
public static void main(String[] args) { 
	int[] a = {1,2,323,23,543,12,59};
	Arrays.sort(a);	//使用二分法查找,必须先对数组进行排序
	System.out.println("该元素的索引:"+Arrays.binarySearch(a, 12));
}

元素填充

java 复制代码
public static void main(String[] args) { 
	int[] a = {1,2,323,23,543,12,59};
	Arrays.sort(a);	//使用二分法查找,必须先对数组进行排序
	Arrays.fill(a, 2, 4, 100);	//将2到4索引的元素替换为100 
	System.out.println(Arrays.toString(a));
}

数组转换为List集合

java 复制代码
	int[] a = {3,5,1,9,7};
	List<int[]> list = Arrays.asList(a);

常见排序算法

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从

A到Z)错误

就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经 排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢"浮"到数列的顶端(升序或降序排列),就如同 碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名"冒泡排序"。

冒泡排序算法的原理如下:

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会 是最大的

数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

java 复制代码
class Bubble {
	public int[] sort(int[] array) {
		int temp = 0;
		// 外层循环,它决定一共走几趟 //-1为了防止溢出
		for (int i = 0; i < array.length - 1; i++) {
		int flag = 0; //通过符号位可以减少无谓的比较,如果已经有序了,就退出循环
		//内层循环,它决定每趟走一次
		for (int j = 0; j < array.length - i - 1; j++) {
		//如果后一个大于前一个,则换位
		if (array[j + 1] > array[j]) {
			temp = array[j];
			array[j] = array[j + 1];
			array[j + 1] = temp;
			flag = 1;
		}
	}
	if (flag == 0) {
		break;
		}
	}
	return array;
}

public static void main(String[] args) {
	Bubble bubble = new Bubble();
	int[] array = {2, 5, 1, 6, 4, 9, 8, 5, 3, 1, 2, 0};
	int[] sort = bubble.sort(array);
	for (int num : sort) {
		System.out.print(num + "\t");
		}
	}
}

选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小

(大)元素,然后放到排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

java 复制代码
class SelectSort{
	public int[] sort(int arr[]) {
		int temp = 0;
		for (int i = 0; i < arr.length - 1; i++) {// 认为目前的数就是最小的, 记录最小数的下标
			int minIndex = i;
				for (int j = i + 1; j < arr.length; j++) {
					if (arr[minIndex] > arr[j]) {// 修改最小值的下标
						minIndex = j;
					}
				}// 当退出for就找到这次的最小值,就需要交换位置了
		if (i != minIndex) {//交换当前值和找到的最小值的位置
			temp = arr[i];
			arr[i] = arr[minIndex];
			arr[minIndex] = temp;
			}
		}
	return arr;
}

public static void main(String[] args) {
	SelectSort selectSort = new SelectSort();
	int[] array = {2, 5, 1, 6, 4, 9, 8, 5, 3, 1, 2, 0};
	int[] sort = selectSort.sort(array);
	for (int num : sort) {
		System.out.print(num + "\t");
		}
	}
}
相关推荐
千楼2 分钟前
阿里巴巴Java开发手册(1.3.0)
java·代码规范
reiraoy16 分钟前
缓存解决方案
java
安之若素^30 分钟前
启用不安全的HTTP方法
java·开发语言
ruanjiananquan9936 分钟前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
chuanauc1 小时前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴1 小时前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc7871 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao4 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张34 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端