⑴ java中两个字符串的内存地址相同
String s1 = new String("I am a student"); 这里 你声明了一个引用 s1\x0d\x0a指向的是 new String("I am a student"); 这个字符串\x0d\x0aString s4 = s1; 这里 你又声明一个引用 指向s1的引用 也就是new String("I am a student"); \x0d\x0aif(s1 == s4) {\x0d\x0aSystem.out.println("这两个字符串的内存位置相同");\x0d\x0a}\x0d\x0a上面还是相等的\x0d\x0a但是 s4 = s4.replace('a', 'A');\x0d\x0as4.replace('a', 'A'); 生成了另一个 字符串 你要知道 String 是final类型的 所以\x0d\x0a这个时候 即原来已经开辟了内存空间的 new String("I am a student"); 是不可能改变内容了的\x0d\x0a这个时候 s4.replace('a', 'A'); 就另开辟了一个内存空间\x0d\x0a 而这个时候 你的S4指向s4.replace('a', 'A'); 而原来的s1还是指向 new String("I am a student"); \x0d\x0a他们肯定不一样的呢
⑵ java中,字符串,如何存储在内存中的哪个区域
字符串在java中是不可变序列,每一个双引号的字符串序列都是常量,存在常量池中。但String类型的对象,属于对象范畴,按对象的特性存储。
⑶ java的字符串是常量吗它存 放在内存的哪里
b为字符串常量,存放在java虚拟机为它分配的内存在常量池中。
如果常量池中存在“你好”,b就会指向其内存地址。
如果不存在Java虚拟机会为“你好”分配一个地址
⑷ java中字符串池存放在内存的哪个区域
字符串首先是一个对象。
举个例子:
String
str0
=
"abc";
String
str1
=
new
String("abc");
当执行String
str0
=”abc”;时,JVM会在栈中创建三个char型的值
’a’
,
’b’
和
’c’
,然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{
’a’
,
’b’
,
’c’
},最后这个新创建的String对象的值”abc”会被添加到字符串池中。如果我们接着执行String
str1=new
String(”abc”);代码,由于”abc”已经被创建并保存于字符串池中,因此JVM只会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在字符串池中的
”
abc
”
;
⑸ Java中 String字符串内存分配问题
jvm中有个String pool,一般在池中有的对象就不会再去生成一个新的。
String s1 = "abc";
生成了一个字符串对象"abc"并放入pool中,定义了一个String变量s1并指向"abc"。
String s = "abc" + s1 + "def";
等式右边有三个String 对象 "abc" 、s1 、"def"
这里("abc"==s1)是true,就是说是引用的同一个内存地址。
"abc"已经在池中了,直接从池中取出来,这句又创建了一个"def"的String对象并放入池中。
当前二个String对象做连接的时候,又会创建一个新的String对象"abcabc",并放入池中;然后再做字符串相加"abcabc"+def又生成一个字串对象,最后变量s指向这个新的String对象。
所以用+来连接字串会产生很多临时的字串对象,效率低。一般使用StringBuffer或StringBuilder来做字串连接。
可以使用new String()来生成一个新的String对象并单独分配内存空间。
------------------------------------------------------
查了下资料,已经改了回答内容。
String s = "abc";
这句是定义一个String变量s,jvm会先去字符串池中找有没有"abc",有的话就把s指向"abc",没有就会先在池中创建一个,再让s指向"abc"。
String s = new String("abc");
这句是先定义一个String变量s,然后在内存中分配新的空间"abc"再让s指向这个内存地址。
⑹ 怎么查看java中字符串的内存地址
java中不建议直接获取字符串内存地址,因为java不像c语言,获取内存地址是C语言的强项,java的弱项。但是java内存地址还是有一个应用场景,就是判断两个字符串内存地址是否相等来判断是否是同一个对象,用双等号“==”来比较的。参考代码如下:
publicclassTest01{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Stringstr1="abc";
Stringstr2=newString("abc");
System.out.println(str1==str2);//输出false
}
}
⑺ java的字符串是常量吗它存 放在内存的哪里
你好,String变量中存的是地址。在你的例子中,变量b存储的是一个"你好"的字符串常量的地址,这个地址是不变的,若你再声明String c=”你好";则c==b,同样,b==“你好";因为常量在内存中只存储一次。而你的变量a使用了new运算符,它的意思显而易见,就是重新申请一个空间来存放字符串的。所以当你再有String d=new String("你好");变量(d==a)的返回值是false。
希望这样解释能理解吧
⑻ Java中字符串在内存当中占几个字节
对是10字节
在C 或C++个 一个char 是8位(1BYTE)而java 中是16位 (2BYTE)
这个字符串为5个char 所以是 10(BYTE)
⑼ java中,如何得到一个字符串占内存大小
java中可以用.getBytes().length获取字符串占用内容的大小,原理是java中任何字符都采用Unicode编码,所以衡量占用内存大小采用占用的字节数。
举例如下:
public class TestStringSize {
public static final void main(String[] args) {
System.out.println("占用内存大小:"+"学java".getBytes().length);
}
}
输出结果:
占用内存大小:6 byte
⑽ Java中字符串在内存当中占几个字节
对是10字节
在C
或C++个
一个char
是8位(1BYTE)而java
中是16位
(2BYTE)
这个字符串为5个char
所以是
10(BYTE)