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

public class Main {
public static void main(String[] args) {
// 5位同学的成绩:
int n1 = 68;
int n2 = 79;
int n3 = 91;
int n4 = 85;
int n5 = 62;
}
}

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

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

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

  Java的数组有几个特点:

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

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

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

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

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

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

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

  报错如下

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

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

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

  还可以进一步简写为

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

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

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

  输出

5
3

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

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

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

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

  字符串数组

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

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

String[] names={
"ABC","XYZ","zoo"
};

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

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

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

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

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

  是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. TabBar 设置可滚动:isScrollable: true

    appBar: AppBar( bottom: TabBar( // 设置可滚动 isScrollable: true, controller: _tabController, tabs: tabs. ...

  2. python 查询文件存放地址

    import os, time import sys import re def search(path,name): for root, dirs, files in os.walk(path): ...

  3. 前段大数据传输 压缩解压 pako

    我已经找到了解决的办法:用pako.inflate(); 在页面引入链接即可调用pako

  4. django-支付宝支付

    安装python-alipay-sdk pip install python-alipay-sdk --upgrade 配置 视图函数orders/views.py # 订单支付 # /order/p ...

  5. vim命令(转)

    1.Linux下创建文件 vi test.txt 或者 vim test.txt 或者 touch test.txt 2.vi/vim 使用 基本上 vi/vim 共分为三种模式,分别是命令模式(Co ...

  6. speedscope + node inspect 分析node应用调用

    生成一个简单的express 项目 使用脚手架工具 npm install -g express-generator@4 express . 启动使用inspect命令 node --inspect ...

  7. 一些开源的dashboard 解决方案

    简单收集了以下开源dashboard 的项目,记录下 plotly-dash 基于python 的dash 开发工具,很不错 项目地址 https://github.com/plotly/dash k ...

  8. 【数论】[涨姿势:同余]P2312解方程

    题目描述 已知多项式方程:\(a_0 + a_1x + a_2x^2+...+a_nx^n = 0\) 求这个方程在[1,m]内的整数解 \(1\leq n\leq100,|a_i|\leq 10^{ ...

  9. Executors.newSingleThreadScheduledExecutor() 问题

    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); service.scheduleWit ...

  10. 某邀请赛misc key阉割发行版

    目录 题目下载 提示 解题过程 1.提取RGB值 2.找到key 3.循环异或,得到flag 反思 题目下载 题目名:key 提示 提取钥匙中特殊颜色的RGB循环异或KEY值 解题过程 1.提取RGB ...