java13编程基础之数组深入

typora-root-url: images

java13编程基础之数组深入

大纲

一维数组

概述

数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。

这些按序排列的同类数据元素的集合称为数组“[]”。

特点

定长

长度一旦确定不可以改变。

相同数据类型

其元素必须是 相同 类型,不允许出现混合类型。数组中的元素可以是任何数据类型,包括基本类型和引用类型。

位置有序

元素所在的位置是有序的。

数组本身属于引用类型

数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象Java 中对象是在堆中的,因此数组无论保存基本类型还是其他对象类型,数组对象本身是在堆中的。

数组中可以存储任意类型的数据

定义

数组声明格式

数据类型[]数组名称;--推荐使用

数据类型数组名称[];

double[]arr;

chararr2[];

注意 : 引用数据类型只声明不赋值存在默认值null

数组初始化

动态初始化

数组定义与为数组元素分配空间和赋值的操作分开进行

数据类型[] 数组名=new 数据类型[长度];

int[]data=newint[5];

注意:元素为引用数据类型的数组中的每一个元素都需要实例化。

Person[]people;          //声明说组

people=newPerson[3];    //创建数组

people[0]=newPerson();//数组中元素实例化

people[1]=newPerson();

people[2]=newPerson();

静态初始化

在定义数组的同时就为数组元素分配空间并赋值

数据类型[] 数组名=new 数据类型[]{值1,值2...};

数据类型[] 数组名={值1,值2...};            --当面的简写方式

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

int[] arr2={1,2,3,4,5};

注意: 对于返回值类型为数组类型的方法来说,我们可以return new int[3];,我们也可以return new int[]{1, 2, 3};,但我们不可以return {1, 2, 3};。即简写方式,其不能脱离数组的声明,{1, 2, 3}并不能返回一个数组对象。

一维数组对象演示图

数组的默认值

数组中的元素只声明不赋值存在默认值,数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。

一般规律为数值型数组默认值为 0,引用型数组默认值为 null

数组类型默认初始值

byte0

short0

int0

long0

char编码为0的字符

String(引用类型)null

float0.0

double0.0

booleanfalse

使用

数组元素的界限

定义并用 new 为之分配空间之后,才可以引用数组中的每个元素,数组元素的引用方式为:

arrayName[index];

index为数组元素下标|索引,可以是整型常量或整型表达式 , 可以根据数组元素的下标操作数组中数据。如:

arr1[3] = 5;  //为数组索引为0的空间位置赋值

arr2[0] = "张三";   //为数组索引为0的空间位置赋值

System.out.println(arr3[2]);//获取数组中索引为2的数据值

数组元素下标从0开始;长度为n的数组的合法下标取值范围为

0~n-1

每个数组都有一个属性length指明它的长度

a.length的值为数组a的长度(元素的个数


数组元素遍历方式

(1)普通for循环

for(int 索引=0;索引<长度; 索引++){

数组名称[索引] = 值;

}

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

//1.遍历数组---基本for循环

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

//变量i代表索引/元素的下标

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

}

(2)增强for循环

for(元素类型  局部变量 : 数组){

局部变量-->为数组中的每一个元素值,从左向右以此获取

}

//2.遍历数组---增强for循环

for(int i : arr){

System.out.println(i); //i中存储数组的元素值,非索引

}

数组基本练习

//A:遍历int类型的数组 依次输出每个数组元素

public static void printArray(int[] arr){

//循环遍历数组下标

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

System.out.println("输出int类型数组的每一个元素"+arr[i]);

}

}

//B:逆序:倒叙输出数组元素

public static void printArr(String[] arr){

for(int i=arr.length-1;i>=0;i--){

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

}

}

//C:最值:获取数组中的最大值和最小值

public static void maxMinValue(int[] arr){

//假设数组中的第一个元素当成最大值

int max=arr[0];

//假设数组中的第一个元素当成最大值

int min=arr[0];

//遍历数组

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

//比较数组元素与max

if(max<arr[i]){

max=arr[i];

}

//比较数组元素与min

if(min>arr[i]){

min=arr[i];

}

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

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

}

}

Arrays

该类提供了关于数组操作的API.

如何查看API

Arrays中常用方法

打印数组----toString方法。

比较两个数组是否相同----equals方法。

数组排序----sort方法。

数组查找----binarySearch 方法。

数组拷贝----copyOf方法。

数组拷贝----copyOfRange方法。

String[] arr1={"hello","shsxt"};

String[] arr2={"hello","shsxt"};

System.out.println(arr1.equals(arr2));  //false

//1.Arrays.equals() 先判断两个数组的length是否相等,如果相等,再比内容,如果不相等,直接返回false

System.out.println(Arrays.equals(arr1, arr2));

//2.Arrays.toString 字符串形式打印数组信息

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

//3.Arrays.sort()  升序

int[] arr3={12,7,0,6,-32};

Arrays.sort(arr3); //-32 0 6 7 12

String[] arr4={"ab","a","bc","abc"};  //根据Unicode表中的值

Arrays.sort(arr4); //a ab abc bc

//4.Arrays.binarySearch( 数组, 元素) ) :二分法查找 查找元素在数组中出现的索引

//前提:先升序排序,才能二分法查找

//找到返回索引,找不到返回-(插入点)-1

Arrays.sort(arr3);

System.out.println(Arrays.binarySearch( arr3, 16)); // -6

经典案例实现-点名器

运行代码,随机打印班级同学名字

//1.数组存储姓名,用String数据类型

String[] names={"杰克","戴维琼斯","伊丽莎白","爱丽丝"};

//2.遍历数组,打印出所有姓名

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

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

}

//3.随机出一个人名

//利用随机数,生成一个证书,作为索引,到数组中查找对应的元素

Random ran=new Random();

//随机数的范围是[0,names.length-1]

int index=ran.nextInt(names.length); //括号中填写的最大数是获取不到的,因为nextInt获取的范围是左闭右开区间

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

二维数组

二维数组可以看成以数组为元素的数组

其实多维数组不仅仅只有二维数组,还有三维数组,四维数组..., 但是三维以上很少见到,所以大家重点了解二维数组即可。

举例

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

初始化

动态初始化

数组定义与为数组元素分配空间和赋值的操作分开进行

数据类型[][] 数组名 = new 数据类型[一维][二维];

注意:这种初始化方式,每一个内层的二位数组长度相同

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

a[0][0] = 1;

a[0][1] = 2;

数据类型[][] 数组名 = new 数据类型[一维][];

内层数组需要我们自己去创建(下面可以用一维数组的创建方式)

数组名[一维数组索引值] = new 数据类型[二维];

int[][] a=new int[3][];

arr[0]=new int[2];

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

arr[2]=new int[]{7,8,9};

arr[0][0] = 1;

arr[0][1] = 2;

静态初始化

在定义数组的同时就为数组元素分配空间并赋值

数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}};

数据类型[][] 数组名 = {{...},{...},{...}}; --简化写法

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

char[][] arr2={{'a'},{'b','c'}};

遍历方式 

双重循环实现多维数组的遍历

//普通for循环嵌套增强for循环

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

for(int j:arr1[i]){

System.out.println(j);

}

}

//增强 for循环嵌套普通for循环

for(int[] arr:arr1){

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

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

    }

}

//普通for嵌套普通for循环

...

//增强for嵌套增强for循环

...

Arrays中提供操作多维数组的方法:

static boolean deepEquals(Object[] a1, Object[] a2) 如果两个指定的数组彼此 深度相等 ,则返回 true 。 

static String deepToString(Object[] a) 返回指定数组的“深度内容”的字符串表示形式。 

double[][] arr1= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}};

double[][] arr2= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}};

System.out.println(Arrays.deepToString(arr1)); //[[1.0, 2.0], [3.0, 4.0, 5.0], [6.0]]

System.out.println(Arrays.deepEquals(arr1, arr2)); //true

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