public class str韩 {
public static void main(String[] args) {
String name="lxl";
//字符串字符使用的是unicode编码,一个字符占二个字节(汉字和英文)
name="ee";
System.out.println(name );
//【2】string常用的构造器
/* String s1=new String();
String s2=new String();
*/
//private final byte[] value;
final char[] v={'a','b','c'}; //不可变
char [] v1={'l','x','l'}; //地址可变
char [] v2={'z','m','g'}; //可变
v[0]='A';
v1=v2;
//v=v1;
System.out.println(v1);
//[3] new出来的对象在堆里
/*s3位于栈里面,他在方法区的常量池里面看看有没有这个字符串,没有的话,
直接创建了一个地址为0x99的字符串lxl
*/
String s3="lxl";//直接赋值 s3指向的是常量池里的“lxl”
String s5="lxl";
//s4位于堆,在常量池里发现有一个lxl的字符串,然后指向0x99
//---s4指向的是堆中对象 ,然后堆中对象指向的是
String s4=new String("lxl");//调用构造器
System.out.println(s3==s5); //t
System.out.println(s3==s4); //f
System.out.println("s3.equals(s4):"+s3.equals(s4));//equals比较的是具体的值
System.out.println(s3==s5.intern());
/* s4指向的是堆 ,s5.intern()指向的是常量池中的字符串地址 */
System.out.println(s4==s4.intern());
System.out.println(s3.intern());
String a="java";
String b="java";//a,b指向的是常量池中存储“java”字符串的地址
System.out.println("a==b:"+a==b);
int a1=1;
int b1=1;
System.out.print("a1==b1:");
System.out.println(a1==b1);
String x=new String("xyz");
String y=new String("xyz");
System.out.println("x==y:"+(x==y));//F
Person p1=new Person();
Person p2=new Person();
p1.name="me";
p2.name="me";
//p1.name和p2.name指向堆,然后再指向常量池中字符串的地址
System.out.println("p1.name==p2.name:"+(p1.name==p2.name));//T
//"me"指的也是字符串常量池中的地址
System.out.println("p1.name==me:"+(p1.name=="me"));//T
// Integer a=12;
// Integer b=12;
// System.out.println(a==b);
// System.out.println(a.equals(b));
}
static class Person{
String name;
void Person(){
}
}
}
运行结果:
内存分析图
相关衔接:https://www.bilibili.com/video/BV1fh411y7R8?p=469&spm_id_from=pageDriver