4. 有一段以下代码能够对数组正确初始化:int[] arr = new int[5]; 这表示,这个数组的元素的类型是_?

之前在定义数据的时候,大部分都是用变量来存储数据。可是当我们的程序中需要大量的数据,我们需要连续输入多个数字,连续输入多个坐标点,一般而言会创建多个变量存储这些数据,显得比较麻烦。当这些变量基本上类型是共通的,那我们就可以用一个容器将所有的数字进行管理。类似于字符串,字符串其实就是若干个字符的容器而已,“abc”可以通过索引/角标来获取其中某一个字符。[1,2,3,4,5]类似字符串也可以通过索引/角标来获取其中某一个数字,那么这个容器我们称之为数组。

数组就是一片地址连续且空间大小一致的存储空间(但是每个空间存的还是其他数据的地址)

声明数组:就是告诉计算机数组的类型是什么。有两种形式:

下面是这两种语法的代码示例:

分配空间:告诉计算机需要给该数组分配多少连续的空间,记住是连续的。

赋值:赋值就是在已经分配的空间里面放入数据。

Java中我们定义的元素是默认被赋予初值的

  • 引用数据类型:null

数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地址+角标*数据类型大小

其实分配空间和赋值是一起进行的,也就是完成数组的初始化。有如下三种形式:

Java语言使用new操作符来创建数组,语法如下:

上面的语法语句做了两件事:

  • 把新创建的数组的引用赋值给变量 array。

创建数组时必须明确规定大小或内容。数组变量的声明,和创建数组可以用一条语句完成,如下所示:

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

创建数组只指定长度但不指定内容

创建数组指定内容(指定长度)

另外,你还可以使用如下的方式创建数组。

创建数组指定内容(指定长度)

数组的元素是通过下标访问的。数组下标从 0 开始,所以下标值从 0 到 arrayRefVar.length-1。

下面的语句首先声明了一个数组变量 myList,接着创建了一个包含 8 个 double 类型元素的数组,并且把它的引用赋值给 myList 变量。

// 计算所有元素的总和

 以上实例输出结果为:

数组的元素类型和数组的大小都是确定

该实例完整地展示了如何创建、初始化和操纵数组

// 打印所有数组元素 // 计算所有元素的总和

以上实例编译运行结果如下:

数组存在于堆内存中,数组变量存的就是数组在堆内存中首元素的地址

  • 但凡在堆中存储的数据都称之为对象
  • 但凡在堆内存中创建的对象都会有默认初始值

数组操作中,在栈内存中保存的永远是数组的名称,只开辟了栈内存空间数组是永远无法使用的,必须有指向的堆内存才可以使用,要想开辟新的堆内存则必须使用new关键字,之后只是将此堆内存的使用权交给了对应的栈内存空间,而且一个堆内存空间可以同时被多个栈内存空间指向,即:一个人可以有多个名字,人就相当于堆内存,名字就相当于栈内存。

数组的元素类型和数组的大小都是确定的,所以当处理数组元素时候,我们通常使用基本循环,尤其是for循环。JDK 1.5 引进了一种新的循环类型,被称为 for-each 循环或者加强型循环,它能在不使用下标的情况下遍历数组。

该实例用来显示数组 myList 中的所有元素:

// 打印所有数组元素

以上实例编译运行结果如下:

先给数组赋值,然后调用函数求最大值:

我们通过函数将num数组中最大值通过遍历找出来,最后返回主函数输出

再给数组赋值,然后调用函数求最小值:

在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程。

线性查找又称为顺序查找。如果查找池是某种类型的一个表,比如一个数组,简单的查找方法是从表头开始,一次将每一个值与目标元素进行比较。最后,或者查找到目标,或者达到表尾,而目标不存在于组中,这个方法称为线性查找

二分查找又称折半查找,它是一种效率较高的查找方法。

  • 必须采用顺序存储结构 
  • 必须按关键字大小有序排列。

折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。0.618被公认为最具有审美意义的比例数字,这个数值的作用不仅仅体现在诸如绘画、雕塑、音乐、建筑等艺术领域,而且在管理、工程设计等方面也有着不可忽视的作用。因此被称为黄金分割。

斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…….(从第三个数开始,后边每一个数都是前两个数的和)。然后我们会发现,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,利用这个特性,我们就可以将黄金比例运用到查找技术中。

斐波那契搜索是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为F[n](如果要补充元素,则补充重复最后一个元素,直到满足F[n]个元素),完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。

}
公司:程序咖(北京)科技有限公司
/ruby0015/冒泡排序、选择排序、顺序查找和二分法查找)
 

1.1 为什么使用数组

如果说程序中,需要存储大量的相同类型的一组数据,如果直接使用变量来进行存储,每个变量只能存储一个值,就需要大量的变量。
 
就是一组相同数据类型的数据。内存上是开辟的连续的内存空间。
1、定长。容量固定。数组一旦创建后,那么长度不能更改。(容量,长度,都是指存储的数量)
2、存储的数据类型必须都一致。
3、在内存中空间连续挨个。
4、数组是引用类型的数据,存在栈和堆的地址引用关系。
Java中:两大数据类型
 引用:数组,对象,集合。。。。
step1:先创建数组
step2:使用数组:存储数据,访问数据。
方式一:数据类型[] 数组名 
方式二:数据类型 数组名[] 
 推荐使用方式一,c#等越来越多的语言已经不支持方式二定义数组

1.6 数组中的默认值

创建好数组后,里面存储了默认的数值。到底存储哪个数值,要看创建的数组是何种类型。

数组的默认值就是数组创建后里面存储的默认的数据
数组的引用存在栈内存中数组本身存在堆内存中
数组创建完就有默认的数据了
 
Java中的数组必须先初始化,然后才可以使用,所谓初始化,就是为数组中的数组元素分配内存空间,并为每个数组元素赋初始值。否则数组中存储的就是默认数值。
初始化时由程序员指定每个数组元素的初始值,由系统计算数组长度
 语法:数组元素类型[] 数组名 = new 数组元素类型[]{元素0,元素1,....};
 可简写为:数组元素类型[] 数组名 = {元素0,元素1,....};
 说明:任何一个变量都得有自己的数据类型,这里的arr表示数组变量名称,int表示数组中元素的类型,int[]才是数组类型
静态初始化:由我们指定元素的初始值,由系统计算长度或者元素的个数
初始化时程序员只指定数组长度,由系统为数组元素分配初始值
 语法:元素类型[] 数组名 = new 元素类型[元素个数或者数组长度];
 系统对初始值分配规则如下:a.整数型为0
 c.字符型为‘\u0000’(不同的系统平台显示结果不同)
 
动态初始化:初始化时由程序员指定数组的长度,系统负责分配元素的初始值 4为常量,存储在常量池中 arr也是在栈空间中开辟空间的 通过new关键字创建出来的数组存储在堆空间中 arr其实就是一个引用,指向了一个真正的数组 a.在初始化数组时不要静态初始化和动态初始化同时使用也就是说不要在进行数组初始化时既指定数组的长度也为每个数组元素分配初始值 b.既然数组也是一种数据类型则在初始化的时候也可以先声明再初始化
动态创建数组:先创建数组,然后再根据下标一个一个存储数据。 A:先声明,再创建(分配内存空间) 数据类型 [] 数组名; //静态创建数组:声明,创建,赋值一起写完。 C:声明,创建,并赋值 数据类型[] 数组名 = {数值1,数值2,数值3,数值4.。。。}; //=左边声明数组,=右边,会先根据{}中数据的个数,然后再将{}中数据,按照顺序存储进去。 2.根据{}中数组值的个数,开辟堆内存 3.将{}中的数组值,依次按照顺序存入数组中 D:声明,创建,并赋值

通过下标访问指定元素,数组中的每个下标,都有编号,顺序,也叫索引,index。从0开始,到个数减1。

比如说一个数组中元素的个数是3个。

那么1这个元素,存储在数组中的第一个位置上,下标为0。 2这个元素,存储在数组中的第二个位置上,下标为1。 3这个元素,则存储在第三个位置上,下标为2。

我们就可以通过数组的名字,结合下标来进行访问数组中的元素:

//使用静态初始化的方式定义一个数组 //数组中可以存放重复数据 //1.访问数组中的元素 //格式:数组名称[下标] 表示获取指定下标所对应的值 //需求:获取下标3对应的元素
//2.修改数组元素的值

 //格式:数组名称[下标] = 被修改之后的值
 //注意:不管是静态初始化还是动态初始化,都可以采用这种方式修改元素的值
 
//3.如果下标超出数组的长度,会下标越界异常
 
数据类型[] 数组名 = new 数据类型[长度、容量、个数]; 数据类型 数组名[] = new 数据类型[长度];//也可以 数组名[index],操作数组 index:因为一个数组存储了多个数据(也叫元素),每个元素都有一个下标,也叫索引,index。理解起来就是给每个数据排个编号,固定从0开始,0,1,2,3,4.。。。到长度减1。

获取数组元素的个数:之前我们知道在访问数组的时候,可以通过下标进行访问,但是如果下标越界就会产生异常。在Java中,所有数组都提供了一个length属性,通过这个属性可以访问到数组的长度或者数组中元素的个数。

//4.获取数组中的元素个数或者数组的长度
 

既然可以通过数组的下标进行访问数组,而下标又是从0开始,逐渐递增1的有规律的一组数值。那么我们是否可以通过循环来进行访问数组?

依次访问数组中的每一个元素,获取每个下标对应的元素值
方式一:简单for循环
方式二:增强for循环
1遍历依次访问数组中每个元素可以赋值可以取值
2因为操作数组就是数组名字配合下标而下标固定都是从0开始到长度减1
 
增强for循环JDK1.5的版本出现的 特定的用法专门用于获取数组中的每一个元素的值 依次获取数组的元素赋值给e Afor-each只能获取数组的数据但是不能给数组进行赋值 Bfor-each在代码这个层面不能操作下标
优点:用于遍历数组和集合,无需通过数组下标,就可以直接访问数组或者集合中的元素 for(元素数据类型 变量名:数组名称) { //底层工作原理:根据下标获取数组元素 两种遍历方式的选择:不需要知道下标,只需要获取元素值,则采用增强for循环 //需求:打印下标为偶数的元素值【只能采用简单for循环】
A:栈,存放的是基本数据类型的变量,以及引用类型变量的引用。 特点:函数中的变量所占用的空间,执行之后就会销毁。 B:堆,存放的是new出来的东西。 特点:执行之后,堆里存储的内容(对象等),会被标记为垃圾,但是不会立即被销毁,而是等待系统的垃圾回收机制来回收(GC)。

数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存空间,只有当这个引用指向有效的空间时,才可以通过引用去操作真正数组中的元素

结论:数组的引用变量存储在栈空间中,而真正的数组存储在堆空间在中。

//使用静态初始化的方式初始化一个数组a //使用动态初始化的方式初始化一个数组b
扩展:基本数据类型和引用数据类型在内存中的区别
 a.寄存器:最快的存储区域,由编译器根据需求进行自动的分配,我们在程序中无法控制
 b.栈:存放的是基本数据类型的变量以及引用数据类型变量的引用
 特点:被执行之后,该函数或者变量所占用的空间会被销毁【方法压栈】
 c.堆:存放所有使用new关键字创建出来的实体
 特点:执行完不会立即被释放,当使用完成之后,会被标记上垃圾的标识,等待系统的垃圾回收机制来回收它
 常量池:存放基本数据类型的常量和字符串常量
 静态域:static,静态全局变量

3.2 数组的地址转移:了解

Java中的数据分为两大类:
基本类型进行赋值:数值
引用类型进行赋值:地址
数组名,存储是引用地址。 int[] c = a;//将a的值赋值给c,就是将a存储的数组的地址赋值给c。a和c存储的地址相同,那么就指向了同一个数组

数组是引用类型:参数传递的时候,传递的是数组的地址。就是参数也会指向这块内存。当方法结束的时候,参数就销毁了。

//设计一个方法,用于打印数组 //设计一个方法,用于打印数组

3.4 数组作为返回值

一个数组可以作为参数,也可以作为返回值。那么返回的实际上是数组的内存地址。

//设计一个方法,用于打印数组 //设计一个方法,用于创建一个数组, 并赋值。数组要返回给调用处 //设计一个方法,用于打印数组

3.5 可变参数【扩展】

概念:一个方法可以接收的参数的数量不定(0-多个),但是类型固定。
语法:数据类型 ... 参数名,可变参数在方法中当数组使用。
 1、如果参数列表中,除了可变参数还有其他的参数,可变参数要写在整个参数列表的最后。
 2、一个方法最多只能有一个可变参数。
//演示不定长参数的使用
 //2.对于一个方法的参数是不定长参数时,实参可以直接传一个数组

 //需求:计算不确定个整数的和
 //1.不定长的参数在进行使用的时候被当做数组来进行处理
 //num其实就相当于一个数组的引用变量
 //3.不定长参数在使用的时候,必须出现在参数列表的最后一个
 //4.在同一个参数列表中,不定长参数只能出现一次
a.不定长的参数在进行使用的时候被当做数组来进行处理
b.不定长参数在使用的时候必须出现在参数列表的最后一个
c.对于一个方法的参数是不定长参数时实参可以直接传一个数组

排序:数组是存储一组数据,而且这些数据是有顺序的。但是数值本身可能是无序的。通过算法来实现给数组进行排序,升序(数值从小到大),降序(数值从大到小)。

冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序算法的运作如下:

  • 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

交换过程图示(第一次):

那么我们需要进行n-1次冒泡过程。

//外层循环:控制比较的轮数 //内层循环:控制每一轮比较的次数和参与比较的下标

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

那么我们需要进行n-1次冒泡过程。

//用于标记最小值的下标

数组的查找,就是指在给定的一个数组中,查找指定的数值,返回该数值在数组中的下标位置。但如果数组中包含重复的元素,不保证找到的是哪一个,如果数组中没有指定的元素,一般返回-1。

查找思路:遍历这个数组,依次把每一位元素和要查找的数据进行比较
*顺序查找,在数组arr中,查找key的位置,如果存在返回下标,否则返回-1 //需求:查找65在数组中的位置

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查数组为有序的数组,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列数组。首先,假设数组中元素是按升序排列,将数组中间位置记录的元素与要查找的数值比较,如果两者相等,则查找成功;否则利用中间位置记录将数组分成前、后两个部分,如果中间位置记录的元素值大于查找的数值,则进一步查找前一部分数组,否则进一步查找后一八月份数组。重复以上过程,直到找到满足条件的记录,使查找成功,或直到部分数组不存在为止,此时查找不成功。

优点:通过折半来缩小查找范围,提高查找效率

缺点:要求数组是有序的。

//下次在左半部分查找 //下次在右半部分查找

Arrays类是jdk提供的操作数组的一个工具类,位于java.util包下。

作用主要用于对数组进行排序查找填充比较等的操作
注意1如果在同一个Java文件中同时使用Scanner和Arrays则可以向如下方式导包
注意2但凡是工具类类中的方法全部是静态的方便调用
 调用语法类名.方法名实参列表
 DArrays提供数组的常规操作的
 
//使用动态初始化的方式初始化一个数组 将指定的 int 值分配给指定 int 型数组的每个元素。 将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。 //Java但凡涉及到区间问题,一般规律:包头不包尾 前闭后开区间 对指定的 int 型数组按数字升序进行排序。 对指定 int 型数组的指定范围按数字升序进行排序。 //注意:默认情况下只能进行升序排序 //前提:必须是排好序的数组 使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。 使用二分搜索法来搜索指定的 int 型数组的范围,以获得指定的值。 //规律:按照原来的顺序将待查找的元素插入到原数组中的下标,对下标加1然后求相反数 复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。 将指定数组的指定范围复制到一个新数组。 //5.将数组转换为字符串 返回指定数组内容的字符串表示形式。 如果两个指定的 int 型数组彼此相等,则返回 true。 如果两个指定的 int 型数组彼此相等,则返回 true。 如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。 换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。 此外,如果两个数组引用都为 null,则认为它们是相等的 ==:是一个运算符,可以比较基本数据类型和引用数据类型【当比较引用数据类型的时候,比较的地址值】 equals:是一个方法,只能比较引用数据类型 【补充:如果equals方法在一个类中没有没重新实现,则equals方法的作用和==一样,都比较的是地址值 如果equals方法在一个类中被重新实现,则比较的是内容

数组的拷贝:就是将一个数组的数据,复制到另一个数值中。

方法一通过循环依次复制将原数组的数据一个一个复制到目标数组中
方法二Arrays类里方法copyOf(原数组新数组的长度)-->返回值是新数组
方法三System类里的方法arraycopy(原数组原数组位置新数组新数组位置拷贝的个数)
//方法一:自己通过循环依次复制,吭哧吭哧 * 返回值就是新的数组 * 第一个参数:原始数组 * 第二个参数:从原始数组的哪个下标开始复制 * 第三个参数:目标数组 * 第四个参数:目标数组从哪个下标开始贴 * 第五个参数:拷贝几个数据

七、使用数组时常见的问题

出现的时机:当使用了不存在的下标时,则会出现这个错误 出现的时机:当数组的引用变量赋值为null,还在后面的代码中使用这个引用 3>基本数据类型和引用数据类型打印的区别
//3.基本数据类型和引用数据类型打印的区别 打印引用数据类型的引用变量时,拿到的是地址 15db9742 ----- 十六进制,地址值的哈希编码【哈希算法】

Java并没有真正的多维数组,二维数组可以看成以数组为元素的数组。如:

元素类型[二维数组的长度][一维数组的长度] 说明定义一个数组arr二维数组中一维数组的个数为3个每个一维数组中元素的个数为4个
简化元素类型[][] 数组名称
}

)]笔试题目频道小编搜集的范文“2016最新Java笔试题集锦”,供大家阅读参考, ...

  • 在文章开始之前我们先来介绍一下elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎. 查询 : Elasticsearch 允许执行和合并多种类型的搜索 — 结构化.非 ...

}

我要回帖

更多关于 以下代码能够对数组正确初始化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信