初始java数组_初始化数组为0

初始java数组_初始化数组为01.初始化定义2.数组的三种打印方式3.数组引用null4.浅谈引用变量的影响5.与数组相关的字符串操作以及javaJVM内存简单介绍6.浅谈二维数组与C的区别

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

目录

1.初始化定义

 2.数组的三种打印方式

3.数组引用null

 4.浅谈引用变量的影响

5.与数组相关的字符串操作

6.二维数组的创建和遍历

7.不规则二维数组



1.初始化定义

java数组的定义分两种,静态初始化,动态初始化

int [] a =new int[20];//动态
int [] b =new int[]{1,2,3,4,5};//静态

注意下面的框内是没有数字的,不能填写数字,编译器会根据后面的元素得到。

这种方式在初学者,尤其是先学C语言的人看来比较奇怪,

首先是 int [ ] a;int [ ]代表数组的类型,a是变量名

其次,java中的数组是一种引用类型,也就是a变量存放的是地址,是右边new出来的那片空间的地址

最后来看一下一张图,java程序是在jvm(虚拟机)上跑的,那他的内存分布是什么样子

初始java数组_初始化数组为0

简单介绍一下各自空间:

java虚拟机栈:存放局部变量

java本地方法栈:运行c,c++编写的程序【JVM是一个由c,c++编写的软件,因为底层开发高效】

堆:存放对象(new出来的那些)

程序计数器:存放指令,以便程序顺序,循环,选择,跳转的执行

方法区:存放静态的成员变量

PS:线程隔离共享可以简单理解成多个程序共享一个方法区和堆区,其他的程序计数器等等都是自己拥有一片空间

我们主要从虚拟机栈和堆区上理解数组

int [ ] a = new int[ ]{1,2,3};是怎么执行的?

首先是创建a,假定a是一个局部变量,因此他在栈上开辟空间,然后new了一块空间,就是在堆上开辟了一块放着四个整形的1,2,3;然后a取这块空间的地址

初始java数组_初始化数组为0

ps:这里的0x99是一个哈希印射的地址,但是可以通过这个虚拟地址找到存放位置

变量的地址是伪地址(安全性)

 2.数组的三种打印方式

1.常规遍历

2.创建变量接受

3.转换成字符串直接打印

1.直接遍历
public class TestDemo4 {
    public static void main(String[] args) {
        int[] a = new int[]{1, 2, 3, 4};
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}
2.创建变量接受
public class TestDemo4 {
    public static void main(String[] args) {
        int[] a = new int[]{1, 2, 3, 4};
        for (int x:a) {
            System.out.println(x);
        }
    }
}
创建了一个x接受a里面的元素
3.转换字符串
import java.util.Arrays;

public class TestDemo4 {
    public static void main(String[] args) {
        int[] a = new int[]{1, 2, 3, 4};
        String s = Arrays.toString(a);
        System.out.println(s);
    }
}

初始java数组_初始化数组为0转换字符串的打印结果

 第三种方法是Arrays.toString 把数组a转换成字符串,然后用s接受,然后直接打印

3.数组引用null

如果给数组定义null,那就是引用空的意思,类似C语言的NULL,都是指向无效地址,然后对其的任何读取操作都会出现空指针异常错误。【java并没有规定null与0地址有关系】

初始java数组_初始化数组为0

 4.浅谈引用变量的影响

例1:下面代码的结果是什么?

public class TestDemo4 {
    public static void main(String[] args) {
        int[] a = new int[]{1,2,3,4};
        int[] b=a;
        b[1]=10;
        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i]);
        }
    }
}

答案是1 10 3 4(有分行)

int [ ]b=a;代表什么,是b引用了a引用的对象

a,b是栈上的不同变量,但是都指向了堆上的同一块内存1,2,3,4;

因此用b来修改内存,也就相当修改了a的

初始java数组_初始化数组为0

可以看到两个变量放的地址是一样的

例2:最终的打印结果是什么

public class TestDemo4 {
    public static void exchange(int [] b){
        b = new int []{7,8,9,10};
    }
    public static void main(String[] args) {
        int []a = new int[]{1,2,3,4};
        exchange(a);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}

1,2,3,4;

一开始a指向1,2,3,4;然后函数exchange的形参b接受a的值,所以a,b同时指向1,2,3,4

初始java数组_初始化数组为0

 接着b便指向了7,8,9,10;然后函数结束,然后打印a,a本身没有任何改变

 初始java数组_初始化数组为0

 区别引用是否改变的一个关键就是:它拿这个引用干了什么,例1拿到地址修改值;例二拿到了地址,然后不要这个地址,重新拿了一块新地址

5.与数组相关的字符串操作

1.转换字符串

前面提到了,Arrays.toSting(数组名),返回一个字符串

如int [ ] a = new int [ ]{1,2,3,4};

Arrays.toString(a)

返回”[1,2,3,4]”

2.字符串拷贝函数

Arrays.copyOf(数组名,拷贝长度);返回一个数组

还可以用于拓展数组

import java.util.Arrays;

public class TestDemo4 {
    public static void main(String[] args) {
        int []a = new int[]{1,2,3,4};
        int []copy=Arrays.copyOf(a,a.length);
        
    }
}

6.二维数组的创建和遍历

第一种是静态初始化

int[][] b = new int[][]{
  
  {1, 2, 3}, {2, 3, 4}, {6, 7, 8}};

第二种是动态初始化

int[][] b = new int[2][4];

遍历数组(for循环直接遍历)二维数组的元素是一维数组,因此可以用b[i].length来找长度

 int[][] b = new int[][]{
  
  {1, 2, 3}, {2, 3, 4}, {6, 7, 8}};
        for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                System.out.println(b[i][j]);
            }
        }

第二种是for each遍历  二维数组的元素的类型是int [ ]   (假设是int型)

int[][] b = new int[][]{
  
  {1, 2, 3}, {2, 3, 4}, {6, 7, 8}};
        for (int []x:b) {
            for(int y:x){
                System.out.println(y);
            }
        }

7.不规则二维数组

int[][] b = new int[2][];
        System.out.println(b[1][0]);

与c语言不同,java可以指定行而不指定列

现在对第二行取第一个元素会发生什么?

初始java数组_初始化数组为0

 会发生空指针异常错误

首先需要了解的是java的数组存储的对象是一片连续的空间

但是二维数组的元素是一维数组,也就是引用类型,因此他们的空间自然就可以不连续了,不妨自己画个图理解一下,不连续也就不用硬性要去他们的引用的长度都一样,所以会延伸出以一种不规则的二维数组。

c语言的数组是连续空间,也有指针概念,所以可以数组名+1来跳过一个元素,因为数组名本质就是指针,但是java中没有指针概念,因此没有数组名+1这种操作

int[][] b = new int[][]{
  
  {1, 2}, {1, 5, 6}, {6, 7, 8, 6}};

它们每一行的长度都不一样

回到刚刚的问题,为什么会空指针异常?java中定义数组不赋初识值都会默认给一个值,int就0

那这里的二维数组相当于定义一个存放两个引用类型的变量,那引用了谁,你没赋值,所以默认是null,因此我们对null进行下标查找的操作自然就会异常。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179526.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • linux1521端口不通,Linux开放1521端口允许网络连接Oracle Listene「建议收藏」

    linux1521端口不通,Linux开放1521端口允许网络连接Oracle Listene「建议收藏」症状:1.TCP/IP连接是通的。可以用ping命令测试。2.服务器上OracleListener已经启动。lsnrctlstatus查看listener状态lsnrctlstart启动Oraclelistener3.客户端得到的错误信息通常是:ORA-12170:TNS:连接超时这时,我们基本可以肯定是服务器没有开放1521端口(假设你用默认设置)解决方法:1.假…

  • Python数据类型有哪些,哪些是可变类型,哪些是不可变类型?

    Python数据类型有哪些,哪些是可变类型,哪些是不可变类型?Python数据类型有哪些,哪些是可变类型,哪些是不可变类型?类型:整数int字符串str浮点数float布尔型bool列表list字典dict集合set元组tuple可变类型:就是这个数据类型的值在不改变这一块内存空间,而去改变这个数据类型的值。1.列表2.字典3.集合不可变类型:当改变值得时候,会申请一块新的内存空间,不再是原来的那一块内存空间了。整数字符串浮点数布尔型元组…

  • python 正则表达式匹配数字或者小数点_五位小数正则表达式

    python 正则表达式匹配数字或者小数点_五位小数正则表达式在对文本关键信息进行提取的过程中,通常需要使用正则表达式匹配。这篇笔记整理汇总Python中可能用到的与数值相关的正则表达式。正则表达式基础正则表达式是用字符串表示的一种语法,用于描述一种字符串匹配的模式。正则表达式中大多数字符的含义是通用的,比如符号^和$在绝大多数语言的正则表达式中都表示行头和行尾;但也可能在某些语法上存在差异,这需要依据特定语言而定。Python的正则表达式匹…

    2022年10月14日
  • 如何开展云平台密评工作[通俗易懂]

    如何开展云平台密评工作[通俗易懂]1.背景云计算目前大家都很熟悉了,为了降低系统的成本或者打通数据的融合,许多企业事业单位的系统都选择部署在云上。云计算技术由于使用虚拟化等技术,其网络等边界相对而言是很模糊的,而部署在云平台上的系统,其安全风险也随之增加。实际测评中,我们经常会碰到云平台和云租户业务应用系统密码应用(以下称为“云上应用”)的密评。2.云平台测评的责任和范围我们可以依据《商用密码应用安全性评估FAQ》第19条的内容,当我们对运行在云平台上的云上应用进行测评时原则上要完成两部分测评工作:(1)当我们对云平台自身

    2022年10月24日
  • 年轻的采访可以学到很多东西

    年轻的采访可以学到很多东西

  • C/C++ int数组初始化

    C/C++ int数组初始化一、一维数组C/C++初始化静态数组intarray[100]; //定义了数组array,但并未对数组初始化;静态数组intarray[100]={0}; //定义了数组array,并将数组元素全部初始化为0;静态数组intarray[100]={1}; //定义了数组array,并将数组第一个元素初始化为1,后面99个元素初始化为0;静态数组intarr…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号