之前在定义数据的时候,大部分都是用变量来存储数据。可是当我们的程序中需要大量的数据,我们需要连续输入多个数字,连续输入多个坐标点,一般而言会创建多个变量存储这些数据,显得比较麻烦。当这些变量基本上类型是共通的,那我们就可以用一个容器将所有的数字进行管理。类似于字符串,字符串其实就是若干个字符的容器而已,“abc”可以通过索引/角标来获取其中某一个字符。[1,2,3,4,5]类似字符串也可以通过索引/角标来获取其中某一个数字,那么这个容器我们称之为数组。
数组就是一片地址连续且空间大小一致的存储空间(但是每个空间存的还是其他数据的地址)
声明数组:就是告诉计算机数组的类型是什么。有两种形式:
下面是这两种语法的代码示例:
分配空间:告诉计算机需要给该数组分配多少连续的空间,记住是连续的。
赋值:赋值就是在已经分配的空间里面放入数据。
Java中我们定义的元素是默认被赋予初值的
数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地址+角标*数据类型大小
其实分配空间和赋值是一起进行的,也就是完成数组的初始化。有如下三种形式:
Java语言使用new操作符来创建数组,语法如下:
上面的语法语句做了两件事:
创建数组时必须明确规定大小或内容。数组变量的声明,和创建数组可以用一条语句完成,如下所示:
数据类型[] 数组名=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#等越来越多的语言已经不支持方式二定义数组
创建好数组后,里面存储了默认的数值。到底存储哪个数值,要看创建的数组是何种类型。
数组的默认值,就是数组创建后,里面存储的默认的数据。
数组的引用存在栈内存中,数组本身存在堆内存中。
数组创建完,就有默认的数据了。
Java中的数组必须先初始化,然后才可以使用,所谓初始化,就是为数组中的数组元素分配内存空间,并为每个数组元素赋初始值。否则数组中存储的就是默认数值。
初始化时由程序员指定每个数组元素的初始值,由系统计算数组长度
语法:数组元素类型[] 数组名 = new 数组元素类型[]{元素0,元素1,....};
可简写为:数组元素类型[] 数组名 = {元素0,元素1,....};
说明:任何一个变量都得有自己的数据类型,这里的arr表示数组变量名称,int表示数组中元素的类型,int[]才是数组类型
初始化时程序员只指定数组长度,由系统为数组元素分配初始值
语法:元素类型[] 数组名 = new 元素类型[元素个数或者数组长度];
系统对初始值分配规则如下:a.整数型为0
c.字符型为‘\u0000’(不同的系统平台显示结果不同)
动态初始化:初始化时由程序员指定数组的长度,系统负责分配元素的初始值
4为常量,存储在常量池中 arr也是在栈空间中开辟空间的 通过new关键字创建出来的数组存储在堆空间中 arr其实就是一个引用,指向了一个真正的数组
a.在初始化数组时,不要静态初始化和动态初始化同时使用,也就是说,不要在进行数组初始化时,既指定数组的长度,也为每个数组元素分配初始值
b.既然数组也是一种数据类型,则在初始化的时候也可以先声明,再初始化
通过下标访问指定元素,数组中的每个下标,都有编号,顺序,也叫索引,index。从0开始,到个数减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 A:for-each只能获取数组的数据,但是不能给数组进行赋值
B:for-each,在代码这个层面,不能操作下标。
数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存空间,只有当这个引用指向有效的空间时,才可以通过引用去操作真正数组中的元素
结论:数组的引用变量存储在栈空间中,而真正的数组存储在堆空间在中。
扩展:基本数据类型和引用数据类型在内存中的区别
a.寄存器:最快的存储区域,由编译器根据需求进行自动的分配,我们在程序中无法控制
b.栈:存放的是基本数据类型的变量以及引用数据类型变量的引用
特点:被执行之后,该函数或者变量所占用的空间会被销毁【方法压栈】
c.堆:存放所有使用new关键字创建出来的实体
特点:执行完不会立即被释放,当使用完成之后,会被标记上垃圾的标识,等待系统的垃圾回收机制来回收它
常量池:存放基本数据类型的常量和字符串常量
静态域:static,静态全局变量
Java中的数据分为两大类:
基本类型进行赋值:数值
引用类型进行赋值:地址
数组是引用类型:参数传递的时候,传递的是数组的地址。就是参数也会指向这块内存。当方法结束的时候,参数就销毁了。
一个数组可以作为参数,也可以作为返回值。那么返回的实际上是数组的内存地址。
概念:一个方法可以接收的参数的数量不定(0-多个),但是类型固定。
语法:数据类型 ... 参数名,可变参数在方法中当数组使用。
1、如果参数列表中,除了可变参数还有其他的参数,可变参数要写在整个参数列表的最后。
2、一个方法最多只能有一个可变参数。
//演示不定长参数的使用
//2.对于一个方法的参数是不定长参数时,实参可以直接传一个数组
//需求:计算不确定个整数的和
//1.不定长的参数在进行使用的时候被当做数组来进行处理
//num其实就相当于一个数组的引用变量
//3.不定长参数在使用的时候,必须出现在参数列表的最后一个
//4.在同一个参数列表中,不定长参数只能出现一次
a.不定长的参数在进行使用的时候被当做数组来进行处理
b.不定长参数在使用的时候,必须出现在参数列表的最后一个
c.对于一个方法的参数是不定长参数时,实参可以直接传一个数组
排序:数组是存储一组数据,而且这些数据是有顺序的。但是数值本身可能是无序的。通过算法来实现给数组进行排序,升序(数值从小到大),降序(数值从大到小)。
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的运作如下:
交换过程图示(第一次):
那么我们需要进行n-1次冒泡过程。
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
那么我们需要进行n-1次冒泡过程。
数组的查找,就是指在给定的一个数组中,查找指定的数值,返回该数值在数组中的下标位置。但如果数组中包含重复的元素,不保证找到的是哪一个,如果数组中没有指定的元素,一般返回-1。
查找思路:遍历这个数组,依次把每一位元素和要查找的数据进行比较
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查数组为有序的数组,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列数组。首先,假设数组中元素是按升序排列,将数组中间位置记录的元素与要查找的数值比较,如果两者相等,则查找成功;否则利用中间位置记录将数组分成前、后两个部分,如果中间位置记录的元素值大于查找的数值,则进一步查找前一部分数组,否则进一步查找后一八月份数组。重复以上过程,直到找到满足条件的记录,使查找成功,或直到部分数组不存在为止,此时查找不成功。
优点:通过折半来缩小查找范围,提高查找效率
缺点:要求数组是有序的。
Arrays类是jdk提供的操作数组的一个工具类,位于java.util包下。
作用:主要用于对数组进行排序,查找,填充,比较等的操作
注意1:如果在同一个Java文件中同时使用Scanner和Arrays,则可以向如下方式导包:
注意2:但凡是工具类,类中的方法全部是静态的,方便调用
调用语法:类名.方法名(实参列表)
D:Arrays,提供数组的常规操作的
数组的拷贝:就是将一个数组的数据,复制到另一个数值中。
方法一:通过循环,依次复制,将原数组的数据,一个一个,复制到目标数组中
方法二:Arrays类里方法:copyOf(原数组,新数组的长度)-->返回值是新数组
方法三:System类里的方法:arraycopy(原数组,原数组位置,新数组,新数组位置,拷贝的个数)
Java并没有真正的多维数组,二维数组可以看成以数组为元素的数组。如:
)]笔试题目频道小编搜集的范文“2016最新Java笔试题集锦”,供大家阅读参考, ...
在文章开始之前我们先来介绍一下elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎. 查询 : Elasticsearch 允许执行和合并多种类型的搜索 — 结构化.非 ...
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。