Java堆与栈内存分配及String小记(3)

五、 intern 栈中值的内存地址


Public String intern()

当调用 intern 方法时

1、如果池已经包含一个等于此 String 对象的字符串(用equals(Object) 方法确定),则返回池中的字符串。

2、将此 String 对象添加到池中,并返回此 String 对象的引用。


String s7 = new String("abc") ;

String s8 = "abc" ;


System.out.println(s7 == s7.intern()) ;//flase;

System.out.println(s8 == s7.intern() );//true


1.检查栈内存中有没有abc对象如果有

2.将s7指向pool中abc


六 、写了段代码如下:

public class test {
public static void main(String args[]) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);// true,jdk1.5之后-128-127会向下转型,所以相当于int a=100;
Integer c = 200;
Integer d = 200;
System.out.println(c == d);// false,堆内存中创建的对象,所以不一样
int f = 300;
int g = 300;
System.out.println(f == g);// true,基本类型,栈内存中创建,g是一个引用,所以一样。
String abc = new String("abc");
String bcd = new String("abc");
System.out.println(abc == bcd);// false,堆内存,不同
String aaa = "aaa";
String bbb = "aaa";
System.out.println(aaa == bbb);// true,栈内存,对象引用
String cde = "abc";
System.out.println(abc == cde);// false,一个是栈内存,一个是堆内存,肯定不一样

String str = new String() + "abc";
/*
* 一共创建4个字符串: 1."abc"为一个字符串 2.new String()创建了一个字符串 3.new
* String+"abc"创建了一个字符串(String类型连接是新建一个新的字符串,不同于StringBuffer)
* 4.str为指向新生成的字符串的引用,本身会在内存中创建一个String类型的引用对象
*/
String s7 = new String("abc");
String s8 = "abc";
System.out.println(s7 == s7.intern());// flase;
System.out.println(s8 == s7.intern());// true,如果池已经包含一个等于此 String
// 对象的字符串(用equals(Object)
// 方法确定),则返回池中的字符串。

}
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpdxs.html