Java中数组的使用与注意事项详解(推荐)

目录
  • 一.初始数组
  • 二.数组的创建
  • 三.使用数组时的注意事项
    • (1)初始化问题
    • (2)数组长度的使用
    • (3)有关数组长度的问题
    • (4)对于数组的访问
    • (5)数组的遍历
  • 三.数组的类型
    • 1、每个部分数据区的概念:
    • 2.数组在JVM当中的使用情况
    • 3.引用类型的注意事项
  • 四.关于引用类型的返回值
  • 总结

一.初始数组

数组的概念:数组就是一个用来存储相同类型数据的一个容器。

为什么要使用数组?

当我们要存储大量相同类型的时候,通过配合循环来使用就会大量减少代码复杂程度

数组的特点:

(1)数组是一种引用类型.

(2)数组的长度是固定的.

(3)数组中每个元素的类型都是相同的.

二.数组的创建

对于数组的创建,这里和c/c++还是有些不同的,这里创建数组的方法共有三种方法,下面就以数组里面元素为int类型,数组大小为5的举例,如下所示:

(1) 静态初始化

int[] arr = {1,2,3,4,5}

int[] arr = new int[]{1,2,3,4,5};

(2)动态初始化

int[] arr = new int[5];

在这里对于数组的初始化,千万要注意下面这种情况是错误的初始化

int[] arr = new int[5]{1,2,3,4,5};

在这里是不能同时初始化两次,这样会编译不通过,出现错误。

三.使用数组时的注意事项

(1)初始化问题

在创建数组后,如果没有进行赋初值,Java会默认对数组进行初始化,这里对于每种类型的初始值都有不同。

数据类型 默认初始值
byte 0
short 0
int 0
long 0
float 0.0
double 0.0
char ‘\u0000'
String null
boolean false

(2)数组长度的使用

在Java中,可以直接调用Java中自带的方法来求得数组的长度,使用的方法为

数组名.length

        String[] f= new String[5];
        int len = f.length;
        System.out.println(len);//5

(3)有关数组长度的问题

对于数组的长度来说,在进行开辟数组空间的时候就已经确定了,但是在数组长度定义的问题上这里和c/c++有不同的区别,在Java中可以使用变量来进行数组的初始化,例如下面的代码,在Java中是被允许的。

int size = 10;
int[] arr = new int[size];

(4)对于数组的访问

数组的索引相当于门牌号,对每一个元素来说都有对应的位置,如果要进行访问就需要使用指定的索引位置来进行访问

对于数组的访问范围为[0,arr.length),左开右闭的区间范围

但是使用这样的方法来进行访问数组中的每一个元素比较麻烦,下来有一种简单的方法来进行数组的遍历与访问每一个元素

(5)数组的遍历

方法1:

使用普通的for循环来进行来进行访问每一个元素

方法2:

使用增强的for循环来进行遍历数组的每一个元素,相当于对数组的拷贝

两种方法的区别:

在遍历数组的时候,两种方法是没有任何区别的,但是在进行改变数组元素值的时候方法1就可以直接进行数组元素的改变,但是方法2对于基本数据类型的数组是没法来进行改变的。

例题:

给一个数组的每一个元素都乘以2,这里只能用方法1来进行改变,代码如下:

   //改变数组中的值
    public static void transformArr(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            arr[i] *=2;
        }
    }

三.数组的类型

关于类型来分,共有两种类型,一种是基本数据类型一种是引用数据类型

两种类型的概念和区别

基本数据类型:基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值。

引用数据类型:引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

在Java中,数组的数据类型是引用数据类型,那么数组是如何进行使用和分配空间的,首先我们需要知道jvm的内存分布

分布图如下所示:

1、每个部分数据区的概念:

(1) 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址。

(2)虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。

(3)本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的。

(4)堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象一般在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁

(5)方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. 方法编译出的的字节码就是保存在这个区域

在数组这里我们只需要知道虚拟机栈和堆就可以了

2.数组在JVM当中的使用情况

在这里以使用数组交换两个数来了解数组在虚拟机是如何运行的

(1)代码:

public class Demo{
    public static void swap(int[] a){
        int tmp = a[0];
        a[0] = a[1];
        a[1] = tmp;
    }
    public static void main(String[] args) {
        int[] arr = {1,2};
        System.out.println("-----交换前------");
        System.out.println(Arrays.toString(arr));
        swap(arr);
        System.out.println("-----交换后------");
        System.out.println(Arrays.toString(arr));
    }
}

(2)运行结果:

(3)在虚拟机中的运行步骤

交换前执行的结果:

数组开辟的空间是在堆中进行开辟,但是在栈中相当于存储的是数组的首地址,所以在上面例子中,交换的是引用类型中的值,所以能够进行交换原来数组中值。

3.引用类型的注意事项

在使用引用类型数组的时候我们要注意我们改变的是引用类型中的引用还是引用类型中的内容。

在上面的值交换中,我们改变的是引用类型中的内容,那么接下来我们举个例子来说明一下改变引用类型的引用

代码如下:

改变数组中的值

public class Demo{
    public static void chaArr(int[] a){
        int[] b= new int[3];
        a = b;
        a[0]=100;
        a[1] = 200;
    }
    public static void main(String[] args) {
        int a[] = {10,20};
        System.out.println("改变前--------");
        System.out.println(Arrays.toString(a));
        chaArr(a);
        System.out.println("改变后--------");
        System.out.println(Arrays.toString(a));
    }
}

运行结果:

我们可以发现,在chaArr()方法中我们改变的值在数组中没有发生变化,这是为什么,这是因为,我们在chaArr()中将a的引用地址进行了改变,之后操作的是新创建的数组b中的结果,所以a中的结果没有发生改变,图示如下:

所以在使用数组时要注意是否在中间发生了引用地址的改变。

四.关于引用类型的返回值

在之前学过的返回值都是基本数据类型中的返回值,在学过数组之后,我们知道引用类型也有返回值,接下来我使用返回值来求一个存放斐波那契数列结果的数组,如果所需要的数组大小<=0,则返回null,否则返回一个数组。

代码如下:

public class Demo{

   //返回一个斐波纳契数列的数组
    public static int[] fibArr(int n){
        if(n<=0){
            return null;
        }
        int[] fiArr = new int[n];
        fiArr[0] = 1;
        if(n==1){
         return fiArr;
        }
        fiArr[1] = 1;
        for(int i=2;i<n;i++){
            fiArr[i]=fiArr[i-1]+fiArr[i-2];
        }
        return fiArr;
    }
    public static void main(String[] args) {

        System.out.println(Arrays.toString(fibArr(10)));

    }
}

前10项的输出结果如下:

总结

到此这篇关于Java中数组的使用与注意事项的文章就介绍到这了,更多相关Java数组使用与注意内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中对象数组的使用方法详解

    本文实例讲述了Java中对象数组的使用方法.分享给大家供大家参考,具体如下: 一 点睛 对象可以用数组来存放,通过下面两个步骤来实现. 1 声明以类为数据类型的数组变量,并用new分配内存空间给数组. 2 用new产生新的对象,并分配内存空间给它. 下面介绍4种方式来定义对象数组 方式一:静态方式 Person p1[] = { new Person(), new Person(), new Person() }; 方式二:动态初始化化 Person p2[]; p2 = new Person[

  • Java使用选择排序法对数组排序实现代码

    编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象:使用JTextArea的setText()方法清空文本域:创建一个整型一维数组,分配长度为10的空间:初始化数组元素,使用Random类的nextInt()方法生成50以内的随机数,使用JTextArea类的append()方法把数组元素显示在文本域控件中:点击"排序"按钮,使用JTextArea类的setText()方法清空

  • java中数组的定义及使用方法(推荐)

    数组:是一组相关变量的集合 数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组.二维数组.多维数组 数据的有点 不使用数组定义100个整形变量:int i1;int i2;int i3 使用数组定义 int i[100]; 数组定义:int i[100];只是一个伪代码,只是表示含义的 一维数组 一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的, 使用java数组,必须经过两个步骤,声明数组和分配内存给该数组, 声明形式一 声明一维数组:数据类型

  • java使用数组和链表实现队列示例

    (1)用数组实现的队列: 复制代码 代码如下: //先自己定义一个接口  public interface NetJavaList {    public void add(Student t);    //继承该接口的类必须实现的方法    public Student get(int index);//队列的加入,取出,队列的大小    public int size(); } 定义一个学生类 复制代码 代码如下: class Student {      private String na

  • 关于JAVA 数组的使用介绍

    JAVA数组与容器类主要有三方面的区别:效率.类型和保存基本类型的能力.在JAVA中,数组是一种效率最高的存储和随机访问对象引用序列的方式.数组就是一个简单的线性数列,这使得元素访问非常快速.但是为此付出的代价却是数组的大小被固定,并且在其生命周期中不可改变. 由于范型和自动包装机制的出现,容器已经可以与数组几乎一样方便地用于基本类型中了.数组和容器都可以一定程度上防止你滥用他们,如果越界,就会得到RuntimeException异常.数组硕果仅存的优势便是效率,然而,如果要解决更一般化的问题,

  • 实例讲解Java编程中数组反射的使用方法

    什么是反射 "反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为."这个概念常常会和内省(Introspection)混淆,以下是这两个术语在Wikipedia中的解释: 内省用于在运行时检测某个对象的类型和其包含的属性: 反射用于在运行时检测和修改某个对象的结构及其行为. 从它们的定义可以看出,内省是反射的一个子集.有些语言支持内省,但并不支持反射,如C++. 内省示例:instanceof 运算符用于检测某个对象是否属于特定的类. if (obj inst

  • Java中遍历数组使用foreach循环还是for循环?

    从JDK1.5起,增加了新功能Foreach,它是for循环遍历数据的一种简写形式,使用的关键字依然是for,但参数格式不同.其详细用法为: for(Type e:collection){ //对变量e的使用} 参数说明: e:其类型Type是集合或数组中元素值的类型,该参数是集合或数组collection中的一个元素. collections: 要遍历的集合或数组,也可以是迭代器. 在循环体中使用参数e,该参数是foreach从集合或数组以及迭代器中取得的元素值,元素值是从头到尾进行遍历的.

  • Java二维数组简单定义与使用方法示例

    本文实例讲述了Java二维数组简单定义与使用方法.分享给大家供大家参考,具体如下: Java的二维数组是先创建一个一维数组,然后该数组的元素再引用另外一个一维数组.在使用二维数组的时候,通过两个中括号[]来访问每一层维度的引用,直到访问到最终的数据. public class MultiDimArray{ /** * @param args */ public static void main(String[] args) { int[][] arr = new int[3][]; arr[0]

  • Java中使用数组实现栈数据结构实例

    栈是Java语言中最重要的数据结构之一,它的实现,至少应该包括以下几个方法: 1.pop() 出栈操作,弹出栈顶元素. 2.push(E e) 入栈操作 3.peek() 查看栈顶元素 4.isEmpty() 栈是否为空 另外,实现一个栈,还应该考虑到几个问题: 1.栈的初始大小以及栈满以后如何新增栈空间 2.对栈进行更新时需要进行同步 简单示例,使用数组实现栈,代码如下: 复制代码 代码如下: public class Stack<E> { // Java 不支持泛型数组,如需使用,请使用J

  • Java中数组的使用与注意事项详解(推荐)

    目录 一.初始数组 二.数组的创建 三.使用数组时的注意事项 (1)初始化问题 (2)数组长度的使用 (3)有关数组长度的问题 (4)对于数组的访问 (5)数组的遍历 三.数组的类型 1.每个部分数据区的概念: 2.数组在JVM当中的使用情况 3.引用类型的注意事项 四.关于引用类型的返回值 总结 一.初始数组 数组的概念:数组就是一个用来存储相同类型数据的一个容器. 为什么要使用数组? 当我们要存储大量相同类型的时候,通过配合循环来使用就会大量减少代码复杂程度 数组的特点: (1)数组是一种引

  • Java中对List集合的常用操作详解

    目录: 1.list中添加,获取,删除元素: 2.list中是否包含某个元素: 3.list中根据索引将元素数值改变(替换): 4.list中查看(判断)元素的索引: 5.根据元素索引位置进行的判断: 6.利用list中索引位置重新生成一个新的list(截取集合): 7.对比两个list中的所有元素: 8.判断list是否为空: 9.返回Iterator集合对象: 10.将集合转换为字符串: 11.将集合转换为数组: 12.集合类型转换: 备注:内容中代码具有关联性. 1.list中添加,获取,

  • Java 中HttpURLConnection附件上传的实例详解

    Java 中HttpURLConnection附件上传的实例详解 整合了一个自己写的采用Http做附件上传的工具,分享一下! 示例代码: /** * 以Http协议传输文件 * * @author mingxue.zhang@163.com * */ public class HttpPostUtil { private final static char[] MULTIPART_CHARS = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJK

  • java中压缩文件并下载的实例详解

    当我们对一些需要用到的资料进行整理时,会发现文件的内存占用很大,不过是下载或者存储,都不是很方便,这时候我们会想到把文件变成zip格式,即进行压缩.在正式开始压缩和下载文件之前,我们可以先对zip的格式进行一个了解,然后再就具体的方法给大家带来分享. 1.ZIP文件格式 [local file header + file data + data descriptor]{1,n} + central directory + end of central directory record 即 [文件

  • Java中的重要核心知识点之继承详解

    目录 一.继承 1.概念 2.语法 3.父类成员的访问 (1)子类中访问父类成员变量 (2)子类中访问父类成员方法 4.super关键字 5.子类构造方法 6.super和this 7.代码块执行顺序 8.父类成员在子类中的可见性 9.继承方式 10.final关键字 11.组合 一.继承 1.概念 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类.继承呈现了面向对象程序设计的

  • Java中Validated、Valid 、Validator区别详解

    目录 1. 结论先出 JSR 380 Valid VS Validated 不同点? Validator 2. @Valid和​​​​​​​@Validated 注解 3. 例子 4.使用@Valid嵌套校验 5. 组合使用@Valid和@Validated 进行集合校验 6. 自定义校验 自定义约束注解 工作原理 结论 参考链接: 1. 结论先出 Valid VS Validated 相同点 都可以对方法和参数进行校验 @Valid和@Validated 两种注释都会导致应用标准Bean验证.

  • Java中实现List分隔成子List详解

    目录 前言 一 ListUtils.partition 方法 二  Lists.partition 方法 三 源码分析 四 性能对比 总结 前言 在工作中经常遇到需要将数组分割成多个子数组,然后进行批量处理的需求.那有没有比较优雅的实现呢? 经过多次实践,总结出 ListUtils.partition 和 Lists.partition 两种较好实现 .下面对这两种实现分别进行说明. 一 ListUtils.partition 方法 1.1 引入依赖 <dependency> <grou

  • java中String StringBuffer和StringBuilder的区别详解

    目录 从声明定义上来谈 从结构上来谈 从线程安全来谈 总结 从声明定义上来谈 只有String 可以 直接声明创建 而 StringBuffer 与 StringBuilder 必须去new对象 这是因为只有String会在这种声明方式下去字符串常量池创建,其他则没有 StringBuffer stf = new StringBuffer("abc"); StringBuilder stb = new StringBuilder("abc"); StringBuff

  • Java中Prime算法的原理与实现详解

    目录 Prim算法介绍 1.点睛 2.算法介绍 3. 算法步骤 4.图解 Prime 算法实现 1.构建后的图 2.代码 3.测试 Prim算法介绍 1.点睛 在生成树的过程中,把已经在生成树中的节点看作一个集合,把剩下的节点看作另外一个集合,从连接两个集合的边中选择一条权值最小的边即可. 2.算法介绍 首先任选一个节点,例如节点1,把它放在集合 U 中,U={1},那么剩下的节点为 V-U={2,3,4,5,6,7},集合 V 是图的所有节点集合. 现在只需要看看连接两个集合(U 和 V-U)

  • Java中的Collections类的使用示例详解

    Collections的常用方法及其简单使用 代码如下: package Collections; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Stack; public class collections { public static void main(String[]args){ int array[]={125,75,56,7}; Li

随机推荐