Java——数组的定义和使用
Posted 地火轰雷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java——数组的定义和使用相关的知识,希望对你有一定的参考价值。
文章目录
Java中数组的定义和使用
1.数组的基本用法
1.1什么是数组
数组本质上就是让我们能“批量”创建相同类型的变量。
例如:
如果需要表示两个数据,那么直接创建两个变量即可int a; int b;
如果需要表示五个数据,那么可以创建五个变量int a1; int a2; int a3; int a4; int a5;
但是如果需要表示一万个数据,那么就不能创建一万个变量了,这时候就需要使用数组,帮我们批量创建变量。
注意事项:在Java中,数组中包含的变量必须是相同类型。
1.2创建数组
基本语法
//动态初始化
数据类型[] 数组名称 = new 数据类型 [] {初始化数据};
//静态初始化
数据类型[] 数组名称 = {初始化数据};
代码示例
int[] arr = new int[]{1, 2, 3};
int[] arr = {1, 2, 3};
注意事项:静态初始化的时候,数组元素个数和初始化数据的个数是一致的。
1.3数组的使用
代码示例:获取长度&访问元素
int[] arr = {1, 2, 3};
//获取数组长度
System.out.println("length: "+array.length); // 执行结果:3
//访问数组中的元素
System.out.println(array[1]); // 执行结果:2
System.out.println(array[0]); // 执行结果:1
arr[2] = 100;
System.out.println(array[2]); // 执行结果:100
注意事项
- 使用
arr.length
能够获取到数组的长度。.
这个操作为成员访问操作符。 - 使用
[ ]
按小标取数组元素。需要注意,下标从0开始计数。 - 使用
[ ]
操作既能读取数据,也能修改数据。 - 下标访问操作不能超出有效范围[0,length-1],如果超出有效范围,会出现下标越界异常。
代码示例:下标越界
int[] arr={1,2,3};
System.out.println(arr[100]);
//执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at TestDemo.main(TestDemo.java:14)
抛出了java.lang.ArrayIndexOutOfBoundsException
异常。使用数组一定要下标谨防越界。
代码示例:遍历数组
所谓"遍历"是将数组中的所有元素都访问一遍,不重不漏。通常需要搭配循环语句。
int[] array={1,2,3};
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
//执行结果
1
2
3
代码示例:使用for-each遍历数组
int[] arr = {1,2,3};
for (int x : array){
System.out.println(x);
}
//执行结果
1
2
3
for-each是for循环的另外一种使用方式。能够更方便的完成对数组的遍历。可以避免循环条件和更新语句写错。
2.数组作为方法的参数
2.1基本用法
代码示例:打印数组内容
public static void printfArray(int[] a){
for(int x : a){
System.out.println(x);
}
}
public static void main(String[] args){
int[] arr={1,2,3};
printArray(arr);
}
//执行结果
1
2
3
在这个代码中
int[] a
是函数的形参,int[] arr
是函数实参。
如果需要获取到数组长度,同样可以使用a.length
。
2.2理解引用类型(重点/难点)
我们尝试以下代码
代码示例 参数传数组类型
public static void func1(int[] array){
array = new int[]{11,2,13,4,51,61};
}
public static void func2(int[] array){
array[0]=899;
}
public static void main(String[] args) {
int[] array={1,2,3,4,5,6};
System.out.println(Arrays.toString(array));
func1(array);
func2(array);
System.out.println(Arrays.toString(array));
}
//执行结果
func1:
1 2 3 4 5 6
[1,2,3,4,5,6]
func2:
1 2 3 4 5 6
[899,2,3,4,5,6]
我们发现,修改形参的值,不影响实参的的值。
我们发现,在函数内部修改数组内容,函数外部也发生改变。此时数组名arr是一个"引用",当传参的时候,是按照引用传参。
2.3认识 null
null在Java中表示"空引用",也就是一个无效的引用。
int[] arr = null;
System.out.println(arr[0]);
//执行结果
Exception in thread "main" java.lang.NullPointerException
at TestDemo.main(TestDemo.java:13)
null的作用类似于C语言中的NULL(空指针),都是表示一个无效的内存位置。因此不能对这个内存进行任何读写操作,一旦尝试读写,就会抛出NullPointerException
。
注意:Java中并没有约定null和0号地址的内存有任何关联。
3.数组作为方法的返回值
代码示例:写一个方法,将数组中的每个元素都*2
public static void func(int[] array){
for (int i = 0; i < array.length; i++) {
array[i]=2*array[i];
}
}// 在原来的数组上扩大二倍
public static int[] transform(int[] array){
int[] ret = new int[array.length];
for (int i = 0; i < array.length; i++) {
ret[i]=2*array[i];
}
return ret;
}// 在新的数组上扩大二倍
public static void main(String[] args) {
int[] array={1,2,3,4,5};
int[] ret=transform(array);
System.out.println(Arrays.toString(ret));
//func(array);
//System.out.println(Arrays.toString(array));
}
这样的话就不会破坏原有数组了。
另外由于数组是引用类型,返回的时候只是将这个数组的首地址返回给函数调用者,没有拷贝数组内容,从而比较高效。
4.数组练习
4.1数组转字符串
代码示例
import java.util.Arrays;
int[] arr = {1,2,3,4,5,6};
String newArr = Arrays.toString(arr);
System.out.println(newArr);
//执行结果
[1, 2, 3, 4, 5, 6]
使用这个方法后续打印数组就更方便一些。
Java中提供了java.util.Arrays;
包,其中包含了一些操作数组的常用方法。
我们实现一个自己版本的数组转字符串
public static String myToString(int[] array){
if(array==null) return "null";
String str="[";
for (int i = 0; i < array.length ; i++) {
str=str+array[i];
//除了最后一个元素之外,其他元素后面都要加上","
if(i!= array.length-1){
str=str+",";
}
}
str=str+"]";
return str;
}//[1,2,3,4,5]
public static void main(String[] args) {
int[] array={1,2,3,4,5};
System.out.println(myToString(array));
}
4.2数组拷贝
代码示例1
public static int[] copyArray(int[] array){
int[] copy=new int[array.length];
for (int i = 0; i < array.length; i++) {
copy[i]=array[i];
}
return copy;
}
public static void main(String[] args) {
int[] array={1,2,3,4,5,6};
int[] ret=copyArray(array);
System.out.println(Arrays.toString(ret));
}
代码示例2
public static void main(String[] args) {
int[] array={1,2,3,4,5,6};
int[] ret=Arrays.copyOf(array,array.length*2);
System.out.println(Arrays.toString(ret));
}
代码示例3
public static void main(String[] args) {
int[] array={1,2,3,4,5,6};
int[] ret=Arrays.copyOfRange(array,1,3);//[1,3)
System.out.println(Arrays.toString(ret));
}
代码示例4
public static void main(String[] args) {
int[] array={1,2,3,4,5,6};
int[] copy=new int[array.length];
System.arraycopy(array,0,copy,0,array.length);
System.out.println(Arrays.toString(copy));
}//C++/C 已经实现了,特点:快
代码示例5
public static void main(String[] args) {
int[] array={1,2,3,4,5,6};
int[] copy=array.clone();
System.out.println(Arrays.toString(copy));
}//产生一个副本
4.3找数组中的最大元素
给定一个整型数组,找到其中的最大元素(找最小元素同理)
代码示例
public static int maxNum(int[] array){
if(array==null) return -1;// 业务上的处理
if(array.length==0) return -1;
int max=array[0];
for (int i = 0; i < array.length; i++) {
if(max<array[i]){
max=array[i];
}
}
return max;
}
public static void main(String[] args) {
int[] array={12,8,1,2,10};
maxNum(array);
System.out.println(maxNum(array));
}
//执行结果
12
4.4求数组中元素的平均值
给定一个整型数组,求平均值
代码示例
public static double avg(int[] arr){
int sum=0;
for (int x : arr) {
sum += x;
}
return (double)sum/(double)arr.length;
}
public static void main(String[] args) {
int[] array={1,2,3,4,5,6};
System.out.println(avg(arr));
}
//执行结果
3.5
注意事项:结果要用double来表示。
4.5查找数组中指定元素(顺序查找)
给定一个数组,再给定一个元素,找出该元素在数组中的位置。
代码示例
public static int findNum(int[] array,int key){
for (int i = 0; i < array.length; i++) {
if(array[i]==key){
return i;
}
}
return -1;// 因为数组的下标 不可能存在负数
}
public static void main(String[] args) {
int[] array={1,9,4,2,15,17};
System.out.println(findNum(array,2));
}
//执行结果
3
4.6查找数组中指定元素(二分查找)
针对有序数组,可以使用更高效的二分查找。
以升序数组为例,二分查找的思路是先取中间位置的元素,看要找的值比中间元素大还是小,如果小,就去左边找;否则就去右边找。
代码示例
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){