java基础——数组操作

高级数组
main方法是static修饰的,说明直接使用Hello类调用即可
在底层是JVM通过Hello.main(实参);
main方法的String数组参数,实际是保留给程序运行者的,给程序传递一个数据
方法类型的值传递值之基本数据类型
Change方法执行完毕后change的栈帧被销毁,而main方法栈帧中的x仍然为10
方法类型的值传递值机制之引用数据类型

无论是基本类型还是引用数据类型,用的都是值传递方法
基本类型传递的是的副本,引用类型传递的是地址的副本

数组的语法:
数组元素类型[] 数组名:
Int[][] arr = new int[][]{arr1,arr2,arr3};
-----------------------------------------
一维数组:数组中的每一个元素都是一个值(基本类型和引用类型的值).
二维数组:数组中的每一个元素都是一个一维数组.
三维数组:数组中的每一个元素都是一个二维数组.
-------------------------------------------
严格上说,在java中不存多维数组的概念,和c区分,一般称为数组中的数组.

Int [][] arr = new int[][]{
{1,2,3},
{2,3},
{5}
}
针对于n维数组需要n维嵌套.
-----------------------------------------------------------------------------------------------
Java5对数组的新语法支持
  1. 增强for循环foreach
  2. 方法的可变参数
其实我们在使用循环迭代数组的时候,往往是不关心迭代变量(数组索引)
有没有更好的方法迭代数组元素的时候就只操作数组元素,不操作数组的索引

Java5开始(jdk1.5)开始,java提供了一种新的语法:增强for循环(foreach)
语法:
For(数组元素变量 类型:数组名)
{
循环体

}
------------------------------
通过反编译工具查看字节码,foreach在底层依然就是使用for循环+索引来操作数组的
我们把增强for循环,称之为编译器的新特性--->叫做语法糖.
语法糖的最大甜头,就是让开发者写更少,更简练的语句

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

不足的地方:
  1. 为了求多个数之和,害的先创建一个数组来存储数据.
  2. 如果多个数是变化的,比如求三个之和变成求五个之和,还得修改数组
期望是这样调用的:
要解决该问题:必须使用java5的另一个新特性,方法的可变参数(个数可变)

反编译结果:
------------------
所谓的方法的可变参数也 只是一个语法糖,编译器级别的新特性
方法的可变参数底层是一个数组
--------------------------------------------------------------------------------
Int类型的数组元素拷贝
int[] src = new int[]{1,2,3,4,5,6,7,8,9,10};//源素组
int[] des = new int[10];
//需求:从src拷贝3,4,5到des数组中
static void copy(int[] src ,int[] des, int srcPos , int desPos, int length)
/*参数
src 源数组
des 目的数组
srcPos 从源数组的哪一个索引位置开始
desPos 在目标数组中的哪一个索引位置开始粘贴
length 拷贝元素的个数
*/
代码存在问题:
(1)只能拷贝int类型的数组;
(2)代码不够健壮


定义一个数组元素的拷贝方法,支持任意类型的数组元素拷贝操作(反射)
数组拷贝操作是经常使用到的,SUN就直接把数组的拷贝操作放在JDK中的system类中

Object:java语言中的根类,老祖宗类,object可以表示任意的数据类型
该方法没有方法体,该方法使用了native修饰符(本地方,该方法底层使用了C/C++实现了,java直接调用其他语言编写好的)
查阅api文档
排序:
按照一定顺序进行排序
升序:从小到大
降序:从大到小
------------------------------
排序的分类
选择排序(直接选择排序,堆排序)
交换排序(冒泡排序,快速排序)
插入排序(直接插入排序,二分法插入排序,shell排序)
归并排序等

若有下列int类型的数组需要排序:
Int[] arr={2,9,5,7,4,1};

  1. 冒泡排序
这是最简单的排序方法,基本思路:对未排序的元素从头到尾依次标记相邻的两个元素的大学关系,若左边大于右边则交换顺序,第一轮可以得出最大的值,然后用同一的而方法将剩下的元素逐个比较即可.
可以看出如有n个元素,那么一共需要n-1次比较,第m轮需要进行n-m次比较

static void bubbleSort(int[] arr)
{
for(int times = 1; times <= arr.length - 1 ; times ++)
{
for(int index = 1; index <= arr.length - times; index++)
{
if(arr[index - 1] > arr[index])
{
swap(arr, index - 1, index);
}
}
}
}
  1. 选择排序(selection sort):
基本思路:选择某个索引位置的元素,然后后河面元素依次比较,若大於则交换位置,经过第一轮比较排序后可以得出最小值,然后使用同一的方法把剩下的元素逐个比较即可
可以看出选择排序,第一轮会选出最小值,第二轮选出第二小的值,直到最后.
第一轮从arr[0]和后面的元素比较,第二轮从arr[1]和后面的元素比较,依次类推,n个数需要进行N-1轮,选择排序每一轮值进行一次交换,相对于冒泡排序效率高一点.

数组的搜索算法:从指定的数组中去搜索某一个元素的索引是多少.
方式一:线性搜索(从头到尾/从尾到头):indexof/lastindexof
对于元素过多的数组,性能极低:有n个元素,循环次数= (N+1)/2
方式二:二分搜索/二分查找
前提:数组元素必须有序.
-------------------
算法:当数据量很大适宜采用二分法,数据需是排好的
猜数游戏:
1到100之间的一个数,要你猜

数组的算法操作,使用太频繁,SUN公司提供了数组工具Arrays
java.util.Arrays.sort(arr,2,6);//排序操作.(前闭后开,对2到5操作,6开始不再操作)

在java源代码里可以查看到具体实现和底层调用



 说明:本文乃学习整理参考而来.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章