12.数组


1.数组(Array), 

多个相同类型的数据,按照一定的顺序排列的集合

并使用一个名字命名,并通过编号的方式对这些数据进行统一管理


2.数组的组成:

数组名

下标或索引

元素

数组的长度-->元素的个数


3.数组的特点:

数组是有序排列的

数组本身是引用数据类型,数组内的元素可以使任何数据类型(基本数据类型,引用数据类型)

创建数组对象会在内存中开辟一整块连续的空间.

数组的长度一旦确定,就不可以修改


4.数组的分类

    按照维数:    1维数组,2维数组....

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


5.一维数组的使用

  5.1. 一维数组的声明和初始化

// 一维数组的声明和初始化

int num;//声明

num = 10;//初始化

int id =1001;//声明+初始化

int[] ids; //声明

//1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行

ids = new int[] {1001,1002,1003,1004};

//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行

String[] names = new String[5];

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

//2.如何调用数组指定位置的元素:通过角标(索引)的方式调用

//数组的索引从0开始,到数组的长度-1结束

names[0] = "张0";

names[1] = "张1";

names[2] = "张2";

names[3] = "张3";

names[4] = "张4";

// names[5] = "张5";

       5. 3.  如何获取数组的长度

//3.如何获取数组的长度. 使用length属性

System.out.println(names.length);

   5. 4. 如何遍历数组

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

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


   5. 5. 数组元素的默认初始化值

    数组元素是整形:        默认值是  0

    浮点型:        0.0

    char类型:       看上去是个空格 ,实际值是0     char型都会有对应的ASCII 码, 所以默认值是asc码为0的字符,  

     boolean :        false


   数组元素是引用数据类型时: 默认值是null


 6.二维数组的使用

数组本身是引用数据类型,可以看成是一维数组作为另一个数组的元素而存在

6.1二维数组的声明和初始化

//静态初始化

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

//动态初始化

String[][] arr2 = new String[3][2];

String[][] arr3 = new String[3][];

//特别的写法

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

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

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

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

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

System.out.println(arr2[1][1]);//由于未赋值String类型,是null

//System.out.println(arr3[1][0]);  java.lang.NullPointerException

6.3 获取数组的长度

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

System.out.println(arr4[0].length);//3

System.out.println(arr4[1].length);//2

6.4如何遍历二维数组

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

    for(int j = 0; j<arr4[i].length;j++) {

        System.out.print(arr4[i][j]);

        }

    System.out.println();

}

6.5数组元素的默认初始化值

在数组 int[][] arr = new int[4][3]中,

//外层元素为,arr[0],arr[1]等

//内层元素为,arr[0][0],arr[1][2]等;


类型1:

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

内层元素的初始化值,与一维数组初始化情况相同

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

System.out.println(arr[0]);    //[I@7f63425a,是地址值

System.out.println(arr[0][0]);    //0   内层元素是int类型,

System.out.println(arr);     //[[I@36d64342

int型默认值为: 0

float            :    0.0

Stirng        :    null


类型2:

double[][] arr3 = new double[4][];

System.out.println(arr3[1]); //null,因为未赋值

System.out.println(arr3[1][0]); //报错空指针,因为还未初始化

外层元素的初始化值为    null

内层元素的初始化值,        不能调用,否则会报空指针


7.数组使用中常用的算法

7.1数组元素的赋值(杨辉三角,回形数等)

Scanner scan = new Scanner(System.in);

    //练习1,求二维数组所有元素的和

    int[][] array = new int[][] {{3,-5,6},{2,8},{9,-2,5,7}};

    int sum = 0;

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

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

sum +=  array[i][j];

}

}

    System.out.println("二维数组的所有元素和是" + sum);


    /*练习2,

      * int[] x,y [];//此时表示声明x为一维数组,y为二维数组

      * 因为 int[] a,b = int[] a 与 int[] b ,也就是 int[] x, int[] y[]

      * 在给x与y赋值后,以下选项可以编译通过的是

      * 1,x[0] = y; // no

      * 2,y[0] = x; // yes

      * 3,y[0][0] = x;// no

      * 4,x[0][0] = y,// no

      * 5,y[0][0] = x[0];// yes

      * 6,x = y//no

      * 数组赋值需要满足相同类型或者可以自动类型提升

      */


    //练习三,使用二维数组打印一个指定行数杨辉三角

/*

* 1,第一行一个元素,第n行n个元素

* 2,每一行的第一个和最后一个是1

* 3,从第三行开始,对于非第一个元素和最后一个元素有

* yanghui[i][j]=yanghui[i-1][j-1] + yanghui[i-1][j]

*/

    //思路,对二维数组声明赋值后打印


    //输入行数

    System.out.println("请输入要打印的杨辉三角行数");

    int line = scan.nextInt();

    int[][] array1 = new int[line][];//动态声明二维数组行数

    //声明赋值二维数组

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

array1[i] = new int[i+1];//声明每行列数

array1[i][0] = 1;//每行第一个元素是1

array1[i][i] = 1;//每行最后一个元素是1

//可以写成连续赋值的形式array1[i][0] = array[i][i] = 1;

//

for (int j = 0; j < array1[i].length; j++) {

if(j > 0 && j < i) {

array1[i][j]=array1[i-1][j-1] + array1[i-1][j];//每行其他元素满足杨辉三角要求

}

}

/*第二种写法,if在外层

* if(i > 1){

*  for(j = 1;j < array[i].length - 1;j++){

*  array1[i][j]=array1[i-1][j-1] + array1[i-1][j];

*  }

* }

*/

}

        //遍历输出杨辉三角

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

for (int j = 0; j < array1[i].length; j++) {

System.out.print(array1[i][j] + " ");

}

System.out.println();

}


7.2求数值型数组中元素的最大值,最小值,平均数,总和

(要求所有元素都是两位数)

int[] arr = new int[10];

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

arr[i]=(int)(Math.random()*(99-10+1)+10);

}

//遍历

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

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

}

//求数组的最大值

int maxValue = arr[0]; //

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

if(maxValue < arr[i]) {

maxValue = arr[i];

}

}

System.out.println("最大值为" + maxValue + "\t");

//求数组的最小值

int minValue = arr[0];

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

if(minValue > arr[i]) {

minValue = arr[i];

}

}

System.out.println("最小值为" + minValue + "\t");

//求数组的总和

int sum = 0;

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

sum += arr[i];

}

System.out.println("总和最小值为" + sum + "\t");

//求数组的平均数

int avgValue = sum / arr.length;

System.out.println("平均数为" + avgValue );



7.3数组的复制,反转,查找(线性查找,二分法查找)

String[] arr = new String[]{"AA","BB","CC","DD","EE","FF","GG"};


//数组的复制(区别于数组的赋值, arr=arr1)

String[] arr1 = new String[arr.length];

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

arr1[i] = arr[i];

//System.out.println(arr[i]);

//System.out.println(arr1[i]);

}


//数组的反转,利用一个临时变量

for(int i = 0; i < arr1.length / 2; i++){

String temp = arr[i];

arr[i] = arr[arr.length -i - 1];

arr[arr.length - i -1] =temp;

}


//遍历

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

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

}

}

//查找

//线性查找:

String dest = "BB";

boolean isFlag = true;

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

if(dest.equals(arr[i])){

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

isFlag = false;

break;

}

}

if(isFlag){

System.out.println("很遗憾,没找到");

}


注:

若有2个数组,array1,array2.

array1 = array2;

并不是复制,而是将array1指向堆中array2所指向的地址.所以修改array1,array2也会变化

所以数组的复制,需要new一个新的数组,然后进行元素的赋值array1[i]=array2[i]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容