今天主要讲一下String的两种赋值方式在内存中的区别以及intern方法
String的两种赋值方式如下
1、String a=“abc”; 2、String a=new String("abc");
--------------------------------------------------------------------------------------------------------------------
讲主题之前我们先简单回顾基本类型和引用类型在内存存储方面的区别:
基本类型包括byte,shot,int,long,float,double,boolean,char这8类在内存的情况都是一样的、
int a=1;
int c=2;
double b=1.00;
如下的基本类型在内存存储情况是这样的
a=1首先现在栈中寻找有没有1的值,没有就在栈中创建一个,然后将a引用到1中,如果已经有1值就不需要再创建,直接将a指向面值为1的地址。举一反三,基本类型的内存存储情况都是这样的。
所以基本类型的比较值,可以用 == 也可以用equal方法(这方法无论是基本类型还是引用类型都可以)
==是比较地址 equal是比较内容
引用类型的内存存储大致情况
String a=new String("abc");
String b=new String("abc");
所有的引用类型都是这样,引用变量在栈中创建,实例在堆中创建,然后a指向实例
-------------------------------------------------------------------------------------------------------------------
好开始讲正事
开头讲的String是引用类型,它的两种赋值形式。
第一张种String a="abc";
常量池(constant pool)指的是在编译期被确定。在常量池寻找有没有abc的值,没有就创建一个abc的值,这点有点像基础类型的内存存储。使用这样的赋值方式,==也是可以比较的
而第二种new方式就像引用类型的方式
String a="c";
String a1="c";
String d = new String( "c" ) ;
String d1 = new String( "c" ) ;
System.out.println( d==d1);
System.out.println( a==a1);
大家可以去试试,输出的是false,true
然后我们说说String.intren()
一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用, 如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;
以下是关于String.intern()方法,我认为网上资料讲的比较清楚的关于String.intern()方法