关于常量池-----小例子
package com.xdf;
import org.junit.Test;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
@Test
public void testHashSet(){
String a="abc";
String b="abc";
String c=new String("abc");
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(c.hashCode());
System.out.println(a.hashCode()==b.hashCode());
System.out.println(a.hashCode()==c.hashCode());
}
@Test
public void testString(){
/**
* 01.在栈中开辟空间存储a
* 02.拿“abc”字符串去常量池中查询有没有,因为我们是第一次创建,所以没有
* 03.在常量池中开辟空间存储"abc"
* 04.栈中的a就指向了常量池中的"abc"地址
*/
String a="abc";
/**
* 01.在栈中开辟空间存储b
* 02.拿“abc”字符串去常量池中查询有没有,有
* 03.在常量池中不会开辟空间存储
* 04.栈中的b就指向了常量池中的"abc"原有地址
*/
String b="abc";
/**
* 01.在栈中开辟空间存储c
* 02.拿“abc”字符串去常量池中查询有没有
* 有:直接去堆中开辟空间保存"abc"
* 没有:在常量池中开辟空间存储"abc",之后再去堆中开辟空间保存"abc"
* 03.栈中的c指向了堆的"abc"
*
*/
String c=new String("abc");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a.equals(c));
}
@Test
public void testIntern(){
String a="abc";
String b=new String("abc");
String c=new String("abc");
System.out.println(a==b);
System.out.println(a==b.intern()); //让b去常量池中寻找引用
System.out.println(c.intern()==b.intern()); //让bc去常量池中寻找引用
}
@Test
public void testFinal(){
/**
* 创建了3个变量
* 常量
*/
String a="abc";
a="bcd";
final String b="a";
final String c="bc";
System.out.println(a==(b+c));//不会自动拼接abc
}
/**
* -128 127 存在常量池中
*/
@Test
public void testInt(){
Integer num1=128;
Integer num2=128;
Integer num3=new Integer(128);
System.out.println(num1==num2);
System.out.println(num1==num3);
}
}