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源代码里可以查看到具体实现和底层调用



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值