本文由网友大力支持: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文件中除了有类的版本、字段、方法、接口等描述信息外还有一项信息是常量池。
常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。
网友评论