本java程序内存过程是怎样的?还有String类的数据在内存中不可改变,这句话如何理解?

class Demo{
String temp = "hello";
}
public class Text{
public static void main(String[] regs){
Demo d1 = new Demo();
d1.temp = "world";
System.out.println("fun()方法调用之前:"+d1.temp);
fun(d1);
System.out.println("fun()方法调用之后:"+d1.temp);
}
public static void fun(Demo d2){
d2.temp = "Bye";
}
}

本java程序共创建了3个String(针对String的分析,实际上更多),一个是hello,一个是world,一个是bye。在程序运行过程中,3个Sting所在内存的地址被依次赋给了d1对象的temp属性。而String类的数据在内存中不可变,指的是String一旦创建,将不会变化,比如本例中的hello,创建后所在内存保存到temp变量中,后来temp变量指向的内存地址变为world所在的内存地址。而原来hello的内容并没有变化,只是它的内存地址被丢弃了而已。在将来的java的垃圾回收中或者程序结束后,该内存空间就会被重新分配给其他对象或者程序使用。
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-08-25
数据的存储区,分为堆内存、栈内存和常量存储区,其中,堆内存用来存放数组和对象,通过new建立的实例对象都存放在堆内存中,堆中的实体都有内存地址值,实体中的变量都有默认初始值,实体不再被使用时,会在不确定的时间呗垃圾回收机制回收。而栈内存用来存放局部变量,当数据使用完后,所占空间会自动释放。字符串常量存放在常量存储区的,所以不可以被改变。

java string 为什么不可变?
Java中的String是不可变的,这意味着一旦创建了一个String对象,它的值就不能被改变。这是由于Java对String的设计和实现方式决定的,以下是几个原因:安全性:字符串不可变性使得字符串对象在多线程环境下是安全的,无需额外的同步措施。多个线程可以同时访问和共享字符串对象,而不必担心数据的修改。缓存...

java中,String类的值声明后不能修改?
String对象不可修改指的是对象本身不可修改,而不是引用不可修改。String a = "你好";这行代码的意思是声明一个String类型的引用变量叫做a,在内存中创建一个String对象(值为"你好"),然后把这个对象的引用赋值给变量a。a = "hello";这行代码执行的效果是在内存中另外创建了一个String对象(值为...

string 为什么是不可更改的
[java] view plain copy str=Hello World 【解释】 String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改。String有两种实例化方式:(1)直接赋值(例中,String str = "Hello";就是直接赋值实例化了)(2)使用new调用构造方法完成实例化;要注意的是:String类对象内容不...

JAVA中字符串类型String是不允许改变其内容的,那么请问简要谈谈下列语 ...
确实,Java中的String类型确实是不允许改变其内容的,String类型的对象一旦建立,将在堆内存当中占据一个固定的内存空间,String类型的对象无法改变。但是你在运算的时候又发现,你定义的String类型的s变量又是可以进行连接的,如"abc"+"def"最终得到的s的值是"abcdef",这似乎看着String类型的对象又是可...

java中String为什么不能更改 如下 虽然String的类型不能改变 但调用函...
函数的传递分为值传递和引用传递,如果函数的形参是值得话是实现不了交换的,因为他们形参和实参应用不同的地址空间,如果形参是对象的引用就可以实现因为他们引用共同的地址空间,如果值改变会影响到双方,在java中String也属于对应的引用的一种不过String是其中的特殊一个不能通过形参改变的引用,这是书上...

为什么说String类型的值是不可改变的?
String s = "Java";s = "HTML";答案是不能。第一条语句创建了一个内容为"Java"的String对象,并将其引用赋值给s。第二条语句创建了一个内容为"HTML"的新String对象,并将其引用赋值给s。赋值后第一个String对象仍然存在,但是不能再访问它,因为变量s现在指向了新的对象,如图。

在java中,说String是不可变的,可是为什么
String str=new String (“kvill”);的区别:在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。看例1:String s0=”kvill”;...

java中string是什么类型
1. String类的基础定义:在Java中,String是字符串的抽象表示形式。它是一个预定义的类,位于java.lang包中,这意味着在Java程序中可以直接使用String类而无需导入额外的包。由于它是不可变的,所以每次对字符串进行修改的操作都会创建一个新的String对象。这种特性使字符串在内存中的处理变得高效,因为...

String的"缓冲池特性"和"不可变性"是什么意思啊?
可能1个,可能2个。缓冲池是java为了节省内存空间,会在内存中创建一个专门为String设计的缓冲池,用来保存已经存在的字符串,如果2个字符串是一样的,则使用池中的字符串,不再创建新的对象,但是在池中所有字符串都是以char数组形势存在的。不可变性是java中的String一但创建,是永远不可改变的,...

Java中String,StringBuffer和StringBuilder的区别和堆栈内存分配
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuilder)的原因 String:字符串常量 StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样...

相似回答