zoukankan      html  css  js  c++  java
  • 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,貌似都指向堆?这个不能肯定,以后确定。)

  • 相关阅读:
    C# 系统应用之通过注册表获取USB使用记录(一)
    web项目测试方法总结
    C#面向对象编程实例-猜拳游戏
    c#基础这些你都看过吗?(一)-----仅供初学者使用
    .NET事件监听机制的局限与扩展
    SQL代码
    泛型接口委托
    存储过程
    小操作
    DataGridView
  • 原文地址:https://www.cnblogs.com/orchid/p/3359336.html
Copyright © 2011-2022 走看看