• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Nobody

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

字符串相加不一定相等

public class demo01 {
      public static void main(String[] args) {
            String s1 = "hellojava";
	    String s2 = "hello";
	    String s3 = "java";
	    String s4 = "hello" + s3;
	    String s5 = s2 + "java";
	    String s6 = s2 + s3;
	    String s7 = "hello" + "java";
	    String s8 = new String("hellojava");
	    System.out.println(s4);
	    System.out.println(s1 == s4);
	    System.out.println(s5);
	    System.out.println(s1 == s5);
	    System.out.println(s6);
	    System.out.println(s1 == s6);
	    System.out.println(s7);
	    System.out.println(s1 == s7);
	    System.out.println(s8);
	    System.out.println(s1 == s8);
	 }
}

输出结果:

	hellojava
	false
	hellojava
	false
	hellojava
	false
	hellojava
	true
	hellojava
	false
	false

为什么结果会不同?![]

  1. 事实上并不是表面看起来这么简单,给字符串直接赋值的在java看来其实就是常量,他们会被放到常量池中,存储地址为常量池地址,另外,常量池中的常量是唯一的,这就很好解释s7是true
  2. 对于s8,s8是new出来的,new出来的一律在堆中,自然而然与s1不相等。
  3. 对于s4,s5,s6,这三个本质上其实是一样的,这三个赋值式中,都有变量,对于这种变量加常量,常量加变量,变量加变量这三种来说,对于String类型的变量java在执行的时候会给变量new出一个对象(StringBuilder)然后调用append方法,进行字符串的拼接。既然是new出来的那么地址自然就在堆内存中。
  4. 对于s8和s9,两个都是new出来的,地址根本不一样,自然不相等

总结:所以来说 字符串+字符串不一定等于字符串
字符串常量 + 字符串常量 = 字符串常量

posted on 2020-05-15 22:51  A_Nobody  阅读(207)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3