包装类之常量池

2019-03-10  本文已影响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文件中除了有类的版本、字段、方法、接口等描述信息外还有一项信息是常量池。

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

上一篇下一篇

猜你喜欢

热点阅读