• Java,猜猜输出是什么?


    看看下面代码的输出是什么:

    public class MemoeryManager {
        public static void main(String[] args){
            String a="a";
            String b="b";
            String ab="ab";
            final String af="a";
            String plus=a+"b";
            String result=af+"b";
            System.out.println((a+b)==ab);
            System.out.println("a"+"b"==ab);
            System.out.println(result==ab);
            System.out.println(plus==ab);
            System.out.println(plus.intern()==ab);
        }
    }

    输出是:

    false
    true
    true
    false
    true

    解释:

    • (a+b)==ab

      a+b是两个变量相加,需要到运行时才能确定其值,到运行时后JVM会为两者相加后产生一个新的对象,因此a+b==ab的结果为false。

      ● (“a”+”b”)==ab

      “a”+”b”是常量,在编译时JVM已经将其变为”ab”字符串了,而ab=”ab”也是常量,这两者在常量池即为同一地址,因此(“a”+”b”)==ab为true。

      ● result==ab

      result=afinal+”b”,afinal是个final的变量, result在编译时也已经被转变为了”ab”,和”ab”在常量池中同样为同一地址,因此result==ab为true。

      ● plus=ab

      plus和a+b的情况是相同的,因此plus==ab为false。

      ● plus.intern()==ab

      这里的不同点在于调用了plus.intern()方法,这个方法的作用是获取plus指向的常量池地址,因此plus.intern()==ab为true。

          String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到String池上。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

          (也就说,一个String对象可能是指向堆的,也可能是指向池的,并且在运行时生成的String,貌似都指向堆?这个不能肯定,以后确定。)

  • 相关阅读:
    web前端之 CSS
    web前端之 HTML标签详细介绍
    web前端之 HTML介绍
    c++之 scanf 接收用户输入内容
    JQ 全选、全不选
    java 除法向上,向下取整
    Java使用占位符拼接字符串
    eclipse远程debug
    阿里 drds 分布式数据库分节点查询
    Mysql 修改字段长度、修改列名、新增列、修改自增主键起始值
  • 原文地址:https://www.cnblogs.com/orchid/p/3359336.html
Copyright © 2020-2023  润新知