#三、数组基本操作(一维数组) 3.1 数组基本操作: 获取元素 : 元素类型 变量 = 数组名[index ];设置元素 : 数组名[index ] = 值;遍历数组元素 : 建议使用for循环,因为for循环事先知道循环的次数 。数组长度 : int len = 数组名.length ; length是属性,不是方法.索引范围 : 从0开始,逐一递增。 [0,数组名.length-1] 3.2 操作数组常见异常: NullPointerException :空指针异常(空引用)。
出现该异常的原因 :当数组还未初始化,就直接操作数组
如以下代码:
String[] bs = null;
System.out.println(bs.length) ログイン後にコピー
ArrayIndexOutOfBoundsException :数组的索引越界异常。
出现该异常的原因 :根据索引取出数据元素时,输入了超出数组索引范围之外的值。
如下代码:
int[] nums = {1,3,5,7,9};
int a = nums[4]; ログイン後にコピー
3.3 获取数组最大最小元素 /**
* 求数组最大值
*
* @param nums
* @return
*/
public static int getMax(int[] nums) {
int result = 0;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
if (result < num) {
result = num;
}
}
return result;
}
/**
* 求数据最小值
*
* @param nums
* @return
*/
public static int getMin(int[] nums) {
int result = 0;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
if (i == 0) {
result = num;
}
if (result > num) {
result = num;
}
}
return result;
} ログイン後にコピー
3.4 打印数组元素 当我们直接使用System.out.println()打印数组的时候,打印出来是hashCode值,如
int[] nums = new int[]{1, 3, 5, 7, 9};
System.out.println(nums); ログイン後にコピー
我们不喜欢,我们想打印数组的时候,把该数组的元素打印出来 ,这时需要循环遍历打印
int[] nums = new int[]{1, 3, 5, 7, 9};
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + " ");
} ログイン後にコピー
但是呢,每次想打印数据中的元素都还要循环遍历一遍,好麻烦啊! 有没有更好的方式呢 ?其实不用着急,Java前辈们已经帮我们想到了这一点了,我们只需要调用Arrays.toString()方法就能够对数组进行打印 。
3.5 逆序排列数组元素 例子:原数组[A, B, C, D, E],要求对该数组进行逆序操作得到新数组:[E, D, C, B, A]。
public static String[] reversedOrder(String[] nums) {
String[] result = new String[nums.length];
int index = 0;
for (int i = nums.length - 1; i >= 0; i--) {
result[index] = nums[i];
index++;
}
return result;
} ログイン後にコピー
3.6 线性搜索:元素出现索引(第一次/最后一次) 数组的线性搜索指得就是挨个遍历,查找数组中与key相同的元素 ,若查找不到则可以返回-1(惯例,自定义),其效率为O(n)。
例子:int[] arr = {10,20,30,10,50,-30,10};获取元素10在arr数组中第一次出现的索引和最后一次出现的索引
/**
* 获取数组中指定元素第一次出现的索引
*
* @param nums
* @param element
* @return
*/
public static int indexOf(int[] nums, int element) {
for (int i = 0; i < nums.length; i++) {
if (element == nums[i]) {
return i;
}
}
return -1;
}
/**
* 获取数组中指定元素最后一次出现的索引
*
* @param nums
* @param element
* @return
*/
public static int lastIndexOf(int[] nums, int element) {
for (int i = nums.length - 1; i >= 0; i--) {
if (element == nums[i]) {
return i;
}
}
return -1;
} ログイン後にコピー
四、多维数组 在前面的文章中我们有提到数组其实就是是多个数据的集合 。如果现在有多个数组,我想把多个数组保存在一个集合中,此时我又应该如何完成呢?此时就需要引入多维数组的概念。多维数组其实就是把整个数组看成一个元素,存放到另一个数组当中去 。
多维数组的语法:
数组元素类型 [] 数组名;
例如如下定义二维数组的格式 :
int[][] arr = new int[][] {
arr1 ,arr2,arr3
};
int[][] arr = new int[][] {
{1,2,3} ,
{4,5},
{6}
}; ログイン後にコピー
4.1 多维数组和一维数组的区别 一维数组 :数组中的每一个元素都是一个值(基本类型和引用类型的值);二维数组 :数组中的每一个元素又是一个一位数组;三维数组 :数组中的每一个元素又是一个二维数组;注意:严格上说在Java中不存在多维数组的概念。为了和C语言做区分一般称之为数组中的数组 。
4.2 二维数组的初始化操作 静态初始化 :
int[][] arr = new int[][] {
{1,2,3} ,
{4,5},
{6}
};
动态初始化 :
int[][] arr = new int[3][5] ;//创建一个长度为3的二维数组,每一个元素(一维数组)的长度为5。
针对于N维数组,需要N个循环嵌套。
五、Java5对数组的新语法支持 Java5对数组的新语法支持主要是增强for循环(foreach) 和方法的可变参数 。
5.1 增强for循环-foreach 在之前我们使用for循环的打印元素操作如下
int[] nums = new int[]{1, 3, 5, 7, 9};
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
} ログイン後にコピー
其实我们在使用循环迭代数组的时候,往往是不关心迭代变量(数组的索引 )。那在Java中有没有更好的方式,在迭代数组元素的时候就只操作数组元素,不去操作数组的索引呢?其实是有的。
从Java5开始(JDK1.5)开始,Java提供了一种新的语法:增强for循环(foreach)。
语法:
for(数组元素类型 变量 : 数组名 )
{
循环体
}
我们通过反编译工具查看字节码,会发现foreach其实在底层依然是使用for循环+索引来操作数组的。我们把增强for循环称之为编译器的新特性---->语法糖 。
注意 :语法糖的最大甜头就是让开发者写更少、更简单的代码,完成相同的功能。当我们在迭代数组元素的时候不关心数组的索引的时,首选使用foreach 。当然咯,foreach远远没有本篇博客讲解的这么简单,星仔到时候带着大家在集合框架篇的时候再深入讲解foreach。
5.2 方法的可变参数 Java5的时候为什么要增加可变参数呢?我们来看一下以下的需求
需求:编写一个方法,统计使用数组传递过来的总和。
虽然说也是可以实现,但是我们心里肯定是不爽的,主要在于以下几点:
为了求多个数之和,我们还得先创建一个数组来存储数据。 如果多个数是变化的,比如求3个数之和变成求5个数之和.......,还得去修改定义数组,但是数组是定长的。 那如果要解决该问题该怎么办呢?这个时候就需要引入Java5的另一个新特性:方法的可变参数(说的是参数的个数可变)
注意:
方法的可变参数其实也是一个语法糖,是编译器级别的新特性 。主要是为了让开发者写代码更简单。 方法的可变参数其底层是就是一个数组类型 。 可变参数必须作为方法的最后一个参数 ,避免参数的歧义性。 一个方法最多只有一个可变参数 。
六、数组元素拷贝 数组拷贝 :从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。 被复制的组件的编号等于 length 参数。 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。 数组拷贝操作是经常使用到的,SUN就直接把数组的拷贝操作存放在JDK中的System类中 。
Object :Java语言中的根类。是所有类的老祖宗。Object可以表示任意数据类型。
该方法没有方法体,该方法使用了native修饰符(本地方法)。该方法底层使用了C/C++语言实现了,Java直接调用其他语言编写好的功能 。
arraycopy 方法使用方式 :
System.arraycopy(src, 2, dest, 5, 4); ログイン後にコピー
查阅API文档了(Java的帮助文档/好比字典),在什么类中有什么功能的方法即可。文档在手,天下我有!
推荐学习:《java学习教程 》
以上がJava 学習の概要の配列 (整理および共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
2024-10-22 09:46:29
2024-10-13 13:53:41
2024-10-12 12:15:51
2024-10-11 22:47:31
2024-10-11 19:36:51
2024-10-11 15:50:41
2024-10-11 15:07:41
2024-10-11 14:21:21
2024-10-11 12:59:11
2024-10-11 12:17:31