JAVA中new String[0] 和 new String[1]是怎么分配内存的?

问题描述

JAVA中String[]s1=newString[0]和String[]s2=newString[1]是怎么分配内存的?我的理解:1、栈空间分配s1,s2;2、s1指向堆空间某个地址,内容为null;s2指向堆空间某个地址s2[0],然后s2[0]指向某个堆空间,内容为null;不知道这个理解对否,望指点。

解决方案

解决方案二:
很简单,您可以直接打印s1和s2,如果按你的理解应该会输出null和一串地址,但其实应该2个都是有地址的就都不是空的
解决方案三:
指向堆没问题。不过不是null。你不是new了数组么。。
解决方案四:
首先你创建了两个数组对象,所以堆中间是肯定有两个对象的,既然存在两个对象,那个你的栈内存中的地址值就肯定不为空了
解决方案五:
有可能楼主你是对的。对程序员而言,小心不越界就行了。
解决方案六:
其实我觉得楼主的理解就是对的不过不应该把两个的情况分开来看这本身就只属于一种情况引用变量指向了一块内存空间,这个内存空间还未进行赋值个人理解
解决方案七:
第一个也是有地址的,只是它指向的堆空间没有任何的东西,也就是不存在s1[0],第二个你想法是对的
解决方案八:

解决方案九:
0iconst_01anewarrayjava.lang.String[16]4astore_1[t0]5iconst_16anewarrayjava.lang.String[16]9astore_2[t1]

有闲心提问,就没闲心去动动手?数组对jvm来说是很特殊的一种对象,在jvm内部处理,但无论预分配空间是多少,jvm都会用anewarray或者newarray建立一个“数组对象”
解决方案十:
引用8楼HinanaiTenshi的回复:

.......数组对jvm来说是很特殊的一种对象,在jvm内部处理,但无论预分配空间是多少,jvm都会用anewarray或者newarray建立一个“数组对象”

额,对jvm不太熟..我是测试之后看不到结果才提问的。
解决方案十一:
引用1楼sanvnie_kaka的回复:

很简单,您可以直接打印s1和s2,如果按你的理解应该会输出null和一串地址,但其实应该2个都是有地址的就都不是空的

s1和s2栈的地址都会输出,但是s1指向的堆的内容没法输出,s2指向的堆,再指向s2[0],内容是null。所以我认为s1指向的堆的内容是null。(表达不好,哎)
解决方案十二:
长度为0也是数组,仍然会分配数组空间,只是长度为0,第二个当然是长度为1的数组,只是2个一开始内容都是null
解决方案十三:
赞同@xiangnan129@Molly_1994意见

时间: 2024-11-18 02:23:19

JAVA中new String[0] 和 new String[1]是怎么分配内存的?的相关文章

java中static变量和static方法以及普通方法在那个内存中存储呢? 请高手指点,谢谢

问题描述 java中static变量和static方法以及普通方法在那个内存中存储呢? 请高手指点,谢谢 栈内存:局部变量和对象的引用变量: 堆内存:对象: 以上是我所知道的,那么static变量和static方法以及普通方法在那个内存中存储呢? 请高手指点,谢谢 解决方案 static和普通方法都存在堆内存中,堆内存有个永久区permgen,这里面会存类信息. 所以不断的加载类或jar包可能出现permgen oome的错误. static是在堆内存的数据区. 解决方案二: java stat

java中的数组类型的数据能存储到栈空间吗

问题描述 java中的数组类型的数据能存储到栈空间吗 我们知道堆空间存储大数据,栈空间的数据先进后出, java中的数组类型的数据能存储到栈空间吗 解决方案 基本类型产生了一个值存放在栈中,变量的值就是栈的地址处的值. 引用类型则产生了一个对象,存放在内存堆中,同时将内存堆对象的指针地址(引用地址)存放在了栈中,变量的值实际是栈中的引用地址. 解决方案二: java中所有对象和数组都是在堆上分配内存的,,栈内存用来存放局部变量 解决方案三: java 存储不同类型数据Java实现登录.注册(使用

(十六)java中的String

     String:字符串类型,是java中最常用的引用类型,String是不可变的,java.lang.String是由final修饰,此类不可被继承.     String是不可变的,指的是字符串一旦创建,其对象不可改变,但是字符串引用是可以重新赋值的.     java中的字符串在内存中采用unicode编码格式存储,任何一个字符对应两个字节的定长编码,不论中文还是英文.     java中的静态字符串,即字面量.常量.常量连接的结果,是在常量池中创建的,并尽量使用同一个对象,重用静态

java中的read(byte【】)方法的问题

问题描述 java中的read(byte[])方法的问题 为什么is=system.in就会成为死循环,而上面用file程序就会停止 解决方案 你用System.in时因为在while要检查输入的内容长度,因此会进入阻塞状态.不能说是死循环,循环的话会输出内容的,这里是阻塞了. 你输入了一次,会输出至少一次,根据你输入的内容长度来定,输出完毕后,会再次进入while判断条件中判断是否有新的输入,也就是说用System.in是没有办法达到一个普通文件那样的输入结尾的,只要你程序开着,他就可以一直输

Java中常用正则表达式

自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台. 因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索. \ 反斜杠 t 间隔 (' ') n 换行 (' ') r 回车 (' ') d 数字 等价于[0-9] D 非数字 等价于[^0-9] s 空白符号 [tnx0Bfr] S 非空白符号 [^tnx0Bfr] w 单独字符 [a-zA-Z_0-9] W 非单独字符 [^a-zA-Z_0-9] f 换页

Java 中的字符串常量池详解_java

Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式.然而这两种实现其实存在着一些性能和内存占用的差别.这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池.

string-关于java中byte 超出表示范围了

问题描述 关于java中byte 超出表示范围了 String s = Integer.toHexString(number); byte b = Byte.parseByte(s,16); 但是java中byte的范围不是-128~127吗, 请问怎么表示比如128 解决方案 解决方案二: 你可以试下,如果number大于127的话,就会报Value out of range(数值超出范围)的错误. 如果估计数据可能超出-128~127这个范围的话,你就需要考虑用int b 而不是byte b

java中import语句导入的是类呢还是对象

问题描述 java中import语句导入的是类呢还是对象 导入文件夹的话,是文件夹下的所有的类还是所有类的对象 import语句还可以导入什么呢 解决方案 import的作用是通知类加载器将这些类的.class文件加载到JVM内存中,所以是导入的是类型信息. 解决方案二: 而且import不是导入文件夹的话,它是类之间引用关系时用的一个关键字,因为Java中只有将类的字节码文件加载到内存中,才能使用这个类. import的作用就是加载类的字节码文件的. 解决方案三: 只导入类的实现.

java中的常见关键字解析_java

本文主要针对Java常见关键字final,static,super,this进行详细辨析,以方便读者参考查阅.具体如下: 一.final 1)修饰class(类): 表示此类不可被继承了 2)修饰method(方法) 表示此方法方法不可被重写(@override)了 3)修饰variable(变量) 表示此变量的值之后不可被改变了,常用于修饰不可变的常量 注:final字面意思是"最后"."不可更改"的意思,结合意思记忆更方便. 二.static(第二.三法常用)