五、 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)
// 方法确定),则返回池中的字符串。
}
}