mian方法的参数数组



Java 数组_c++


main方法是static修饰的,说明直接使用Hello类调用即可.

在底层是JVM通过Hello.main(newString[]{});

main方法的String数组参数,其实是暴露给程序运行者的,用于给程序传递一个数据信息.


方法参数的传递机制


方法参数的值传递机制之基本数据类型

Java 数组_数组_02

多维数组

前面说了,数组是多个数据的集合.

int[]arr = new int[] {1,3,5,7,9};

如果现在有多个数组,我想把多个数组保存在一个集合中,此时我又应该如何完成.

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

把上述的每个数组都作为一个元素,那么此时元素的类型为:int[].

------------------------------------------------------------------------------

数组的语法:

数组元素类型[] 数组名;

int[][]  arr = new int[][]   {
arr1 ,arr2,arr3
};

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

------------------------------------------------------------------------------

一维数组:数组中的每一个元素都是一个值(基本类型和引用类型的值).

二维数组:数组中的每一个元素又是一个一位数组.

三维数组:数组中的每一个元素又是一个二维数组.

-------------------------------------------------------------------------------

严格上说,在Java中不存在多维数组的概念,和C语言做区分,一般称之为数组中的数组.

二维数组的初始化操作:

静态初始化:

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

动态初始化:

int[][]  arr = new int[3][5] ;创建一个长度为3的二维数组,每一个元素(一维数组)的长度为5.

int[][]  arr = new int[0][5]

-------------------------------------

针对于N维数组,需要N个循环嵌套.


Java 数组_java_03

java5对数组的新语法的支持

Java5对数组的新语法支持:

   1):增强for循环-foreach

   2):方法的可变参数

增强for循环-foreach:

需求:定义一个数组,使用循环迭代出数组中的每一个元素.

使用for循环的操作如下:

Java 数组_数组_04

其实,我们在使用循环迭代数组的时候,往往是不关心迭代变量(数组的索引),有没有更好的方式,迭代数组元素的时候,就只操作数组元素,不去操作数组的索引.

从Java5开始(JDK1.5)开始,Java提供了一种新的语法:增强for循环(foreach).

语法:

for(数组元素类型 变量  :   数组名){
循环体
}

Java 数组_php_05

-----------------------------------------------------------

通过反编译工具查看字节码,发现foreach其实在底层依然是使用for循环+索引来操作数组的.

我们把增强for循环,称之为编译器的新特性---->语法糖.

语法糖的最大甜头就是:让开发者写更少,更简单的代码,完成相同的功能.

-----------------------------------------------------------

for循环功能比foreach更彪悍.

------------------------------------------------------------

如果迭代数组元素,而不关心数组的索引的时候,首选使用foreach.

-----------------------------------

foreach还未结束--->集合框架.


Java 数组_开发语言_06


方法的可变参数:

需求:编写一个方法,统计使用数组传递过来的总和.

Java 数组_php_07

但是心里不爽:

    1):为了求多个数之和,我还得先创建一个数组来存储数据.

    2):如果多个数是变化的,比如求3个数之和,变成求5个数之和.......,还得去修改我的数组,但是数组是定长的.

Java 数组_数组_08

说人话:我期望调用求和的方法是这样调用的.

要解决该问题,必须使用Java5的另一个新特性,方法的可变参数,说的是参数的个数可变.

--------------------------------------------------------------------------------------------

Java 数组_php_09

方法的可变参数,其实也是一个语法糖,编译器级别的新特性,让开发者写代码更简单.

方法的可变参数其底层是就是一个数组类型.

可变参数必须作为方法的最后一个参数,避免参数的歧义性.

  推论:方法最大只有一个可变参数.


数组元素拷贝


数组拷贝:

从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

从 src引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。

被复制的组件的编号等于length 参数。

源数组中位置在srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。

publicstatic void arraycopy(int[] src, int srcPos, int[] dest,int destPos, intlength) {

}

数组拷贝:

从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

从 src引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。

被复制的组件的编号等于length 参数。

源数组中位置在srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。

publicstatic void arraycopy(int[] src, int srcPos, int[] dest,int destPos, intlength) {

}

代码存在的问题:

    1:只能拷贝int类型的数组.

    2:代码不够健壮.


Java 数组_c++_10


定义一个数组元素的拷贝方法,能支持任意类型的数组元素拷贝操作(反射).

数组拷贝操作,是经常使用到的,SUN就直接把数组的拷贝操作存放在JDK中的System类中.

Java 数组_php_11

Object:Java语言中的根类,老祖宗类,Object可以表示任意数据类型.

该方法没有方法体,该方法使用了native修饰符(本地方法),该方法底层使用了C/C++语言实现了,Java直接调用其他语言编写好的功能:

Java 数组_php_12

可以参考API

Java 数组_数组_13

排序算法

排序:按照指定的顺序排列出来.

       升序:从小到大:

       降序:从大到小.

--------------------------------------------

排序的分类:

选择排序(直接选择排序、堆排序)

交换排序(冒泡排序、快速排序)

插入排序(直接插入排序、二分法插入排序、Shell排序)

归并排序等。

排序有升序排列和降序排列之分,我们现在单讲升序排列:

我们主要讲解冒泡,选择,插入排序,当然在开发中因为性能问题,我们都不会自己写排序算法,不过排序在笔试题里却是常客。

若有下列int类型数组需要排序:

int[]arr = {2,9,6,7,4,1};

Java 数组_c++_14

冒泡排序(BubbleSort):

这是最简单的排序法,基本思路:

对未排序的各元素从头到尾依次比较相邻的两个元素大小关系,若大于则交换位置,经过第一轮比较排序后可得出最大值,然后使用同样的方法把剩下的元素逐个比较即可。

可以看出若有N个元素,那么一共要进行N-1轮比较,第M轮要进行N-M次比较。(若6个元素,要进行6-1轮比较,第一轮比较6-1次,第三轮比较6-3次)。


Java 数组_c++_15

Java 数组_c++_16

选择排序(SelectionSort):

基本思路:选择某个索引位置的元素,然后和后面元素依次比较,若大于则交换位置,经过第一轮比较排序后可得出最小值,然后使用同样的方法把剩下的元素逐个比较即可。

可以看出选择排序,第一轮会选出最小值,第二轮会选出第二小的值,直到最后。

第一轮从arr[0]和后面元素相比较,第二轮从arr[1]和后面的元素相比较,依次类推。N个数要进行N-1轮。选择排序每一轮只进行一次交换,相对于冒泡排序效率高一些。


Java 数组_开发语言_17

Java 数组_php_18

static void selectSort(int[] arr) {
for (int times = 0; times < arr.length - 1;times++) {
int minIndex = times;
for (int i = times + 1; i < arr.length;i++) {
if (arr[i] < arr[minIndex]) {
minIndex = i;
}
}
swap(arr, times, minIndex);
}
}


数组的搜索算法

数组的搜索算法:从指定数组中去搜索某一个元素的索引是多少.

  方式1:线性搜索(从头搜到尾/从尾搜到头):indexOf/lastIndexOf

              对于元素过多的数组,性能极低:有N个元素,循环次数= (N + 1) / 2;

  方式2:二分搜索法/二分查找法/折半查找.

               前提:数组元素必须有顺序.

------------------------------------------------------------------------------------

算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的

猜数游戏:

一个朋友让你猜他正在想的一个从1到100之间的数,等你猜了,他会告诉你三种结果中的一个:你猜的比他想的大,或小,或猜中了。

为了能用最少的次数猜中,必须从50开始猜。如果他说你猜的小了,那么就能推出哪个数在50到100之间,所以马上猜75。但如果他说猜大了,你也能明白哪个说在1到50之间,所以马上猜25。如此重复,范围越来越小,直到猜到为止。


Java 数组_java_19


自行封装数组操作工具


讨论的都是int类型数组:

打印数组元素:print方法

颠倒数组元素:reverse

获取元素索引:indexOf/lastIndexOf

获取元素最值:getMax/getMin

拷贝数组元素:arraycopy

数组元素排序:sort

二分查询方法:binarySearch

------------------------------------------------------------------

针对于数组来说,上述方法会经常使用到.

在A类使用,得把上述方法拷贝到A类中去使用.

在B类使用,得把上述方法拷贝到B类中去使用.

.........

重复的功能被定义了N次!


Java 数组_php_20


java自带Arrays工具类


数组的算法操作,使用太频繁了,SUN公司就直接在JDK中提供了一个数组的工具类(Arrays).

java.util.Arrays类:

方法

描述

int binarySearch(type[] arr,type key) 

使用二分法查找数组里某元素并返回其索引,若找不到返回负数.

void sort(type[]arr) 

使用调优后的快速法对指定数组排序。

StringtoString(type[] arr)

返回指定数组内容的字符串表示形式。

publicstatic type[] copyOf(type[] original, int newLength)

复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。

---------------------------------------------

使用注意:必须java.util.Arrays.方法(参数);


Java 数组_开发语言_21