今天在刷Java题的时候,写惯了C++发现忘记了Java数组的操作,遂把以前写的文章发出来温习一下。

首先,数组有几种创建方式?

Java程序中的数组必须先进行初始化才可以使用,所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值,而在Java中,数组是静态的,数组一旦初始化,长度便已经确定,不能再随意更改。

声明数组变量

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

dataType[] arrayRefVar;   // 首选的方法

或

dataType arrayRefVar[];  // 效果相同,但不是首选方法 c++沿用

但是以上只是声明了数组,并不能直接使用,因为没有为其分配内存空间,此时必须初始化。

例如以下代码在Java8中就会报错

public class test{
public static void main(String[] arg) {
int[] a;
a[0]= 1;
System.out.println(a[0]);
}
}
// 系统将报错 局部变量 a 可能尚未初始化
// 进一步加入我个人的理解,声明的数组没有确定大小,没有办法分配内存空间,所有必须初始化
// 但是以下代码在Java中是禁止的
public class test{
public static void main(String[] arg) {
int[10] a;
a[0]= 1;
System.out.println(a[0]);
}
}
// 系统将报错 标记“10”上有语法错误,删除此标记
// 不能像c++这样初始化数组

所以,我们拥有两种初始化数组的方式

  1. 静态初始化:由程序猿自己确定每个数组元素的初始值,而数组的长度则由系统自己决定,例如:
int[] a = {1,2,3,4,5};
System.out.println(a.length);
// 第二行代码可以看出,数组拥有类的性质,可以用dot访问其变量
// 第一行代码静态初始化了数组整型数组a,赋予其固定的长度,系统可以为其分配空间
  1. 动态初始化:初始化时由程序猿确定数组的长度,而没一个数组元素的值,则由系统来分配初始值,例如:
int[] b=new int[5];
System.out.println(b[0]);
// 很明显,数组就是类

数组一定要初始化吗?所谓的对数组初始化究竟是对什么初始化?是数组变量本身吗?

答案看上去肯定是一定要,但是我在实践中发现却是不一定需要,要想搞清楚这个问题,我们需要理解数组变量数组对象的区别。而在认识他们之前需要先了解Java的数据类型。Java的数据类型分为两种,基本数据类型引用数据类型

基本数据类型有八种:byte,short,int,long,float,double,boolean,char。只需要知道基本数据类型变量包含一个值,这个值的类型与变量相对应。

引用数据类型:引用型变量的值与基本类型变量不同,变量值是指向内存空间的引用(地址)。所指向的内存中保存着变量所表示的一个值或一组值。这和C++中的指针很相似,事实上Java语言中的引用实际上就是指针,是指向一个对象的内存地址。Java所说的不支持指针只是不支持指针的计算,但是指针类型被保留了下来,并称为引用类型。声明引用数据类型后,不可以直接使用,还需要实例化在堆内存中开辟内存空间。

数组变量是一个引用类型的变量,数组变量是指向堆内存当中的数组对象,并不是数组本身。当改变一个数组变量所引用的数组,就可以造成数组长度可变的假象。实际上数组对象本身的长度本没有变化,只是数组变量指向了一个新的数组对象。

所以对于数组变量来说,他并不需要初始化,我们常说的初始化其实是初始化数组对象而非数组变量,有时候我们不进行初始化,而让数组变量指向一个有效的数组对象,数组也可以使用,例如:

int[] a = {0,1,2,3,4};
int[] b;
b = a;
System.out.println(b[1]);
// 输出结果为 1
b[1] = 99;
System.out.println(a[1]);
// 输出结果为 99
我自己的理解是,Java的数组就是一个对象。初始化数组的最好办法就是new一个。
  • 数组的增强循环(也可用于其他集合)

    Java增强循环语句如下:

    for(声明语句:表达式){
    // 代码
    }
    // 冒号可以理解为"in"

    声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等(而不是数组的下标!!)。

    表达式: 表达式是要访问的数组名,或者是返回值为数组的方法。

    实例

    public class Test {
    public static void main(String args[]){
    int [] numbers = {10, 20, 30, 40, 50}; for(int x : numbers ){
    System.out.print( x );
    System.out.print(",");
    }
    System.out.print("\n");
    String [] names ={"James", "Larry", "Tom", "Lacy"};
    for( String name : names ) {
    System.out.print( name );
    System.out.print(",");
    }
    }
    }

    输出结果

    10,20,30,40,50,
    James,Larry,Tom,Lacy,

    我们回头理解其执行顺序:

    1. 创建名为x的integer变量
    2. 将numbers的第一个元素赋值给x
    3. 执行大括号内的代码
    4. 赋值给下一个元素x
    5. 重复执行至所有的元素都被运行

Java的变量类型

  • Java中有三种变量类型

    • 类变量:独立于方法之外的变量,用static修饰
    • 实例变量:独立于方法之外的变量,不过没有static修饰
      • 类的每个对象特定的变量也是实例对象(顾名思义)
    • 局部变量:类的方法中的变量
public class variable{
static int a = 0; // 类变量 String str = "Java is easy to learn."; // 实例变量 实例变量声明在类内而不是方法中 public void method{
int b = 1; // 局部变量 局部变量是声明在方法中的
// 局部变量在使用前必须初始化
int x;
int z = x + 1; // 这就是错误的代码,无法编译
}
}

声明与初始化变量类型

  • 实例变量永远会有默认值。如果没有明确的赋值给实例变量,或者没有调用setter,实例变量仍有默认值。

    • integers 0
    • floating points 0.0
    • Booleans false
    • references null
  • 局部变量没有默认值

Java数组的声明与创建的更多相关文章

  1. java数组的声明、创建和遍历

    一.数组的声明.创建 1.一维数组 先是声明 dataType[] arrayRefVar; // 首选的方法 数据类型[] 数组名; dataType arrayRefVar[]; // 效果相同, ...

  2. Java数组的声明和遍历

    Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 n ...

  3. Java 数组的三种创建方法,数组拷贝方法

    public static void main(String[] args) {//创建数组的第一种方法int[] arr=new int[6];int intValue=arr[5];//Syste ...

  4. java数组的声明由几种方式

    数组的声明由几种方式: 1,String []a = new String[length];再赋值 a[0]=?;....... 2,new完就直接初始化: String []a = new Stri ...

  5. Java数组01——声明创建、赋值及特点

    数组声明创建 数组的四个基本特点 例子  package array; ​ public class ArrayDemon01 {     //变量的类型   变量的名字   = 变量的值     / ...

  6. Day007 数组的声明与创建

    数组 数组的定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组声 ...

  7. Java 数组的三种创建方法

    public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intValue=arr[5]; //S ...

  8. Java 数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100 ...

  9. Java 13 - Java 数组

    Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如num ...

随机推荐

  1. django setting文件那些事

    1.设置语言.时区 2.设置新建的用户表作为默认用户表 3.利用apps文件夹收纳app 新建python package apps,然后把app放在该文件夹下 然后setting中添加如下代码: 4 ...

  2. 蓝牙技术 A2DP AVRCP BlueZ

    BlueZ 做为 linux 标准的协议栈,提供非常多的 profile ,各种的支持,ble , 蓝牙网络,文件传输,a2dp 音频传输. A2DP——Advanced Audio Distribu ...

  3. iNeuOS工业互联平台,开放设备驱动管理、服务驱动管理、云组态自定义画布等,促进平台开放、赋能和落地。发布:v2.3版本。

    目       录 1.      概述... 2 2.      iNeuOS平台演示... 2 3.      设备驱动管理... 2 4.      服务驱动管理... 3 5.      云组 ...

  4. Ajax的封装,以及利用jquery的ajax获取天气预报

    1.Ajax的封装 function ajax(type,url,param,sync,datetype,callback){//第一个参数是获取数据的类型,第二个参数是传入open的url,第三个是 ...

  5. scrapydweb的初步使用(管理分布式爬虫)

    https://github.com/my8100/files/blob/master/scrapydweb/README_CN.md 一.安装配置 1.请先确保所有主机都已经安装和启动 Scrapy ...

  6. Ubuntu的BEEP去哪里了?

    一直知道ubuntu的beep不响应了,但是一直都没太关注过它怎么了. 今天关注了一下,发现网上都是在问怎么关掉它的,时间还是在07年左右. 搜索到了一些帖子,有一些是说没有找到恢复的方法,还有一些, ...

  7. vunlhub-DC-1-LinuxSuid提权

    将靶场搭建起来 桥接看不到IP 于是用masscan 进行C段扫描 试试80 8080 访问之后发现是个drupal 掏出msf搜索一波 使用最近年限的exp尝试 exploit/unix/webap ...

  8. hdu1171kmp果题

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1711/ #include<bits/stdc++.h> using namespace std; t ...

  9. 题解 P1002 【过河卒】

    正文 简单描述一下题意: 士兵想要过河,他每一次可以往下走一格,也可以往右走一格,但马一步走到的地方是不能走的,问走到\(n\)行,\(m\)列有多少种走法 我们显然应该先根据马的位置将不能走的格子做 ...

  10. Prism 源码解读2-View的加载和控制

    介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制. 4.ViewDiscovery 在创建好Region后需要将View添加到Region中. ...