美文网首页
包装类之常量池

包装类之常量池

作者: 南土酱 | 来源:发表于2019-03-10 12:35 被阅读0次

    本文由网友大力支持:https://www.jianshu.com/p/c7f47de2ee80

     8种基本类型的包装类和常量池

    Byte,Short,Integer, Long,Boolean,Character。

    Integer:

    Integer i1 = 40; Integer i2 = 40;   i1 == i2;

    //输出true;


    默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。但是,以下情况会输出false.

      Integer I1 = 50; 

    Integer I2 =  new Integer(50) ;

    //输出false( I1 ==  I2);

    Boolean这个就true和false,这个很容易理解

    Double:
    两种浮点数类型的包装类Float,Double并没有实现常量池技术。

    Float 也同样没有实现。

    Double i1=2.2; Double i2=2.2 ;  i1==i2 ;  //输出false

    String:

    Stringstr1 ="abcd";        Stringstr2 =newString("abcd");  (str1==str2); //false

    第一种方式是在常量池拿对象,第二种是直接在堆中创建一个新对象。 所以输出false。

    但是有一个方法:

    java.lang.String.intern();

    String的intern()方法会查找在常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池

    Stringstr1 ="abcd";       Stringstr2 =newString("abcd");  

     str1.intern()  == str2  ; //true

    这样会输出 true。

    运行时常量池 具备动态性 。在运行期间也可能将新的常量放入池中 。 用 intern 方法最多。

    另外一些情况如下:

    String s1 = "s";   String s2 = "f";

    String s3 = "sf";

    s3 == s1+ s2); //false

    s3 == "s"+ "f"); //true

    只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。 所以第一种输出 false。

    String s1 = new String("xyz"); **创建了几个对象? **

    1)类加载对一个类只会进行一次。"xyz"在类加载时就已经创建并驻留了(如果该类被加载之前已经有"xyz"字符串被驻留过则不需要重复创建用于驻留的"xyz"实例)。驻留的字符串是放在全局共享的字符串常量池中的。(2)在这段代码后续被运行的时候,"xyz"字面量对应的String实例已经固定了,不会再被重复创建。所以这段代码将常量池中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s1 持有。这条语句创建了2个对象。 

    常量池;

    常量池分为两种:静态常量池和运行时常量池。

    静态常量池也就是Class文件中的常量池,我们这里举一个简单的例子,下面是一个HelloWorld的与源文件和Class文件。

    运行时常量池:运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外还有一项信息是常量池。

    常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。

    相关文章

      网友评论

          本文标题:包装类之常量池

          本文链接:https://www.haomeiwen.com/subject/fokupqtx.html