intern方法是当内容不一样时就把String对象放到常量池中吗,放的是内容还是地址
时间: 2024-03-15 19:42:23 浏览: 15
当使用`intern()`方法时,如果常量池中已经存在一个等于该`String`对象的字符串,则返回代表池中这个字符串的`String`对象;否则,将该`String`对象添加到常量池中,并返回此`String`对象的引用。也就是说,如果常量池中已经存在该字符串的内容,`intern()`方法会返回常量池中该字符串的引用,如果不存在,会将该字符串的内容添加到常量池中,并返回该字符串对象的引用。
因此,`intern()`方法实际上返回的是常量池中该字符串的引用,而不是该字符串对象的地址。常量池是一种特殊的堆空间,它用来存储字符串常量、类和接口的全限定名、基本类型的包装类的常量等。在Java中,常量池中的字符串是不可变的,这也是为了保证字符串常量池的一致性和安全性。
相关问题
运行时常量池主要用于存储在编译期和运行期生成的常量池信息, 它在运行期间会对符号引用进行解析生成直接引用,并像Class文件池一样给常量加上索引方便程序访问 它相对于Class常量池来说具备动态性, 因为Class常量池里面存的都是Class文件里面早已写好的常量,这些都是在编译期写进去的, 而运行时常量池还能在运行期保存新生成的常量,像String的intern方法如果内容不一样就会把字符串内容放到字符串常量池中。 另外数字常量会存在数字常量池中。我这么说运行时常量池是否正确?
您说得非常正确。运行时常量池和Class常量池都是用来存储常量的,不同的是,Class常量池保存的是编译期确定的常量,而运行时常量池则保存编译期常量和运行期动态生成的常量,例如String类型的常量和数字常量等。在Java程序运行期间,运行时常量池会对符号引用进行解析,生成直接引用,并为常量加上索引,方便程序访问。同时,运行时常量池具备动态性,因为它还可以在运行期间保存新生成的常量,例如String的intern方法会将内容相同的字符串常量放到字符串常量池中。
java中字符串对象和字符串常量池的关系,举例说明
Java中的字符串常量池是一个特殊的内存区域,用于存储字符串常量。当Java程序中定义了字符串常量时,这些字符串会被保存到字符串常量池中。而字符串对象是指通过new操作符创建的字符串实例,它们存储在堆内存中。
字符串对象和字符串常量池的关系是:当通过new操作符创建字符串对象时,Java会先在字符串常量池中检查是否存在相同的字符串常量,如果存在,则将该字符串常量的引用返回给字符串对象,否则就在堆内存中创建一个新的字符串对象并存储相应的字符串常量。举个例子,如果我们定义一个字符串常量"hello",然后再通过new操作符创建一个新的字符串对象str,Java会首先在字符串常量池中查找是否存在"hello"这个字符串常量,如果存在,则str会指向该字符串常量的地址;如果不存在,则会在堆内存中创建一个新的字符串对象,并在字符串常量池中添加一个"hello"的字符串常量。
需要注意的是,通过直接赋值方式创建的字符串对象并不一定存储在字符串常量池中。只有通过字符串字面量或调用String类的intern()方法,才能将字符串对象存储在字符串常量池中。