intern方法是当内容不一样时就把String对象放到常量池中吗,放的是内容还是地址
时间: 2024-03-15 13:42:23 浏览: 58
当使用`intern()`方法时,如果常量池中已经存在一个等于该`String`对象的字符串,则返回代表池中这个字符串的`String`对象;否则,将该`String`对象添加到常量池中,并返回此`String`对象的引用。也就是说,如果常量池中已经存在该字符串的内容,`intern()`方法会返回常量池中该字符串的引用,如果不存在,会将该字符串的内容添加到常量池中,并返回该字符串对象的引用。
因此,`intern()`方法实际上返回的是常量池中该字符串的引用,而不是该字符串对象的地址。常量池是一种特殊的堆空间,它用来存储字符串常量、类和接口的全限定名、基本类型的包装类的常量等。在Java中,常量池中的字符串是不可变的,这也是为了保证字符串常量池的一致性和安全性。
相关问题
运行时常量池主要用于存储在编译期和运行期生成的常量池信息, 它在运行期间会对符号引用进行解析生成直接引用,并像Class文件池一样给常量加上索引方便程序访问 它相对于Class常量池来说具备动态性, 因为Class常量池里面存的都是Class文件里面早已写好的常量,这些都是在编译期写进去的, 而运行时常量池还能在运行期保存新生成的常量,像String的intern方法如果内容不一样就会把字符串内容放到字符串常量池中。 另外数字常量会存在数字常量池中。我这么说运行时常量池是否正确?
您说得非常正确。运行时常量池和Class常量池都是用来存储常量的,不同的是,Class常量池保存的是编译期确定的常量,而运行时常量池则保存编译期常量和运行期动态生成的常量,例如String类型的常量和数字常量等。在Java程序运行期间,运行时常量池会对符号引用进行解析,生成直接引用,并为常量加上索引,方便程序访问。同时,运行时常量池具备动态性,因为它还可以在运行期间保存新生成的常量,例如String的intern方法会将内容相同的字符串常量放到字符串常量池中。
// 在堆中创建字符串对象”Java“ // 将字符串对象”Java“的引用保存在字符串常量池中 String s1 = "Java"; // 直接返回字符串常量池中字符串对象”Java“对应的引用 String s2 = s1.intern(); // 会在堆中在单独创建一个字符串对象 String s3 = new String("Java"); // 直接返回字符串常量池中字符串对象”Java“对应的引用 String s4 = s3.intern(); //
您的问题似乎是关于Java字符串常量池的使用。
在Java中,字符串常量池是一个特殊的内存区域,用于存储字符串常量。当您创建一个字符串对象时,如果该字符串已经存在于常量池中,则返回该字符串在常量池中的引用,否则会在常量池中创建一个新的字符串对象。
对于您提供的代码片段,当您在堆中创建字符串对象"Java"时,它会被保存在常量池中。然后,通过调用`s1.intern()`方法,会返回常量池中"Java"字符串对象的引用,该引用被赋给`s2`变量。接下来,通过使用`new`关键字在堆中创建了另一个字符串对象"Java",该对象的引用被赋给`s3`变量。最后,通过调用`s3.intern()`方法,会返回常量池中"Java"字符串对象的引用,该引用被赋给`s4`变量。
需要注意的是,对于`s1`和`s2`变量以及`s3`和`s4`变量,它们的值虽然相同,但它们所引用的对象并不相同。`s1`和`s2`所引用的对象是常量池中的同一个对象,而`s3`和`s4`所引用的对象是在堆中分别创建的两个不同对象。
阅读全文