java吧 关注:1,266,438贴子:12,769,913
  • 9回复贴,共1

大佬们,想提一个关于编译和运行的问题

只看楼主收藏回复

String a = "a1";
String a1 = "a"+1;
System.out.println(a==a1);
这段代码的结果是true, 原因是a对象在字符串常量池中创建了一个a1,而a1对象因为字符串a和1是常量,所以在编译时就已经确定了是a1。
String b = "b1";
int bb = 1;
String b1 = "b"+bb;
System.out.println(b==b1);
而这段代码的结果是false,解释说原因是b对象在字符串常量池中创建了一个b1,而b对象因为bb是个变量所以不能确定,是false。
小弟想问一下为啥说编译期确定了值才是true,在运行期确定的值是false,代码到最后编译完了不还是需要运行吗?难道==里面的值在编译的时候就确定了所以即使运行了代码那个值也不变??百度看了好多感觉都没说到这点,求大佬们指教!


IP属地:广东1楼2018-10-30 08:43回复


    IP属地:广东来自Android客户端2楼2018-10-30 09:58
    回复
      2025-06-27 06:15:12
      广告
      别沉


      IP属地:广东来自Android客户端3楼2018-10-30 10:00
      回复
        不懂帮顶


        IP属地:广东来自Android客户端4楼2018-10-30 10:02
        回复
          String s1 = null;
          string s2="abc"
          System.out.println(s1+s2);
          输出啥


          IP属地:浙江5楼2018-10-30 10:04
          回复(3)
            ==判断的是不是同一个对象;
            "a1"会当作一个常量存起来, 而a这个变量刚好指向了这个常量;
            "a" + 1也会当作一个常量, 刚好常量池里面有这个常量,所以a1变量也会指向这个常量;
            同时指向同一个对象,所以true;
            可以去看看堆和栈相关的知识;


            IP属地:广东6楼2018-10-31 10:30
            收起回复