数组知识点总结

数组知识点总结

 Java中的数组是不是对象?

答:是。

常见笔试题:

1、下列数组的定义中,哪3条是正确的?(ABF

A. public int a[]     B. static int[] a        C.public [] int a

D. Private int a[3]    E.private int[3] a[]     F.public final int[] a

2、下列说法中,错误的有(BD

A.数组是一种对象     B. 数组属于一种原生类  

C.int number[]={31,23,33,43,35,63}    D.数组的大小可以任意改变


一维数组概述

●数组是存储同一种数据类型的多个元素的集合。也可以看成是一个容器。

●数组既可以存储基本数据类型,也可以存储引用数据类型。

数组的定义格式

格式1:数据类型[] 数组名;

格式2:数据类型 数组名[];

举例:

A:int[] a;定义一个int类型的数组a变量

B:int a[];定义一个int类型的a数组变量

注意:这两种定义方式效果可以认为是一样的,都是定义一个int数组,但是念法上有些小区别,推荐使用第一种。

这两种定义做完了,数组中是没有元素值的。如何对数组的元素进行初始化呢?

 

数组的初始化概述:

●Java中的数组必须先初始化,然后才能使用。

●所谓初始化,就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

 

如何对数组进行初始化呢?

int[] array = new int[3];//动态初始化

int[] array = new int[3]{1,2,3};//静态初始化

简化版:int[] array = {1,2,3};

推荐使用静态初始化!

 

数组操作常见的两个小问题:

数组索引越界

●ArrayIndexOutOfBoundsException访问到了数组中不存在的索引时发生

空指针异常

●NullPointerException数组引用没有指向实体,却在操作实体中的元素时。

练习1:数组遍历(依次输出数组中的每一个元素)

package 数组;

public class ArrayTest {

public static void main(String[] args) {

//定义一个数组

int[] array = {2,3,64,34,7,8,4,23,98};

//遍历数组

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

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

}

}

}

练习2:如何寻找数组中的最小值与最大值?

package com.minandmax;

import java.util.Arrays;

import java.util.Random;

//寻找数组中的最小值和最大值

public class MinAndMaxValue {

public static void main(String[] args){

//调用suiJi()方法,随机生成一个int类型的数组

int[] arr = suiJi();

//打印随机生成的数组

System.out.println(Arrays.toString(arr));

//调用maxValue()方法找出数组中的最大值

int max = maxValue(arr);

//调用minValue()方法找出数组中的最小值

int min = minValue(arr);

//打印数组中的最大值

System.out.println("数组中的最大值为:"+max);

//打印数组中的最小值

System.out.println("数组中的最小值为:"+min);

}

//找出数组中的最大值

public static int maxValue(int[] arr){

//定义变量max,记录数组中0索引上的元素

int max = arr[0];

//遍历数组,获取所有的元素,和变量max比较

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

//变量max,和数组中的每个元素进行比较

//如果max,小于了数组中的一个元素

if( arr[i] > max ){

//较大的数组的元素,赋值给max

max = arr[i];

}

}

return max;

}

//找出数组中的最小值

public static int minValue(int[] arr){

//定义变量max,记录数组中0索引上的元素

int min = arr[0];

//遍历数组,获取所有的元素,和变量max比较

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

//变量min,和数组中的每个元素进行比较

//如果数组中的元素小于min,交换位置

if( arr[i] < min ){

//较大的数组的元素,赋值给max

min = arr[i];

}

}

return min;

}

//随机生成一个int类型的数组

private static int[] suiJi() {

int b = new Random().nextInt(9);

int[] a = new int[b];

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

a[i] = new Random().nextInt(50);

}

return a;

}

}

练习3:如何找出数组中第二大的数?

package com;

public class SecondMax {

public static void main(String[] args) {

//定义一个int类型的数组

int[] arr = {7,3,19,40,4,67,1};

//调用FindSecMax()方法找出数组中第二大的数

int secMax = FindSecMax(arr);

//打印数组中第二大的数

System.out.println("该数组中第二大的数为:"+secMax);

}

//找出数组中第二大的数

private static int FindSecMax(int[] arr) {

//将数组0索引处的元素定义为最大值

int max = arr[0];

//将整形的最小值定义为secMax,这里必须这么定义,道理文字不好描述。明白就好

int secMax = Integer.MIN_VALUE;

//遍历数组

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

//如果数组元素比max大,数组元素变成max,原来的max变成secMax

if(arr[i]>max){

secMax = max;

max = arr[i];

//如果数组元素没有max大,但比secMax大,数组元素与secMax交换位置,变成新的secMax

}else if(arr[i]>secMax){

secMax = arr[i];

}

}

return secMax;

}

}

练习4:二分查找:

前提:数组必须是有序的。

思想:每次都猜中间的那个元素,比较大或者小,就能减少一半的元素。

 

package 数组;

public class BinarySearch {

public static void main(String[] args) {

int[] array = {2,4,7,9,15,30,54};

int index = getIndex(array,6);

System.out.println("元素7所在的索引位置为:"+index);

}

public static int getIndex(int[] arr,int value){

//定义最大索引,最小索引

int max = arr.length-1;

int min = 0;

//计算出中间索引

int mid = (max+min)/2;

//拿中间索引的值与要查找的值进行比较

while(arr[mid] != value){

//若所查找元素不存在,返回-1

if(max<min){

return -1;

}

if(arr[mid]>value){

max = mid - 1;

}else if(arr[mid]<value){

min = mid + 1;

}

mid = (max+min)/2;

}

return mid;

}

}

注意:如果遇见无序的数组,如:int[] arr = {45,65,87,4,324};

如何进行查找?

有人说,可以先排序,再查找。

这样是不行的,因为你排序完之后就把数组原来的元素索引改变了。

 

二维数组概述

我们传智播客的Java基础班每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个Java基础班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。

由此可见:其实二维数组其实就是一个元素为一维数组的数组。

格式1

数据类型[][] 变量名 = new 数据类型[m][n];

m表示这个二维数组有多少个一维数组

n表示每一个一维数组的元素个数

举例:

int[][] arr = new int[3][2];

定义了一个二维数组arr

这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]

每个一维数组有2个元素,可以通过arr[m][n]来获取

表示获取第m+1个一维数组的第n+1个元素

格式2

数据类型[][] 变量名 = new 数据类型[m][];

m表示这个二维数组有多少个一维数组

这一次没有直接给出一维数组的元素个数,可以动态的给出。

举例:

int[][] arr = new int[3][];

arr[0] = new int[2];

arr[1] = new int[3]

arr[2] = new int[1];

 

格式3

数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};

简化版格式:

数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};

举例:

int[][] arr =  {{1,2,3},{4,6},{6}};

 

 

练习1:二维数组的遍历

package 数组;

public class ArrayDemo {

public static void main(String[] args) {

//定义一个二维数组

int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};

//遍历二维数组

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

for(int y=0;y<arr[x].length;y++){

System.out.print(arr[x][y]+" ");

}

System.out.println();

}

}

}

 

练习2:二维数组求和

公司年销售额求和

某公司按照季度和月份统计的数据如下:单位(万元)

第一季度:22,66,44

第二季度:77,33,88

第三季度:25,45,65

第四季度:11,66,99

package 数组;

public class ArrayDemo {

public static void main(String[] args) {

//把题目的数据用二维数组来表示

int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};

//定义一个求和变量sum,初始化值是0

int sum = 0;

//通过遍历就可以得到每一个二维数组的元素

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

for(int y=0;y<arr[x].length;y++){

//把元素累加即可

sum += arr[x][y];

}

}

//最后输出sum,就是结果

System.out.println("一年的销售额为:"+sum+"万元");

}

}

 

练习3:打印杨辉三角(行数可以键盘录入)

 

package 数组;

import java.util.Scanner;

class ArrayDemo {

public static void main(String[] args) {

//创建键盘录入对象

Scanner sc = new Scanner(System.in);

//这个n的数据来自于键盘录入。

System.out.println("请输入一个数据:");

int n = sc.nextInt();

sc.close();//关闭资源

//定义二维数组

int[][] arr = new int[n][n];

//给这个二维数组任何一行的第一列和最后一列赋值为1

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

arr[x][0] = 1; //任何一行第1

arr[x][x] = 1; //任何一行的最后1

}

//按照规律给其他元素赋值

//从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。

for(int x=2; x<arr.length; x++) {

//这里如果y<=x是有个小问题的,就是最后一列的问题

//所以这里要减去1

//并且y也应该从1开始,因为第一列也是有值了

for(int y=1; y<=x-1; y++) {

//每一个数据是它上一行的前一列和它上一行的本列之和。

arr[x][y] = arr[x-1][y-1] + arr[x-1][y];

}

}

//这个时候,要注意了,内循环的变化必须和曾经讲过的九九乘法表类似

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

for(int y=0; y<=x; y++) {

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

}

System.out.println();

}

}

}

 

猜你喜欢

转载自blog.csdn.net/lz1170063911/article/details/80710277