java中的数组初始化赋初值方式

目录
  • java数组初始化赋初值
    • 方法一
    • 方法二
    • 方法三
  • 数组互相赋值方式
    • 使用for循环
    • 使用Object的clone()
    • 使用System的静态方法arraycopy()

java数组初始化赋初值

方法一

int[] vis1;//声明未初始化 
    vis1=new int[100];//定义占用空间大小(100个int)
    for(int i=1;i<=5;i++)
    {
        vis1[i]=i;//进行赋值
    }
    for(int i=1;i<100;i++)
    {
        System.out.print(vis1[i]+" ");//输出,未赋值的为0
    }
    System.out.println(vis1.length);//输出vis1数组的长度

方法二

    int[] vis2={1,2,3,4,5};
    for(int i=0;i<5;i++)
    {
        System.out.print(vis2[i]);
    }
    System.out.println(vis2.length);

方法三

    int[] vis3=new int[]{1,2,3,4,5,6};
    System.out.println(vis3.length);

数组互相赋值方式

本文探讨Java中数组中的赋值问题。在探讨这个问题之前必须先弄懂一件事,Java中的数组到底是什么东西?是类,是对象,还是什么其他奇奇怪怪的东西。答案是:Java中的数组本质上是对象。但是这个对象不是通过某个类实例化来的,而是JVM创建的,这也就不难解释对于一个数组对象arr,我们可以直接通过arr.length访问数组的长度。

现在我们知道了Java中数组本质上是对象,那么我们来看一下这样的代码合理不合理:

int[] a = {1,2,3};
int[] b = new int[3];
b = a;
for(int i = 0; i < a.length; i++)
a[i] = 0;

我们本来的想法是把a数组的值赋值给b,然后将a数组清零,但是我们会发现a,b数组都被清零了。

既然数组本质是对象,那么我们来分析一下这两句代码在Java内存模型中发生了什么。

int[] a = {1,2,3};的时候,堆中会生成一个对应的对象,a会指向这个对象,然后int[] b = new int[3];的时候,b也会指向这个对象。那么比如我们在对a[0]进行修改的时候,实际上是对堆中对象做出了修改。b数组仍然是指向这个堆中对象的,当然b数组的值也改变了。

说到这里已经显而易见了,这样实际上不太合理,比较两个引用都是指向同一个堆中对象,其中一个修改必然会导致另一个的修改。

那么数组的赋值究竟应该怎么做呢?

使用for循环

int[] a = {1,2,3};
int[] b = new int[3];
for(int i = 0; i<a.length; i++)
    b[i] = a[i];

这样可以实现赋值操作,而且灵活性不错,但是效率是个问题。

使用Object的clone()

既然数组本质是对象,那么他就有clone()方法。我们可以使用clone()方法进行复制:

int[] a={1,2,3};
int[] b=(int[]) a.clone();//别忘了强制类型转换

使用System的静态方法arraycopy()

System提供了一个静态方法arraycopy(),原型如下:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
  • src:源数组
  • srcPos:源数组要复制的起始位置
  • dest:目的数组
  • destPos:目的数组放置的起始位置
  • length:复制的长度

我们可以用它来进行数组之间的复制:

int[] a ={1,2,3};
int[] b = new int[3];
System.arraycopy(a,0,b,0,3);

这个方法效率很高,而且具有一定的灵活性。许多基于数组实现的Java的集合类底层在数组复制的时候都是使用这个方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java 数组的两种初始化方式

    一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就可以快速计算出要查找元素的内存地址.通过内存地址快速定位该元素,所以数组查找元素的效率较高. 2.随机的对数组进行增删元素,当增加元素的时候,为了保证数组中元素在空间存储上是有序的,所以被添加元素位置后面的所有元素都要向后移动,删除元素也是,后面所有的元素要向前移动,所以数组的增删元素​效率很低.

  • Java数组实现动态初始化的实例详解

    概念 1.数组动态初始化只给定数组长度,系统默认初始化值. 2.格式 数据类型[] 数组名 = new 数据类型[数组长度]; int[] arr = new int[3]; 实例 package com.itheima.array; public class Demo2Array { /* 数组的动态初始化: 在初始化的时候, 需要手动指定数组的长度, 系统会为数组容器分配初始值. 动态初始化格式: 数据类型[] 数组名 = new 数据类型[数组的长度]; 注意: 打印数组变量的时候, 会打

  • java 中数组初始化实例详解

    1.数组初始化 定义数组的方式: int[] arr1; 或  int arr1[]; 数组初始化 通过上边的定义,我们只是得到了一个数组的引用.这时已经为引用分配了存储空间,但是还没有给数组对象本身分配任何空间.想要给数组对象分配存储空间,必须使用初始化表达式. a.在数组创建的地方进行初始化,如: int[] arr1 = {1,2,3,4,5}; 这种方式等价于使用new来进行存储空间分配. b.给数组的引用赋值,如: int[] arr1 = {1,2,3,4,5}; int[] arr

  • java数组的初始化及操作详解

    数组的基本概念 如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下: int i1, i2, i3, ... i100; 但是这个时候如果按照此类方式定义就会非常麻烦,因为这些变量彼此之间没有任何的关联,也就是说如果现在突然再有一个要求,要求你输出这100个变量的内容,意味着你要编写System.out.println()语句100次. 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作.数组本身属于引用数据类型,那么既然是引

  • java中的数组初始化赋初值方式

    目录 java数组初始化赋初值 方法一 方法二 方法三 数组互相赋值方式 使用for循环 使用Object的clone() 使用System的静态方法arraycopy() java数组初始化赋初值 方法一 int[] vis1;//声明未初始化      vis1=new int[100];//定义占用空间大小(100个int)     for(int i=1;i<=5;i++)     {         vis1[i]=i;//进行赋值     }     for(int i=1;i<1

  • 老生常谈java中的数组初始化

    数组的初始化可以分为两种: 1.静态初始化 2.动态初始化 静态初始化: 例: String[] str = new String[]{"A","B","C"}; String str[] = new String[]{"A","B","C"}; String str = {"A","B","C"}; 动态初始化: 例: Str

  • Java中的数组复制(clone与arraycopy)代码详解

    JAVA数组的复制是引用传递,而并不是其他语言的值传递. 1.clone protectedObjectclone() throwsCloneNotSupportedException创建并返回此对象的一个副本."副本"的准确含义可能依赖于对象的类.这样做的目的是,对于任何对象x,表达式: x.clone()!=x为true,表达式: x.clone().getClass()==x.getClass()也为true,但这些并非必须要满足的要求.一般情况下: x.clone().equa

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

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

  • 分别在Groovy和Java中创建并初始化映射的不同分析

    目录 安装 Java 和 Groovy Groovy 相关资源 Java 和 Groovy 中的映射map都是非常通用的,它允许关键字key和值value为任意类型,只要继承了 Object 类即可. 我最近在探索 Java 与 Groovy 在 创建并初始化列表List 和 在运行时构建列表List 方面的一些差异.我观察到,就实现这些功能而言,Groovy 的简洁和 Java 的繁复形成了鲜明对比. 在这篇文章中,我将实现在 Java 和 Groovy 中创建并初始化映射Map.映射为开发支

  • js接收并转化Java中的数组对象的方法

    在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进行内容的转化,后来发现不可以,网上说js与java没有桥接的东西,所以呢: 我的解决方案是:在action层,将java的对象数组转化为Json串,而在js中,再把json转化为数组对象. 1.将java的对象数组转化为Json串: 要用到两个类: net.sf.json.JSONObject ne

  • 详解Java中的数组与字符串相关知识

    Java数组的定义和使用 如果希望保存一组有相同类型的数据,可以使用数组. 数组的定义和内存分配 Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName; type 为Java中的任意数据类型,包括基本类型和组合类型,arrayName为数组名,必须是一个合法的标识符,[ ] 指明该变量是一个数组类型变量.例如: int demoArray[]; int[] demoArray; 这两种形式没有区别,使用效果完全一样,读者可根据自己的编程习惯选择

  • 基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型.下面有两种方式. public static byte[] int2byte(int res) { byte[] targets = new byte[4]; targets[0] = (byte) (res & 0xf

  • 浅谈java中字符串数组、字符串、整形之间的转换

    字符串数组转字符串(只能通过for循环): String[] str = {"abc", "bcd", "def"}; StringBuffer sB = new StringBuffer(); for (int i = 0; i < str.length;i++) { sB.append(str[i]); } String s = sB.toString(); 字符数组转字符串可以通过下面的方式: char[] data = {"

  • Java中字符数组、String类、StringBuffer三者之间相互转换

    一.StringBuffer与String的相互转换 1.将StringBuffer转换成String StringBuffer类成员toString函数可将其转换成String类型. StringBuffer buffer = newStringBuffer("abcd"); String str = buffer.toString(); 通过String类中的构造将一个StringBuffer类转换为String类:String(StringBuffer buffer) Strin

随机推荐