从零学java day3 第四章 数组

1.数组类型

数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值

理解数组:数组也是一种类型

java的数组要求所有的数组元素具有相同的数据类型,因此在一个数组中,数组元素的类型是唯一的,即一个数组里只能存储一种数据类型的数据,而不能存储多种数据类型的数据。

一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变,即使把某个数组元素的数据清空,但它所占的空间依然被保留。


2.定义数组

java语言支持两种语法格式来定义数组

type[] arrayName;

type arrayName[]; 

对着两种语法格式而言,通常推荐使用第一种格式,因为第一种格式不仅具有更好的语意,而且具有更好的可读性

数组是一种引用类型的变量,因此使用它定义一个变量时,仅仅标识定义了一个引用变量,这个引用变量还未指向任何有效的内存,因此定义数组时不能指定数组的长度,而且由于定义数组只是定义了一个引用变量,并未指向任何有效的内存空间,所以还没有内存空间来存储数组元素,因此这个数组也不能使用,只有对数组进行初始化后才可以使用。

3.数组的初始化

java语言中数组必须先初始化,然后才可以使用,所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始的值。

数组的初始化有两种方式:

静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。

动态初始化:初始化时程序员只能指定数组长度,有系统为数组元素分配初始值。


静态初始化语法格式如下:

arrayName = new type[] {element1.element2,element3....}

动态初始化语法格式如下:

arrayName = new type[length];

执行动态初始化时程序员只需要指定数组的长度,即为每个数组元素指定所需的内存空间,系统将负责为这些数组元素分配初始值。

数组元素的类型是基本类型中的整数类型(byte、short、int、long)则数组元素的值是0

数组元素的类型是基本类型中浮点类型(float、double),则数组元素的值是0.0

数组元素的类型是基本类型中字符类型(char),则数组元素的值是'\u0000'

数组元素的类型是基本类型中布尔类型(boolean),则数组元素的值是null

4.使用数组

数组最常用的用法就是访问数组元素,包括对数组元素进行赋值和取出数组元素的值,访问数组元素都是通过在数组引用变量后紧跟一个方括号[],方括号里是数组元素的索引值,这样就可以访问数组元素了,访问到数组元素之后,就可以把一个数组元素当成一个普通变量使用了,包括为该变量赋值和取出该变量的值,这个变量的类型就是定义数组时使用的类型。

java语言的数组索引是从0开始的,也就是说,第一个数组元素的索引值为0,最后一个数组元素的索引值为数组长度减一,

如果访问数组元素时指定的索引值小于0,或者大于等于数组的长度,编译程序不会出现任何错误,但运行时出现异常:java.lang.ArraryIndexOutOfBoundsException:N(数组索引越界异常),异常信息后的N就是程序员试图访问的数组索引。

所有的数组都提供了一个length的属性,通过这个属性可以访问到数组的长度,一旦获得了数组的长度,就可以通过循环来遍历该数组的每个数组元素。


5.foreach循环

从java5之后,java提供了一种更简单的循环:foreach循环,这种循环遍历数组和集合。使用foreach循环遍历数组和集合元素时,

,无需获得数组和集合的长度,无需根据索引来访问数组元素和集合元素,foreach循环自动遍历数组和集合的每个元素。

foreach循环的语法格式如下:

for(type variableName : array | collection)

{

//variableName 自动迭代访问每个元素

}

foreach循环和普通循环不同的是,它无需循环条件,无需循环迭代语句,这些部分都由系统来完成,foreach循环自动迭代数组的每个元素,每当元素都被迭代一次后,foreach循环自动结束。

6.深入数组

1)内存中的数组

数组应用变量是访问堆内存中数组元素的根本方式。

定义并初始化一个数组后,在内存中分配了两个空间,一个用于存放数组的引用变量,另一个用于存放数组本身。

2)基本类型数组的初始化

对于基本类型数组而言,数组元素的值直接存储在对应的数组元素中,因此初始化数组时,先为该数组分配内存空间,然后直接将数组元素的值存入对应数组元素中。

3)引用类型数组的初始化

每个数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了有效数据。

4)没有多维数组

如果从数组底层的运行机制上来看,没有多维数组

java语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内裤才能。数组元素的类型也可以是引用,如果数组元素的引用再次指向真实的数组内存,这种情形看上去很像多维数组。

java语言采用上面的语法格式来定义二维数组,但它的实质还是一维数组,只是其数组元素也是引用,数组元素里保存的引用指向一维数组。

7.java8增强的工具类:arrays

java提供的arrays类里包含的一些static修饰的方法可以直接操作数组,这个arrays类里包含了如下几个static修饰的方法

int binarySearch(type[] a, type key):使用二分法查询key元素值在a数组中出现的索引;如果a数组不包含key元素值,则返回负数。调用该方法时要求数组中元素已经按升序排列,这样才能得到正确的结果。

int binarySearch(type[] a,int fromIndex,int toIndex ,type key):这个方法和前一个方法类似,但它只搜索a数组中fromIndex到toIndex索引的元素。调用该方法时要求数组中元素已经按升序排列,这样才能得到正确的结果。

type[] copyOf(type[] original,int length):这个方法将会把original数组复制成一个新数组,其中length是新数组的长度。如果length小于original数组的长度,则新数组就是原数组的前面length个元素;

type[] copyOfRange(type[] original,int from,int to):这个方法与前面方法相似,但这个方法只复制original数组的from索引到to索引的元素。

boolean equals(type[] a,type a2):如果a数组和a2数组的长度相等,而且a数组和a2数组的数组元素也一一相同,该方法将返回true。

void fill(type[] a, type val):该方法将会把a数组的所有元素都赋值为val。

void fill(type[] a,int fromIndex,int toIndex,type val)

void sort(type[] a)该方法对a数组进行排序。

void sort(type[] a,int fromIndex,int toIndex)

String toString(type[] a):该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号和空格隔开。

Arrays类处于java.util包下,为了在程序中使用Arrays类,必须在程序中导入java.util.Arrays类。

void parallelPrefix(xxx[] array,XxxBinaryOperator op):该方法使用op参数指定的计算公式计算得到的结果作为新的元素。op计算公式包括left、right两个形参,其中left代表数组中前一个索引处的元素,right代表数组中当前索引处的元素,当计算第一个新数组元素时,left的值默认为1

void setAll(xxx[] array,IntToXxxFunction generator):该方法使用指定的生成器为所有数组元素设置值,该生成器控制数组元素的值得生成算法。

void paralleSetAll(xxx[] array,IntToXxxFunction generator):该方法的功能与上一个方法相同,只是该方法增加了并行能力,可以利用多CPU并行来提高性能

void parallelSort(xxx[] a,int fromIndex,int toIndex):该方法与sort()方法相似,该方法增加了并行能力。

Spliterator.OfXxx spliterator(xxx[] array):将数组的所有元素转换成对应的Spliterator对象。

XxxStream stream(xxx[] array):该方法将数组转换为Stream,Stream是java8新增的流式编程的API

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

推荐阅读更多精彩内容