Java基础-第五章(数组高级)

2018-02-27 11:34:56来源:oschina作者:PengTdy人点击

分享

一.方法参数的值传递机制

Java方法的参数传递只有一种: 值传递,所谓值传递,就是将实际参数值的副本,传入方法内,而参数本身不会收到任何影响;


main方法的数组参数


public class Hello{
//参数类型:String[]
//参数名称:args(arguments)
public static void main(String[] args){
System.out.println("Hello");
}
}

main方法是static修饰的,说明直接使用Hello类调用即可;在底层是JVM通过Hello.main(new String[]{});main方法的String数组参数,其实是暴露给程序运行者的,用于给程序传递一个数据信息;


1.基本类型

基本类型传递的是值本身的副本


2.引用类型

引用类型传递的是地址的副本


二.多维数组
1.引入数组中的数组以及定义

数组是多个数据的集合


多维数组的语法:


int arr = new int[][]{{1,2,3,4},{1,2},{2,5}}; 一维数组:数组中的每一个元素都是一个值(基本类型和引用类型的值);
二维数组:数组中的每一个元素又是一个一维数组;
三维数组:数组中的每一个元素又是一个二维数组;

注意:严格上说:在Java中不存在多维数组的概念,和c语言作区分,一般称之为数组中的数组;



2.初始化和内存分析

二维数组的初始化操作:


1).静态初始化
int arr = new int[][]{
{1,2,3,4},
{1,2},
{2,5}
};
2).动态初始化
int arr = new int[3][5];

创建一个长度为3的二维数组,每个元素(一维数组)的长度为5;


三.Java5对数组的支持

Java5对数组的新语法支持:

1).增强for循环-foreach;
2).方法的可变参数;1.增强for循环-foreach

使用增强for循环操作数组:


int arr = new int[][]{{1,2,3,4},{1,2},{2,5}};
// 增强for循环
for(int ar : arr){
System.out.println(ar);
}

其实增强for循环在底层依然使用的是for循环+索引来操作数组的;这种编译器的新特性称之为-语法糖;



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



2.方法的可变参数

方法的可变参数,其实也是一种语法糖,编译器级别的新特性;


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



注意:可变参数必须作为方法的最后一个参数,避免参数的歧义性;方法最大只有一个可变参数



四.数组算法
1.数组元素的拷贝

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


static void copy(int[] src,int srcPos,int[] dest,int destPos,int length){
// index表示每次需要拷贝元素的索引
for(int index = srcPos;index < srcPos + length;index ++){
dest[destPos] = src[index];
destPos ++;
}
}
2.System类的数组拷贝方法

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


数组拷贝操作,是经常使用的,sun公司就直接把数组的拷贝操作存放在JDK中的System类中;


public static native void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);

Object: Java语言的跟类,Object可以表示任意数据类型;该方法没有方法体,该方法使用了native修饰符(本地方法),该方法底层使用了c/c++语言实现了,Java直接调用其他语言编写好的功能;


3.排序算法
1).冒泡排序
static void bubbleSort(int[] arr){
for(int times = 1;times <= arr.length -1;times ++){
for(int i = 1;i <= arr.length - times;i ++){
if(arr[i - 1] > arr[i]){
swap(arr,i-1,i);
}
}
}
}
static void swap(int[] arr,int index1,int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
2).选择排序
static void selectionSort(int[] arr){
for(int times = 1;times <= arr.length -1;times ++){
for(int i = times;i <= arr.length;i ++){
if(arr[times - 1] > arr[i]){
swap(arr,times-1,i);
}
}
}
}
static void swap(int[] arr,int index1,int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
4.搜索算法

数组的搜索算法: 从指定的数组中去搜索某一个元素的索引是多少;方式一: 线性搜索从头搜到尾或从尾搜到头;对于元素过多的数组,性能极低,有N个元素,循环次数=(N + 1) / 2;


方式二: 二分搜索法/二分查找法/折半查找前提是数组元素必须有顺序;


static void binarySearch(int[] arr,int key){
// 最小索引
int low = 0;
// 最大索引
int high = arr.length -1;
while(low <= high){
// 中间索引 >>1表示除以2
int mid = (low + high) >> 1;
// 中间的元素,猜测的值
int midVal = arr[mid];
// 猜大了
if(midVal > key){
high = mid -1;
}else if(midVal < key){
low = mid +1
}else{
returm mid;
}
return -1;
}
}
5.自行封装数组操作工具ArrayUtil类
6.Java自带数组工具类Arrays

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


反馈与建议 博客:我的CSDN博客
邮箱:pengtdy@gmail.com
QQ交流群:644402856(新)

感谢你阅读这篇博客。如果您喜欢这篇博客就请关注我和朋友一起分享吧!

微信扫一扫

第七城市微信公众平台