Java中的数组
一、数组的定义
- 数组是相同类型数据的有序集合
- 数组的描述是相同类型的若干个数据,按照一定的先后次序排列组合而成
- 其中,每个数据称作一组元素,每个数组元素可以通过一个下标来访问它们
二、数组的声明的创建
public class Array {
static public void main(String[] args)
{
//静态初始化一个叫叫a的数组
int[] a={1,2,3,4,5,6};
//动态初始化一个叫array的int型数组
int[] array=new int[10];
//获取数组的长度
int len=array.length;
//逐个为数组赋值
for(int i=0;i<len;i++)
{
array[i]=i;
}
//逐个遍历数组
for(int j=0;j<len;j++)
{
System.out.println(array[j]);
}
}
}
-
数组的内存分析
- Java的内存分析
- 堆:存放new的对象和数组,可以被所有的线程共享,不会存放别的对象引用
- 栈:存放基本变量类型(会包含这个基本类型的具体数值)、引用对象的变量(会存放这个引用在堆里面的具体地址)
- 方法区:可以被所有的线程共享、包含了所有的class和static变量
- Java的内存分析
-
数组的四个基本特点
- 长度是确定的,数组一旦被创建,大小就是不可以改变的
- 其元素必须是相同的类型,不允许出现混合类型
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型
- 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中的对象是在堆中的
-
数组下标越界
- 数组的合法区间是[0,length-1],越界就会报错ArrayIndexOutOfBoundsException
三、数组使用
1.for-each循环(没有下标)
idea中打array.for自动生成
public class Array {
static public void main(String[] args)
{
//声明一个叫array的int型数组
int[] array=new int[10];
int len=array.length;
//逐个为数组赋值
for(int i=0;i<len;i++)
{
array[i]=i;
}
for (int i : array) {
System.out.println(i);
}
}
}
2.数组作方法传参
public class Array {
static public void main(String[] args)
{
//声明一个叫array的int型数组
int[] array=new int[10];
int len=array.length;
//逐个为数组赋值
for(int i=0;i<len;i++)
{
array[i]=i;
}
System.out.println(sum(array));
}
static int sum(int[] array)
{
int sum=0;
for (int i : array) {
sum=sum+array[i];
}
return sum;
}
}
3.数组作返回值
public class Array {
static public void main(String[] args)
{
//声明一个叫array的int型数组
int[] array=new int[10];
int len=array.length;
//逐个为数组赋值
for(int i=0;i<len;i++)
{
array[i]=i;
}
array=reverse(array);
for (int j =0;j<len;j++) {
System.out.println(array[j]);
}
}
static int[] reverse(int[] a)
{
int[] result=new int[a.length];
for(int i=0,j=a.length-1;i<a.length;i++,j--)
{
result[j]=a[i];
}
return result;
}
}
四、多维数组
-
多维数组可以是数组的数组,比如一个二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组
-
定义方法
int a[][]=new int [2][5];
五、Arrays类
六、冒泡排序
七、稀疏数组
原始数组中只有两个数为非零数,其他都是0
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
建立一个新的数组,第一行存放原始数组的行和列以及非零数的个数n
剩下的n行来存放非零数的行和列以及对应的数值
11 | 11 | 3 |
---|---|---|
1 | 2 | 1 |
2 | 3 | 2 |
代码
public class SparseArray {
static public void main(String[] args)
{
//构造原始矩阵
int[][] array=new int[11][11];
array[1][2]=1;
array[2][3]=2;
show(array);
//遍历原始矩阵,找出非0元素的个数count
int count=0;
for(int[] i:array)
{
for(int j:i)
{
if(j!=0)
{
count++;
}
}
}
//转换为稀疏矩阵
int[][] array2=new int[count+1][3];
//第一行存11行11列共count个非零数
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=count;
//接下来每行存非零数在第几行第几列是几
int line=0;
for(int i=0;i<array.length;i++)
{
for(int j=0;j<array[i].length;j++)
{
if(array[i][j]!=0)
{
line++;
array2[line][0]=i;
array2[line][1]=j;
array2[line][2]=array[i][j];
}
}
}
show(array2);
//稀疏矩阵转化为原始矩阵
int[][] array3=new int[array2[0][0]][array2[0][1]];
for(int i=1;i<array2.length;i++)
{
array3[array2[i][0]][array2[i][1]]=array2[i][2];
}
show(array3);
}
//打印一个二维矩阵
static public void show(int[][] a)
{
for(int i[]:a)
{
for(int j:i)
{
System.out.print(j+" ");
}
System.out.println();
}
}
}