目录
1 数组的基本用法
1.1数组是什么
1.2创建数组
1.3数组的使用
2 数组作为方法的参数
2.1基本用法
2.2引用的理解
2.3认识null
2.4认识JVM内存区域划分
3数组作为方法的返回值
4 数组练习
4.1数组转字符串
4.2查找数组中的指定元素(二分查找)
1 数组的基本用法
1.1数组是什么
数组是用一段连续的空间来储存一些相同类型的数据。
数组中的每一个数据都有自己的唯一下标,这个下标也是访问这个元素的标识。下标是从0开始的
例如数组中有5个数,它里面的数据于数据所对应分下标如图
例如:
1,2,3,4,5,6,7就可以用一个数组来存储
1.2创建数组
基本语法:
数据的类型[]数组名称={初始化数据};
数据的类型[]数组名称=new 数据类型[要存放的数据的个数]{初始化数据};
示例代码:
int[]array1={1,2,3,4,5};
int[]array2=new int[5]={1,2,3,4,5};
1.3数组的使用
数组的基本的使用有两个,1是或去数组的长度,2是访问数组的每一个元素
示例代码:
public static void main(String[] args) {
int[]array={1,2,3,4,5};
//获取数组的长度
int len=array.length;
System.out.println(len);
//通过数组的下标访问数组
System.out.println(array[0]);
}
注意事项
1. 使用 arr.length 能够获取到数组的长度 . . 这个操作为成员访问操作符 . 后面在面向对象中会经常用到 . 2. 使用 [ ] 按下标取数组元素 . 需要注意 , 下标从 0 开始计数 3. 使用 [ ] 操作既能读取数据 , 也能修改数据 . 4. 下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围 , 会出现下标越界异常. 数组使用示例代码:数组的遍历public static void main(String[] args) {
int[]array={1,2,3,4,5};
//for循环遍历
for(int i=0;i
2 数组作为方法的参数
2.1基本用法
示例代码:数组的遍历
public static void playArray(int[]array){
for (int i = 0; i
在这个代码中arr是实参,array是形参,array.legth也可以获取数组的长度
2.2引用的理解
首先我们来看下面的代码:
public static void change(int num){
num=20;
System.out.println("num="+num);
}
public static void main(String[] args) {
int a=10;
change(a);
System.out.println("a="+a);
}
很明显我们想要通过方法去改变a是做不到的,因为num是a的拷贝而已,它们只是值相同而已
那么我们如果就要对某个空间上数据通过方法进行修改要怎么做呢?
这里就引入了引用的概念
引用:引用也是一种变量,不过它储存的是一个对象的地址(对象的概念在以后讨论)。
下面我们来看一段代码
public static void change(int[]array){
for(int i=0;i
我们可以看到数组中的数据被改变了,这到底是为什么呢,下面我们来讨论这个问题。
首先,我要告诉大家数组是一个引用类型,数组名就是这个引用类型的变量名,这个变量里面存放这数组中元素的地址。那么array对arr的一份拷贝,也就是说array中也存放这相同的地址,所有通过地址就可以改变地址所对应空间的值。
如图:
2.3认识null
null
在
Java
中表示
"
空引用
" ,
也就是一个无效的引用
.
null
的作用类似于
C
语言中的
NULL (
空指针
),
都是表示一个无效的内存位置
.
因此不能对这个内存进行任何读写操
作
.
一旦尝试读写
,
就会抛出
NullPointerException.
注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联.
2.4认识JVM内存区域划分
JVM的内寸被划分为了几个不同的区域
程序计数器 (PC Register): 只是一个很小的空间 , 保存下一条执行的指令的地址 . 虚拟机栈 (JVM Stack): 重点是存储 局部变量表 ( 当然也有其他信息 ). 我们刚才创建的 int[] arr 这样的存储地 址的引用就是在这里保存. 本地方法栈 (Native Method Stack): 本地方法栈与虚拟机栈的作用类似 . 只不过保存的内容是 Native 方法的局 部变量. 在有些版本的 JVM 实现中 ( 例如 HotSpot), 本地方法栈和虚拟机栈是一起的 . 堆 (Heap): JVM 所管理的最大内存区域 . 使用 new 创建的对象都是在堆上保存 ( 例如前面的 new int[]{1, 2, 3} ) 方法区 (Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据 . 方法编译出的的字节码就是保存在这个区域 . 运行时常量池 (Runtime Constant Pool): 是方法区的一部分 , 存放字面量 ( 字符串常量 ) 与符号引用 . ( 注意 从 JDK 1.7 开始 , 运行时常量池在堆上) Native 方法 : JVM 是一个基于 C++ 实现的程序 . 在 Java 程序执行过程中 , 本质上也需要调用 C++ 提供的一些函数进行和操 作系统底层进行一些交互 . 因此在 Java 开发中也会调用到一些 C++ 实现的函数 . 这里的 Native 方法就是指这些 C++ 实现的 , 再由 Java 来调用的函数3数组作为方法的返回值
示例代码:将一个数组中的每一个元素扩大2倍并返回
public static int[]toDouble(int[]array){
int[]returnArray=new int[array.length];
for (int i = 0; i
4 数组练习
4.1数组转字符串
代码:
public static String toString(int[]array){
String str="[";
for(int i=0;i
4.2查找数组中的指定元素(二分查找)
针对
有序数组
,
可以使用更高效的二分查找
.
啥叫有序数组
?
有序分为
"
升序
"
和
"
降序
"
如
1 2 3 4 ,
依次递增即为升序
.
如
4 3 2 1 ,
依次递减即为降序
.
以升序数组为例
,
二分查找的思路是先取中间位置的元素
,
看要找的值比中间元素大还是小
.
如果小
,
就去左边找
;
否则去右边找
代码:
public static int binarySearch(int[]array,int key){
int left=0;
int right=array.length-1;
while(left<=right){
int mid=(left+right)/2;
if(array[mid]>key){
right=mid-1;
}else if(array[mid]



