如果我们有一组类型相同的变量。例如,5位同学的成绩,可以这么写

  1. public class Main {
  2. public static void main(String[] args) {
  3. // 5位同学的成绩:
  4. int n1 = 68;
  5. int n2 = 79;
  6. int n3 = 91;
  7. int n4 = 85;
  8. int n5 = 62;
  9. }
  10. }

  但其实没有必要定义5个int变量。可以使用数组来表示一组int类型。代码如下

  1. public class Main {
  2. public static void main(String[] args) {
  3. // 5位同学的成绩:
  4. int[] ns = new int[5];
  5. ns[0] = 68;
  6. ns[1] = 79;
  7. ns[2] = 91;
  8. ns[3] = 85;
  9. ns[4] = 62;
  10. }
  11. }

  定义一个数组类型的变量,使用数组类型“类型[]”,例如,int[]。和单个基本类型变量不同,数组变量初始化必须使用new int[5]表示创建一个可容纳5个int元素的数组。

  Java的数组有几个特点:

  • 数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false
  • 数组一旦创建后,大小就不可改变。

  要访问数组中的某一个元素,需要使用索引。数组索引从0开始,例如,5个元素的数组,索引范围是0~4

  可以修改数组中的某一个元素,使用赋值语句,例如,ns[1] = 79;

  可以用数组变量.length获取数组大小:

  1. public class Main {
  2. public static void main(String[] args) {
  3. int[] ns = new int[5];
  4. System.out.println(ns.length);
  5. }
  6. }

  数组是引用类型,在使用索引访问数组元素时,如果索引超出范围,运行时将报错

  1. public class Main {
  2. public static void main(String[] args) {
  3. int[] ns = new int[5];
  4. System.out.println(ns[5]);
  5. }
  6. }

  报错如下

  1. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
  2. at Main.main(Main.java:4)

  也可以在定义数组时直接指定初始化的元素,这样就不必写出数组大小,而是由编译器自动推算出数组大小。例如

  1. public class Main {
  2. public static void main(String[] args) {
  3. int[] ns = new int[] {68,79,91,85,62};
  4. System.out.println(ns.length);
  5. }
  6. }

  还可以进一步简写为

  1. int[] ns = { 68, 79, 91, 85, 62 };

  注意数组是引用类型,并且数组大小不可变。我们观察下面的代码:

  1. public class Main {
  2. public static void main(String[] args) {
  3. // 5位同学的成绩:
  4. int[] ns;
  5. ns = new int[] { 68, 79, 91, 85, 62 };
  6. System.out.println(ns.length); // 5
  7. ns = new int[] { 1, 2, 3 };
  8. System.out.println(ns.length); // 3
  9. }
  10. }

  输出

  1. 5
  2. 3

  数组大小变了吗?看上去好像是变了,但其实根本没变。

  对于数组ns来说,执行ns = new int[] { 68, 79, 91, 85, 62 };时,它指向一个5个元素的数组:

  执行ns = new int[] { 1, 2, 3 };时,它指向一个新的3个元素的数组:

  但是,原有的5个元素的数组并没有改变,只是无法通过变量ns引用到它们而已。

  字符串数组

  如果数组元素不是基本类型,而是一个引用类型,那么修改数组元素会有哪些不同?

  字符串是引用类型,远程我们先定义一个字符串数组

  1. String[] names={
  2. "ABC","XYZ","zoo"
  3. };

  对于String[]类型的数组变量names,它实际上包含3个元素,但每个元素都指向某个字符串对象:

  对names[1]进行赋值,例如names[1]="cat";效果如下

  这里注意到原来names[1]指向的字符串"XYZ"并没有改变,仅仅是将names[1]的引用从指向"XYZ"改成了指向"cat",其结果是字符串"XYZ"再也无法通过names[1]访问到了。

  对指向有了更深入的理解后,试解释如下代码

  1. public class Main {
  2. public static void main(String[] args) {
  3. String[] names = {"ABC", "XYZ", "zoo"};
  4. String s = names[1];
  5. names[1] = "cat";
  6. System.out.println(s); // s是"XYZ"还是"cat"?
  7. }
  8. }

  是XYZ因为赋值时names[1]为XYZ赋值以后的指向变成了cat

  小结

  数组是同一数据类型的集合,数组一旦创建后,大小就不可变;

  可以通过索引访问数组元素,但索引超出范围将报错;

  数组元素可以是值类型(如int)或引用类型(如String),但数组本身是引用类型;

Java之数组类型的更多相关文章

  1. Java 字节数组类型(byte[])与int类型互转

    代码如下: public class CommonUtils { //高位在前,低位在后 public static byte[] int2bytes(int num){ byte[] result ...

  2. java中用spring实现数组类型输出

    java 中的几个数组类型 1.Department类 package com.yy.collection; import java.util.List; import java.util.Map; ...

  3. Android java传递int类型数组给C

    接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...

  4. 在java 中,数组与 List<T> 类型的相互转换

    在java中,数组与List<T> 之前进行互相转换,转换方法可总结为以下几种: 一. 将 数组转换成List<T> 1. 使用 Collections 的addAll 方法 ...

  5. JAVA面向对象-----值交换(基本数据类型 数组类型 对象的值 字符串的)

    JAVA面向对象-–值交换 基本数据类型交换 数组类型交换 对象的值交换 字符串的值交换 恩,没错,又是贴图,请大家见谅,我也是为了多写几个文章,请大家谅解. 字符串的值交换: 交换值失败. 这个文章 ...

  6. java 实现往oracle存储过程中传递array数组类型的参数

    注:本文来源于 <  java 实现往oracle存储过程中传递array数组类型的参数  >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...

  7. Java 方法重载与引用数组类型

    1.方法重载  1)方法的签名 方法的签名包含方法名和参数列表 一个类中,不可以有两个方法的签名完全相同,即一个类中不能有两个方法的方法名和参数列表都一样. public class Test{ pu ...

  8. java 各基本类型转 bytes 数组

    java 将 基本类型转byte[] 数组时,需考虑大端小端问题 1. 大端格式下,基本类型与byte[]互转 BigByteUtil.java package com.ysq.util; impor ...

  9. 深度解析Java可变参数类型以及与数组的区别

    注意:可变参数类型是在jdk1.5版本的新特性,数组类型是jdk1.0就有了. 这篇文章主要介绍了Java方法的可变参数类型,通过实例对Java中的可变参数类型进行了较为深入的分析,需要的朋友可以参考 ...

随机推荐

  1. jmeter 测试带token的请求

    https://blog.csdn.net/wd1282988143/article/details/88048114 如果有一个登录接口需要服务端返回参数,再带着这个参数去请求才能完成登录,请问jm ...

  2. Gym - 247731E :room(最小费用流裸题)

    题意:有N个宿舍(N<200),给出第一年每个宿舍有哪4个同学.现在给出N个4元组y[][4],表示这4个人想住一起,问最少多少人需要换宿舍. 思路:费用流,每个4元组y[]到每个宿舍连边,流量 ...

  3. python基础语法3 元组,字典,集合

    元组: ========================元组基本方法===========================用途:存储多个不同类型的值定义方式:用过小括号存储数据,数据与数据之间通过逗号 ...

  4. HDFS的读写流程

    1.2. 客户端向NameNode发起创建文件的请求,在NameNode上创建一个文件名,并且返回一个输出流 3.客户端向输出流发起写入数据的请求 4.输出流向NameNode请求写数据,NameNo ...

  5. TCP滑动窗口(发送窗口和接受窗口)

    TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...

  6. 地址栏参数获取函数 GetQueryStr(name)

    //name:参数名称,return:有则返回该参数对应值,没有则返回null function GetQueryStr(name) {          var reg = new RegExp(& ...

  7. 协程 和 async await

    协程, 是 为了 避免 闭包传递变量 的 性能损耗 而产生  . 如果不是 为了 避免 闭包传递变量 的 性能损耗 ,    线程池 和 Task 已经够了,  不需要 再设计 出 协程 来  . 闭 ...

  8. 20101010 exam

    目录 2018 10.10 exam 解题报告 T1:LOJ #10078 新年好 题目描述(原题来自:CQOI 2005): 输入格式: 输出格式: 样例输入: 样例输出: 数据范围与提示: 思路: ...

  9. nginx 日志之 access_log格式

    Nginx访问日志可以设置自定义的格式,来满足特定的需求. 示例: 示例1 log_format combined_realip '$remote_addr $http_x_forwarded_for ...

  10. 【POJ3278】Catch That Cow

    本题传送门 本题知识点:宽度优先搜索 题意很简单,我们把FJ与奶牛看作是在一条数轴上的点,奶牛固定在K点,FJ的移动有三种,分别是向前一格,向后一格以及跳到当前格的两倍去.问FJ花费最少的时间到达奶牛 ...