比较Java中的字符串是否相等

时间:2022-02-15 16:16:51
1.常量池


  指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。


2.==: 比较是否是同一个对象


3.equals(): 比较的是对象里的内容


---------------------------------------------
下面我开始说区别


第1种:


  String a="abc";
  String b="abc";
  System.out.print(a==b);
  
  结果:true


  原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。


---------------------
第2种:


  String a=new String("abc");
  String b=new String("abc");
  System.out.print(a==b);


  结果:false


  原因:用构造器创建的对象,是不会被放入常量池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。


------------------------------
第3种


  String a="abc";
  String b=new String("abc");
  System.out.print(a==b);


  结果:false


  原因:同上


---------------------------
第4种


  String a="abcdef";
  System.out.print(a=="abcdef");


  结果:true


  原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。


-------------------------------------------
第5种


  String a="abcdef";
  String b="";
  String c= a + b;
  System.out.print(c=="abcdef");


  结果:false


  原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。