Java编程基础-数组

一、数组的定义。

1、数组的含义:数组是一组具有相同数据类型的元素的有序集合。数组可以分为一维数组和多维数组。(数组是一个引用类型的容器,从0开始编号存储相同数据类型的数据。)

2、数组的定义语法格式:

(1)、格式一:数据类型  [ ] 数组名=new 数据类型[元素的个数或数组的长度];

例如:int[ ] arr=new int[3];//定义了一个整型数组,数组中有3个元素(数组长度为3)

附:数组名放在[ ] 前面也是可以的,即int arr[ ] =new int[3];//但一般不建议这么定义。

(2)、格式二:数据类型  [ ] 数组名=new 数据类型[ ]{元素1,元素2,元素3,......};

例如:int[ ] arr=new int[ ]{1,2,3,4,5};//直接给数组进行赋值,需要注意的是new int[ ] 的括号中不能够指定数组中存放元素的个数,因为我们不清楚后面定义的数组个数。如果写了元素个数,JVM虚拟机在运行的时候会报错。

(3)、格式三:数据类型  [ ] 数组名={元素1,元素2,元素3,......};

例如:int[ ] arr= {1,2,3,4,5};//属于直接赋值的方式

格式二和格式三也称静态初始化,就是在定义数组的同时就为数组的每个元素赋值。

注意:

a)arr(即数组名)是引用数据类型中的数组类型,arr存的是地址值。该变量必须指向一个有效的数组对象,如果该变量的值为null,arr不再指向堆内存中的数组,此时通过该变量访问数组中的元素会出现空指针异常(NullPointerException)。堆内存中数组被虚拟机视为垃圾,(虚拟机会启动垃圾回收机制)不定时间内最终被清除。

b)数组中元素最小的索引(下标、角标)是0,最大的索引是数组的长度-1.访问元素时超出了数组的索引范围会出现数组角标越界异常(ArrayIndexOutOfBoundsException)。在Java中,为了方便获得数组的长度,提供了一个length属性,在程序中可以通过“数组名.length”的方式来获得数组的长度,即元素的个数。

c)不同数据类型数组的元素都有默认初始化值,其中byte、short、int、long的默认初始化值为0,float和double类型的默认初始化值为0.0,char类型的默认初始化值为一个空字符,即"\u0000",boolean类型的默认初始化值为false,引用类型的默认初始化值为null,表示变量不引用任何对象。

代码示例演示:

[java] view plain copy

  1. public class Demo {
  2. public static void main(String[] args) {
  3. int[] arr = new int[3];// 声明一个数组arr,并开辟内存空间
  4. System.out.println("数组的长度为:" + arr.length);
  5. // 数组元素的访问通过数组名[下标]的方式访问
  6. System.out.println("数组的第一个元素为:" + arr[0]);//由于未初始化,所以访问的元素为默认值
  7. System.out.println("数组的第二个元素为:" + arr[1]);
  8. System.out.println("数组的第三个元素为:" + arr[2]);
  9. System.out.println(arr[3]);
  10. // 由于数组arr的最大下标为length-1,即最大下标为2,所以访问下标为3的元素会报数组角标越界异常
  11. //arr = null;
  12. //System.out.println(arr[0]);
  13. // 由于数组的引用为null,不再指向内存中的数组地址值,此时再访问数组中的0角标元素会报空指针异常
  14. }
  15. }

输出结果为:

数组的长度为:3

数组的第一个元素为:0

数组的第二个元素为:0

数组的第三个元素为:0

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

at Demo.main(Demo.java:11)

//Exception in thread "main" java.lang.NullPointerException

at Demo.main(Demo.java:14)

二、数组的常见操作。

1、数组的遍历

在操作数组时,经常需要依次访问数组中的每一个元素,这种操作称作数组的遍历。由于数组中元素类型的相同,而且元素是有序的,从0开始到最大下标,所以常用循环的方式遍历数组。

代码示例演示:

[java] view plain copy

  1. public class Demo {
  2. public static void main(String[] args) {
  3. int[] arr = { 5, 12, 21, 9, 7 };// 声明并初始化一个长度为5的int类型数组
  4. for (int i = 0; i < arr.length; i++) {// 循环遍历数组中的每一个元素
  5. System.out.println("arr[" + i + "]=" + arr[i]);// 打印输出元素值
  6. }
  7. // 使用增强for循环的方式遍历输出数组中的元素
  8. for (int a : arr) {
  9. System.out.print(a+" ");
  10. }
  11. }
  12. }

输出的结果为:

arr[0]=5

arr[1]=12

arr[2]=21

arr[3]=9

arr[4]=7

5 12 21 9 7

2、数组的最值

在操作数组时,经常需要获取数组中元素的最值。

代码示例演示:

[java] view plain copy

  1. public class Demo {
  2. public static void main(String[] args) {
  3. int[] arr = { 5, 1, 2, 8, 7, 21, 12 };// 定义一个数组
  4. int max = getMax(arr);// 调用获取元素最大值的方法
  5. System.out.println("max=" + max);// 打印最大值
  6. System.out.println("最大值为:" + getMax_2(arr));
  7. int min = getMin(arr);// 调用获取元素最小值的方法
  8. System.out.println("min=" + min);// 打印最小值
  9. System.out.println("最小值为:" + getMin_2(arr));
  10. }
  11. public static int getMax(int[] arr)// 定义了一个求最大值的方法
  12. {
  13. int max = arr[0];// 定义变量max用于记住最大数,先假设第一个元素为最大值
  14. // 需要注意的是:在for循环中的变量i是从1开始的,这样写的原因是程序已经假设第一个元素为最大值,
  15. // for循环中只需要从第二个元素开始比较,从而提高程序的运行效率。
  16. for (int x = 1; x < arr.length; x++)// 通过for循环遍历数组中的元素
  17. {
  18. if (arr[x] > max)// 比较arr[x]的值是否大于max
  19. {
  20. max = arr[x]; // 条件成立,将arr[x]的值赋给max
  21. }
  22. }
  23. return max;// 返回最大值
  24. }
  25. public static int getMax_2(int[] arr) {// 获取最大值的第二种方法,初始化为数组中元素任意一个角标。
  26. int max = 0;
  27. for (int x = 1; x < arr.length; x++) {
  28. if (arr[x] > arr[max]) {
  29. max = x;
  30. }
  31. }
  32. return arr[max];
  33. }
  34. public static int getMin(int[] arr)// 定义了一个求最小值的方法
  35. {
  36. int min = arr[0];// 定义变量min用于记住最小数,先假设第一个元素为最小值
  37. for (int x = 1; x < arr.length; x++)// 通过for循环遍历数组中的元素
  38. {
  39. if (arr[x] < min)// 比较arr[x]的值是否小于min
  40. {
  41. min = arr[x]; // 条件成立,将arr[x]的值赋给min
  42. }
  43. }
  44. return min;// 返回最小值
  45. }
  46. public static int getMin_2(int[] arr) {// 获取最小值的第二种方法
  47. int min = 0;
  48. for (int x = 1; x < arr.length; x++) {
  49. if (arr[x] < arr[min]) {
  50. min = x;
  51. }
  52. }
  53. return arr[min];
  54. }
  55. }

输出结果为:

max=21

最大值为:21

min=1

最小值为:1

3、数组的排序

在操作数组时,经常需要对数组中的元素进行排序,数组排序的方法有很多种,比如选择排序,冒泡排序,插入排序,希尔排序等。(这里就只简答介绍选择和冒泡排序。)

(1)、选择排序

每一次从待排序的数据元素中选取最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

代码实现:

[java] view plain copy

  1. public static void selectSort(int[] arr)// 定义选择排序方法
  2. {
  3. for (int x = 0; x < arr.length - 1; x++) {
  4. for (int y = x + 1; y < arr.length; y++) {
  5. if (arr[x] > arr[y]) // 满足条件,进行位置置换
  6. {
  7. int temp = arr[x];
  8. arr[x] = arr[y];
  9. arr[y] = temp;
  10. }
  11. }
  12. }
  13. }

(2)、冒泡排序

遍历要排序的数列,依次比较相邻两个元素,如果符合条件,把顺序错误的交换过来,让较大的数往下沉,较小的数往上冒。重复进行直到没有要交换的。

代码实现:

[java] view plain copy

  1. public static void bubbleSort(int[] arr)// 定义冒泡排序方法
  2. {
  3. for (int x = 0; x < arr.length - 1; x++) {
  4. for (int y = 0; y < arr.length - x - 1; y++) // -x:让每一次比较元素减少。-1:避免角标越界。
  5. {
  6. if (arr[y] > arr[y + 1])// 满足条件,进行位置置换
  7. {
  8. int temp = arr[y];
  9. arr[y] = arr[y + 1];
  10. arr[y + 1] = temp;
  11. }
  12. }
  13. }
  14. }

4、数组元素的查找(折半查找)

折半查找也称二分查找,假设表中元素按升序排列,将表中位置的元素与查找的值比较,如果二者相等,则查找成功。否则从中间将表分成前后两个部分,如果中间位置记录的元素大于查找的元素,则查前部分,否则查后部分,重复直到找到或表已查完。

优点是比较次数少,查找速度快,平均性能好;

缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

[java] view plain copy

  1. public class Demo {
  2. public static void main(String[] args) {
  3. int[] arr = { 1, 2, 5, 7, 9, 12, 21, };
  4. // 调用折半查找方法查找元素5的位置
  5. System.out.println("index=" + halfSearch(arr, 5));
  6. System.out.println("index=" + halfSearch(arr, 6));//测试返回-1的情况
  7. }
  8. public static int halfSearch(int[] arr, int key)//arr是已排好的升序数组,返回找到值的下标,返回-1表示没找到。
  9. {
  10. int min, max, mid;
  11. min = 0; // 最小下标
  12. max = arr.length - 1; // 最大下标
  13. mid = (max + min) / 2; // 中间下标
  14. while (arr[mid] != key) {
  15. if (key > arr[mid])
  16. min = mid + 1;
  17. else if (key < arr[mid])
  18. max = mid - 1;
  19. if (min > max) // 如果最小的下标大于最大的下标就说明没有折半可能。
  20. return -1;
  21. mid = (max + min) / 2;
  22. }
  23. return mid;
  24. }
  25. }

5、数组工具类(Arrays)

在java.util包中有一个Arrays工具类,该工具类包含操作数组的各种方法,如查找、排序、搜索等。

如使用Arrays实现数组排序:Arrays.sort(arr);该方法有函数重载,可以提供short、long等其他数据类型的排序。

实际中建议使用该方法,因为简单不容易错,但面试切勿这样写。

三、多维数组。

1、多维数组的含义:多维数组可以简单的理解为在数组中嵌套数组,即数组中的元素还是数组。在程序中比较常见的是二维数组。

2、二维数组的语法定义格式:

(1)、格式一:数据类型[ ][ ] 数组名=new [ 二维数组长度][一维数组长度 ];

(2)、格式二:数据类型[ ][ ] 数组名=new [ 二维数组长度][ ];

(3)、格式三:数据类型[ ][ ] 数组名=new [ ][ ]{{元素1,元素2,..},{元素1,元素2,..},{元素1,元素2,..}......};

或者 数据类型[ ][ ] 数组名={{元素1,元素2,..},{元素1,元素2,..},{元素1,元素2,..}......};

定义格式提醒:数组名可以放在数据类型后面,两个中括号之间以及两个中括号之后。

代码示范上述:

[java] view plain copy

  1. public class Demo {
  2. public static void main(String[] args) {
  3. // 定义了长度为5的二维数组,每个二维数组中的元素又是一个长度为2的一维数组。
  4. int[][] arr1 = new int[5][2];
  5. // 定义了长度为3的二维数组,但数组中的每个元素的长度不确定。
  6. int[][] arr2 = new int[3][];
  7. // 二维数组中定义了三个元素,这三个元素都是数组,分别为{1,2,3},{5,8},{7,3,5}。
  8. // 对二维数组元素的访问也是通过角标的方式,如要访问二维数组中第一个元素数组的第二个元素。
  9. // 代码为:arr3[0][1];
  10. int[][] arr3 = new int[][] { { 1, 2, 3 }, { 5, 8 }, { 7, 3, 5 } };
  11. // 数组名放在这三个位置都可以
  12. int a[][] = new int[1][2];
  13. int[] b[] = new int[1][2];
  14. int[][] c = new int[1][2];
  15. }
  16. }

3、二维数组的遍历

二维数组的遍历同一维数组一样采用循环遍历,不同的是由于数组中还是数组,需要用到循环嵌套。

代码实现:

[java] view plain copy

    1. public class Demo {
    2. public static void main(String[] args) {
    3. int[][] arr = { { 1, 2, 3 }, { 5, 8 }, { 7, 3, 5 } };
    4. for (int i = 0; i < arr.length; i++) {
    5. for (int j = 0; j < arr[i].length; j++) {
    6. System.out.print(arr[i][j]);// 打印元素
    7. }
    8. System.out.println();// 换行
    9. }
    10. }
    11. }
时间: 2024-10-10 12:59:41

Java编程基础-数组的相关文章

Java入门——(1)Java编程基础

Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符:在程序中定义的一些名称. 比如:类名 a-z 0-9 _ $ 数字不可以开头,不可以使用关键字,一般首字母大写. 2.3注释:注解说明程序的文字. 作用:1.对程序进行说明. 2.调试程序. 注意:多行注释可嵌单行注释,但不能嵌套多行注释. /*多行注释*/ /**文档注释*/ //单行注释 /* 需求:写一个

Java编程基础-面向对象(中)

本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一些特性. 1.static关键字的特点: a)随着类的加载而加载,也就是说,静态会随着类的消失而消失,说明它的生命周期最长. b)优先于对象存在,明确一点,静态是先存在的,对象是后存在的. c)被类的所有对象共享. d)可以通过类名调用. 2.静态变量 在一个java类中,可以使用static关键字

Java大神推荐,java编程基础必备(必看)

在没有以前的操作习惯的错误情况下,反而容易接受新知识,所以不要因为自己对java一无所知而自卑,相反,这是菜鸟们的优势,但是如何才能从一个菜鸟历练成大神呢,当然是需要学习了,不学习就想成为大神,就是在做白日梦,所以如果你想改变自己,那么你可以来我们这个交流群来学习521595826,在这里每天都能学到新鲜的知识,想不进步都难,但是如果你是一个不思进取的人,一边凉快去就行.下面来介绍下java编程基础必备知识: 第一步:下载并安装JDK 6.0,安装路径为: C:\java\jdk1.6 . 第二

Java面试求职之Java编程基础

Java编程基础 小编目前大三在读,专业电子系.由于对编程感兴趣还有就是对本专业前途的不乐观,还是勇敢的加入所谓的码农之路.学习Java也有一段时间了,快要放假了,想找家公司实习一下.至目前为止,已经面试了好几家公司了,大的有像腾讯.百度.联想这样的大公司:小的也有只有10几个员工的创业型公司.拿到过offer.也有碰壁连面试机会都没得到的. 下面就是一些对面试官面试时问的问题做的一些总结和自己搜集的一些知识点. Java概述和开发环境 Java开发包的总类            随着Java语

day05&lt;Java语言基础--数组&gt;

Java语言基础(数组概述和定义格式说明) Java语言基础(数组的初始化动态初始化) Java语言基础(Java中的内存分配以及栈和堆的区别) Java语言基础(数组的内存图解1一个数组) Java语言基础(数组的内存图解2二个数组) Java语言基础(数组的内存图解3三个引用两个数组) Java语言基础(数组的初始化静态初始化及内存图) Java语言基础(数组操作的两个常见小问题越界和空指针 Java语言基础(数组的操作1遍历) Java语言基础(数组的操作2获取最值) Java语言基础(数

java编程基础(一)

Java编程基础(一) 1. java基本语法 1.1 Java基本格式 修饰符 class 类名 { 程序代码 } Java严格区分大小写,例如不能将class关键字写成Class, java编译器将不能识别. Java程序中连续的字符串不能分行写:如果想分行写,可以写成两个字符串,中间用+号连接即可. 每一语句以分号结尾. 1.2 java注释 1.2.1 功能: 增加代码可读性,方便阅读,它只在源文件中有效,编译时编译器会忽略这些信息,不会将其编译到class文件中. 1.2.2 分类 注

【搬砖】安卓入门(4)- Java开发编程基础--数组

05.01_Java语言基础(数组概述和定义格式说明)(了解) A:为什么要有数组(容器) 为了存储同种数据类型的多个值 B:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. C:数组定义格式 数据类型[] 数组名 = new 数据类型[数组的长度]; 05.02_Java语言基础(数组的初始化动态初始化)(掌握) A:什么是数组的初始化 就是为数组开辟连续的内存空间,并为每个数组元素赋予值 B:如何对数组进行初始化

java 编程基础

临近毕业,准备复习一些java的基础,顺便整理一下知识 编程基础 1.Java的特性和优势:简单.面向对象可移植( write once ,run anywhere ).高性能 ,分布式.动态性多线程安全健壮. 2.Java的运行机制, 计算高级编程语言类型有:编译型.解释型. Java语言是这两种类型的结合,利用编辑器写 Java源程序 -- 源文件名 :主类名.java,利用编译器(javac )将源程序编译 成字节码 -- 字节码文件名 :源文件名.class,再利用虚拟机 (解释器,即

5th Java语言基础(数组)

05.01_Java语言基础(数组概述和定义格式说明)(了解) A:为什么要有数组(容器) 为了存储同种数据类型的多个值 B:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. C:数组定义格式 数据类型[] 数组名 = new 数据类型[数组的长度]; 05.02_Java语言基础(数组的初始化动态初始化)(掌握) A:什么是数组的初始化 就是为数组开辟连续的内存空间,并为每个数组元素赋予值 B:如何对数组进行初始化