关于String a = "AA";和String b = new String("AA");的区别


先说几个概念吧

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。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 在编写程序的过程中,不了避免的要用到字符串,所以String类的常用方法的用法是必须掌握的。学习一个类的使用方法最...
    Geg_Wuz阅读 1,307评论 0 4
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,526评论 0 3
  • final关键字(最终) final修饰的类无法被继承. final修饰的方法无法被覆盖. final修饰的局部变...
    yangliangliang阅读 707评论 0 0
  • 猛地想一股脑扎进池水 忘却一切 那个我 在哪?
    二叔Sltsun阅读 286评论 0 4