首页 > 试题广场 >

试分析下面代码运行后,内存空间的状态() String s1

[单选题]

试分析下面代码运行后,内存空间的状态()

String s1="hello";
s1=s1+" world";
  • 只有"hello"

  • 只有"hello world"

  • 有 hello 和 "world"

  • 有 "hello" 和 "hello world"

因为在Java中String类被设计成不可改变的类,所以String类的所有对象都是不可变的。第一句代码中,s1(存储在栈区)引用了堆中的一个内存区域(记为a1),a1堆内存区域存储的内容是“Hello”。执行第二句代码后,s不在引用a1区域,而是重新引用了堆中的另外内存区域(记为a2),且a2中的内容是“Hello world”。s并没有对原始的a1堆内存中的内容进行改变,而是重新指向了新的堆内存区域。

 

发表于 2021-12-31 15:11:54 回复(0)
在Java中用连接符“+”来连接两个字符串变量时底层是用StringBuilder进行append操作,如果有一个变量(eg:s1)则会在append后调用toString方法,相当于返回一个new String,并把此变量地址赋值,但是在内存中原来的字符串常量并不会消失。通俗点说,就是String的不可变性,对原来的Str进行连接操作,除非是两边都是字面量,否则就会new StringBuilder出来,内存中就会多一个对象。
发表于 2022-01-10 14:39:14 回复(0)
对string的操作只是改变了指向,并没有改变内容,所以内存中会存在“hello”和“hello world”两个字符串,代码执行完之后s1指向的“hello world”。
发表于 2022-01-17 16:33:57 回复(1)
String是不可变类,每次修改会生成一个新的对象,因此效率低下且会造成优先的内存空间浪费;
StringBuffer是线程安全的可变类,字符串大小超过缓冲区容量时会自动扩大容量,StringBuffer里的方法都是用synchronized修饰的因此是线程安全的,适合多线程
StringBuilder是线程不安全的可变类,所以单线程操作字符串可以使用该方法-效率高
发表于 2022-10-14 14:43:59 回复(0)
张三戴了一顶"hello"的帽子,后面又戴上了"hello world"帽子,但是"hello"帽子并没有消失
发表于 2023-05-18 21:56:37 回复(0)

这段代码主要涉及到Java的字符串处理。在Java中,字符串是不可变的,这意味着每次对字符串进行更改或操作时,都会创建一个新的字符串对象。

首先,代码String s1="hello";创建了一个字符串常量"hello",并将其引用赋值给变量s1。此时,内存中有一个位置存储了"hello"这个字符串,s1指向这个位置。

接着,代码s1=s1+" world";执行了一个字符串连接操作。由于Java字符串是不可变的,所以这里并不会改变原有的"hello"字符串,而是会创建一个新的字符串对象,内容为"hello world",然后s1的引用指向这个新的字符串对象。

因此,代码运行后,内存中的状态是:

  1. 第一个位置存储了"hello"这个字符串,但是没有任何变量指向它,因此这个字符串对象变得不可达,等待垃圾回收。
  2. 第二个位置存储了"hello world"这个新的字符串,s1指向这个位置。

简而言之,原来的"hello"字符串由于不再有任何引用指向它,所以它将变为垃圾,等待Java的垃圾回收机制进行清理。而新的"hello world"字符串则会被s1引用,保持活跃状态。

编辑于 2024-02-28 10:35:37 回复(0)