Java数组

Java数组

一、数组声明创建

1、声明数组:

数组元素类型 数组名[]/[][]
数组元素类型 []/[][]数组名
为数组分配元素:
数组名=new 数组元素类型[数组元素个数]

2、声明和创建一起:

int 数组名[][]=new int[3][4]
表示 3个长度为4的一维数组

数组类型[] 数组名=new 数组元素类型[数组元素个数]

3、获取数组长度:

arrays.length

4、三种初始化

静态初始化
int[] a={1,2,3};
Man[] mans={new Man(1,1),new Man(2,2)} (引用类型)

动态初始化
int a=new int[2];
a[0]=1;
a[1]=2;

数组的默认初始化
数组数引用类型,它的元素相当于类的实例变量,因此数组元素也按照实例变量同样的方式被隐式初始化

二、数组的基本特点

其长度是确定的,一旦创建,长度不可以改变
其元素必须是相同类型
数组中的元素可是任何数据类型,包括基本类型和引用类型
数组变量属于引用类型,数组也可以看成对象,数组中的每个元素1可以看成对象的成员变量
数组本身就是对象,Java中对象是在堆中的,因此无论数组保存原始类型还是其他对象类型,数组对象本身是在堆中的

java内存分析

方法在栈,实例在堆。可以把栈当成书的目录,堆当作内容,位置就是页数。

java.lang.ArrayIndexOutOfBoundsException:10
表示数组下标越界异常

三、数组的使用

1、for-each循环

数组1

2、数组作方法入参

打印数组
数组2

3、数组作返回值

反转数组
这里的打印数组调用了reverse(),用到了反转数组和打印数组两种方法

四、二维数组

int a[][]=new int[2][5]
可以看成是2行5列的数组或者2个长度为5的一维数组
system.out.print(a[1])
这个输出的只是一维数组的地址值,如果要输出具体值的话,可以调用打印数组的方法
打印数组方法等同于Arrays.toString()
System.out.println(Arrays.toString(a)) 【用Arrays类里面的方法】

system.out.print(a[1][0])
这个就可以输出具体值

数组4

五、Arrays类

数组的工具类java.util.Arrays
Arrays类中的方法都是static修饰的静态方法,在使用的时候直接用类名调用,不需要用对象来调用

常用功能:
给数组赋值:通过fill方法
Arrays.fill(a,fromIndex:2,toIndex:4,val:0);填充的只有下标为2和3的,左闭右开

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

六、冒泡排序(八大排序之一)

时间复杂度: n的平方

  • 比较数组中相邻的两个元素,如果第一个数比第二个数大,我们就交换他的顺序
  • 每一次比较都会产生一个最大或者最小
  • 下一轮排序可以少一次排序
  • 依次循环,直至结束

冒泡排序

如果数组已经有排序好的,可以进行优化,设立flag标识位,减少没必要的比较如下图
优化

七、稀疏数组

当一个数组中大部分元素为0,或者同一值的数组时可以用稀疏数组保存

稀疏数组的处理方式:
记录数组一共有几行几列,有多少个不同值
把具有不同值的元素和行列及值记录在一个小数组里

如下:左边是原始数组,右边是稀疏数组
例子

练习

该题是先创建一个二维数组,获取并输出二维数组,再计算二维数组的有效值个数;然后再创建稀疏数组,并将二维数组转化为稀疏数组输出;最后再创建一个新的二维数组,获取稀疏数组的值后还原数组

该题要注意一下,输出打印稀疏数组时有两种方法。可以用遍历数组的方法,两个for循环;也可以用一个循环

package com.an;

import java.util.Arrays;

public class HelloWorld {
public static void main(String[] args) {
//创建二维数组
int[][] a = new int[4][4];
a[2][1] = 1;
a[1][0] = 2;
//遍历二维数组
for (int[] ints : a) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
//转化为稀疏数组
//获取有效值个数
int sum = 0;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if (a[i][j] != 0) {
sum++;
}
}
}
System.out.println("稀疏数组有效值个数为:" + sum);
//创建稀疏数组
int[][] b = new int[sum + 1][3];
b[0][0] = 4;
b[0][1] = 4;
b[0][2] = sum;
int count = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (a[i][j] != 0) {
count++;
b[count][0] = i;
b[count][1] = j;
b[count][2] = a[i][j];
}
}
}
//输出稀疏数组
System.out.println("输出稀疏数组为:");
//方法一
/for (int[] bints : b) {
for (int bbints : bints) {
System.out.print(bbints + "\t");
}
System.out.println();
}
/
//方法二
for(int i=0;i<b.length;i++){
System.out.println(b [i][0]+"\t"+b [i][1]+"\t"+b [i][2]+"\t");
}
System.out.println();
//读取稀疏数组的值
int[][] c=new int[b [0][0]][b [0][1]];
//还原数组的值
for(int i=1;i< b.length;i++){
c [b [i][0]][b [i][1]]=b [i][2];
}
System.out.println("输出还原数组的值:");
for (int[] r : c) {
for (int i : r) {
System.out.print(i+"\t");
}
System.out.println();
}
}
}

posted @   XiaoChen要努力!!!  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示