* @author 12091 * */ //java虚拟机的体系结构 :堆(heap) 、方法区(method Area)、本地方法栈(native method stack)、程序计数器(program counter register); //堆:存放动态new 出来的 对象 、数组;而且 数据 不能共享; //方法区:存放静态 变量,静态方法 、普通方法、常量、 字符串常量(严格说 放在 常量池 堆和栈都有)通俗的讲 就是 保存类的模板; //本地方法栈:存放 的是 对象的引用,局部变量;#数据共享 //程序计数器:速度最快且空间最小的一块区域,由编译器分配,我们对此没有直接的控制权; public class Equalorother { static String s1="java"; public static void main(String[] args){ String s2=new String("java"); //s2="java"+"ass"; System.out.println(s1==s2); System.out.println(s1.equals(s2)); String s3="java"; String s4="java"; String s5=s4+s3; String s6="javajava"; System.out.println(s3==s4);//这里为什么相等呢 ?因为 s3是存在常量池中的,当s4定义时,此时将s4放入栈中,然后在常量池中寻找是否有"java"字符串,若有就指向他 s3="ss";//而当s3被重新赋值的时候,你会想s4是不是也会被改变呢?答案是:不会。因为同样多的道理,s3被赋值时,刄会在常量池中寻找 "ss",若有指向他,若没有,开辟出内存给他, //且使得s3指向他。 System.out.println(s4+s3); System.out.println(s6==s5);//s5是指向 堆的 s6指向的是栈 显然 不相等。 //equals可以判断对象是否相等 下面 相等 System.out.println(s6.equals(s5)); } }