java数组的定义与使用_Java基础之数组的定义与使用详解

一、数组

数组(array)是多个相同数据类型按照一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理

数组的相关概念:

数组名

元素

角标(下标、索引):数组的索引从0开始,到数组长度-1结束

长度

数组的特点:

数据是有序排列的

数组是引用类型变量。数组的元素可以是基本数据类型,也可以是引用数据类型

数据对象会在内存开辟一块连续的空间

数组的长度一旦确定,不能更改

数组的分类:

按照维数:一维数组、二维数组……

按照数组元素类型:基本数据类型元素的数组、引用数据类型元素的数组

一维数组的使用:

一维数组的声明和初始化

int[] ids; //声明

ids = new int[]{1001, 1002, 1003, 1004}; //静态初始化:数组的初始化和数组元素的赋值同时进行

String[] names = new String[5]; //动态初始化:数组的初始化和数组元素的赋值分开进行

如何调用数组指定位置的元素

names[0] = "小陈";

names[1] = "小吴";

names[2] = "小李";

names[3] = "老邓";

names[4] = "小王";//names[5] = "小邓";//报错,java.lang.ArrayIndexOutOfBoundsException

如何获取数组的长度

System.out.println(names.length); //5

如何遍历数组

for (int i=0;i

System.out.println(names[i]);

}

数组元素的默认初始化值

数组元素是整形:0

数组元素是浮点型:0.0

数组元素是char型:0或'\u0000',而非'0'

数组元素是布尔值:false

数组元素是引用数据类型:null

String[] arr = new String[4];for (int i=0;i

System.out.print(arr[i]+ "\t");

}//null null null null

数组的内存解析

简化版内存结构

9ea6589bbc1f303f29eb99432c61227c.png

例题:UN公社单间短期出租4个月,1550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人员,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净。安静,联系方式:

public classTestDemo {public static voidmain(String[] args) {int[] arr = new int[]{8, 2, 1, 0, 3};int[] index = new int[]{2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3};

String tel= "";for (int i = 0; i < index.length; i++) {

tel+=arr[index[i]];

}

System.out.println("联系方式:" +tel);

}

}

二维数组的使用

对于二维数组的理解,我们可以看成是以为数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,没有多维数组

二维数组的声明和初始化

public classTestDemo {public static voidmain(String[] args) {int[][] ids; //声明

ids = new int[][]{{1,2,3},{4,5},{6,7,8,9}}; //静态初始化:数组的初始化和数组元素的赋值同时进行

int[][] ids2= {{1,2,3},{4,5},{6,7,8,9}}; //类型推断,也是正确写法

String[][] names = new String[3][2]; //动态初始化1:数组的初始化和数组元素的赋值分开进行

String[][] names2 = new String[3][]; //动态初始化2:数组的初始化和数组元素的赋值分开进行

String[] names3[] = new String[3][]; //也是正确写法}

}

如何调用数组指定位置的元素

System.out.println(ids[0][1]); //2

System.out.println(names[1][1]); //null

System.out.println(names2[1]); //null

names2[1] = new String[4];

System.out.println(names2[1][1]); //null

如何获取数组的长度

System.out.println(names.length); //3

System.out.println(ids[2].length); //4

如何遍历数组

for(int i=0;i

System.out.print(ids[i][j]+"\t");

}

System.out.println();

}//1 2 3//4 5//6 7 8 9

数组元素的默认初始化值

针对初始化方式一:比如:int[][] arr = new int[4][3];

外层元素的初始化值为:地址值

内层元素的初始化值为:与一位数组初始化值情况相同

针对初始化方式二:比如:int[][] arr = new int[4][];

外层元素的初始化值为:null

内层元素的初始化值为:不能调用,报空指针错误

数组的内存解析

48ec247f6dd8666683df5005900448a1.png

例题:

1、打印杨辉三角

public classTestDemo {public static voidmain(String[] args) {//杨辉三角

int[][] yangHui= new int[10][];for(int i=0;i

yangHui[i]=new int[i+1];

yangHui[i][0] = yangHui[i][i] = 1; //首尾赋值为1//给中间位置赋值

for(int j=1;j

yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j];

}

}//遍历数组

for(int i=0;i

System.out.print(yangHui[i][j]+"\t");

}

System.out.println();

}

}

}

2、创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同

public classTestDemo {public static voidmain(String[] args) {//创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同

int[] arr = new int[6];for (int i = 0; i < arr.length; i++) {

arr[i]= (int) (Math.random() * 30 + 1);for (int j = 0; j < i; j++) {if (arr[i] ==arr[j]) {

i--;break;

}

}

}for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i]+ "\t");

}

}

}

3、求数组中元素的最大值、最小值、平均数、总和

定义一个int型的一维数组,包含10个元素,分别赋一些随机数,然后求出所有元素的最大值、最小值、和值、平均数,并输出

要求:所有随机数都是两位数

public classTestDemo {public static voidmain(String[] args) {//定义一个int型的一维数组,包含10个元素,分别赋一些随机数,然后求出所有元素的最大值、最小值、和值、平均数,并输出//要求:所有随机数都是两位数[10,99]

int[] arr = new int[10];for (int i = 0; i < arr.length; i++) {

arr[i]= (int) (Math.random() * 88 + 10); //公式:[a,b]:(int) (Math.random() * (b-a+1) + a)

System.out.print(arr[i] + "\t");

}

System.out.println();//最大值

int maxValue = arr[0];for (int i = 1; i < arr.length; i++) {if (maxValue

maxValue=arr[i];

}

}

System.out.println("最大值:" +maxValue);//最小值

int minValue = arr[0];for (int i = 1; i < arr.length; i++) {if (minValue >arr[i]) {

minValue=arr[i];

}

}

System.out.println("最小值:" +minValue);//和值

int sum = 0;for (int i = 0; i < arr.length; i++) {

sum+=arr[i];

}

System.out.println("总和值:" +sum);//平均值

double avg = sum /arr.length;

System.out.println("平均值:" +avg);

}

}

4、数组的引用

public classTestDemo {public static voidmain(String[] args) {int[] arry1,arry2;

arry1=new int[]{8,9,65,32,56,23,7,5,43};

arry2=arry1; //arry2引用指向arry1,注意此时arry1与arry2是同一个数组,不是复制//此时修改arry1的值后,arry2的值会随之修改

for(int i=0;i

arry1[i]=i;

}

}for(int i=0;i

System.out.print(arry2[i]+"\t"); //0 9 2 32 4 23 6 5 8

}

}

}

0d4c3422374768c17271d8a93519498d.png

5、数组的复制

public classTestDemo {public static voidmain(String[] args) {int[] arry1,arry2;

arry1=new int[]{8,9,65,32,56,23,7,5,43};

arry2=new int[9];//复制数组arry1

for(int i=0;i

arry2[i]=arry1[i];

}for(int i=0;i

arry1[i]= i; //此时修改arry1后,arry2的值不变

}

}for(int i=0;i

System.out.print(arry2[i]+"\t"); //8 9 65 32 56 23 7 5 43

}

}

}

ccdfdc79982cbf3c54fb244f2ff303f3.png

6、数组的反转

public classTestDemo {public static voidmain(String[] args) {int[] arry = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};//数组的反转//方法一//for (int i = 0; i < arry.length / 2; i++) {//int temp = arry[i];//arry[i] = arry[arry.length - i - 1];//arry[arry.length - i - 1] = temp;//}//方法二

for (int i = 0, j = arry.length - 1; i < j; i++, j--) {int temp =arry[i];

arry[i]=arry[j];

arry[j]=temp;

}for (int i = 0; i < arry.length; i++) {

System.out.print(arry[i]+ "\t"); //9 8 7 6 5 4 3 2 1

}

}

}

7、数组的线性查找

public classTestDemo {public static voidmain(String[] args) {

String[] arry= new String[]{"aa", "bb", "cc", "dd", "ee", "ff", "gg"};//数组的查找//线性查找(地毯式搜索)

String dest = "gg";boolean isFlag = true;for (int i = 0; i < arry.length; i++) {if(dest.equals(arry[i])) {

System.out.println("找到了指定元素的位置:" +i);

isFlag= false;break;

}

}if(isFlag) {

System.out.print("很遗憾,没有找到你要找的元素呢");

}

}

}

8、数组的二分查找

public classTestDemo {public static voidmain(String[] args) {int[] arry = new int[]{-55, -23, -5, 3, 9, 13, 35, 46, 56, 67};//二分法查找//前提:查找的数组必须有序

int dest = 56; //要查找的元素

int head = 0;//初始起始索引

int end = arry.length - 1;//初始的末尾索引

boolean isFlag = true;while (head <=end) {int middle = (head + end) / 2; //中间值

if (dest ==arry[middle]) {

System.out.println("找到了你要查找的元素,位置为:" +middle);

isFlag= false;break;

}else if (dest

end= middle - 1;

}else if (dest >arry[middle]) {

head= middle + 1;

}

}if(isFlag) {

System.out.print("很遗憾,没有找到你要找的元素呢");

}

}

}

数组排序

选择排序

直接选择排序

堆排序

交换排序

冒泡排序

快速排序

插入排序

直接插入排序

折半插入排序

Shell排序

归并排序

桶式排序

基数排序

冒泡排序举例

public classTestDemo {public static voidmain(String[] args) {int[] arr = new int[]{-55, -23, -5, 3, 9, 13, 35, 46, 56, 67};//冒泡排序

inttemp;for (int i = 0; i < arr.length - 1; i++) { //比较次数

for (int j = 0; j < arr.length - 1 - i; j++) { //比较到的位置

if (arr[j] > arr[j + 1]) {

temp=arr[j];

arr[j]= arr[j + 1];

arr[j+ 1] =temp;

}

}

}//遍历排序后的数组

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i]+ "\t");

}

}

}

快速排序

原理:

f3f381997b7193daa38da3bcfa9f3d36.png

demo:

bc35a65eb3b26a60ee53327074f823f6.png

举例:

public classQuickSort {private static void swap(int[] data, int i, intj) {int temp =data[i];

data[i]=data[j];

data[j]=temp;

}private static void subSort(int[] data, int start, intend) {if (start

;while (high > start && data[--high] - base >= 0)

;if (low

swap(data, low, high);

}else{break;

}

}

swap(data, start, high);

subSort(data, start, high- 1);//递归调用

subSort(data, high + 1, end);

}

}public static void quickSort(int[] data) {

subSort(data,0, data.length - 1);

}public static voidmain(String[] args) {int[] data = {9, -16, 30, 23, -30, -49, 25, 21, 30};

System.out.println("排序之前:\n" +java.util.Arrays.toString(data));

quickSort(data);

System.out.println("排序之后:\n" +java.util.Arrays.toString(data));

}

}

排序算法性能对比

dd7b2d95256a57396088ffe8564040fc.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值