第一篇:讲讲String
public static void main(String[] args) {
String s1 = new String("hello");//2个对象
String s2 = "hello";//没有创建
String s3 = new String("hello");//1个对象
String s4 = "hello";//没有创建
//因此上面只产生了3个对象 字符串池1个,堆2个
//这里每次赋值的时候,首先都会判断字符串池里面有没这个字符串值,如果有,则引用存在的,如果没有,则创建。
//上面的解释:String是有一个叫字符串池,首先会判断字符串池里面是否有这个字符串,如果没有,则在字符串池创建一个字符串,并且由是s1指向他,然后有new操作符,就在堆内存创建一个对象,值为hello,并且也是s1指向了他。
//第二条是判断字符串池了有没这个值的字符串,有,不在字符串池创建,直接有s2指向了hello值的内存地址,相当于是s1和s2在字符串池都指向了同一块内存地址,值为hello
//第三条只在堆内存中创建一个对象,s3同时指向了字符串池和堆内存的地址,值都为hello
//==比较的是内存地址值
System.out.println(s1==s2);//false
System.out.println(s2==s3);//false
System.out.println(s1==s3);//false
System.out.println(s4==s2);//true 都指向了字符串池的"hello"
System.out.println(s1.intern()==s4);//true String的intern()方法(表示其字符串池中字符串的地址)
System.out.println(s1.intern()==s3);//false
String hello = "AYEP";
String yep = "YEP";
System.out.println(hello=="A"+"YEP");//true 字面值常量相加等于直接相加然后在字符串池存储
System.out.println(hello=="A"+yep);//false 字面值与变量相加,会在堆区产生一个新的对象,因此就有一个地址值