学习java的人知道一个叫String的班。 是我们常用的班级。 那么,我们对这个班了解多少呢?
我来介绍一下这个班吧!
String这个类有两大模式。 一个是象池的概念,另一个是不变模式。
字符串类和目标池
我知道有两种方法可以得到String对象。 String str1='hello '; stringstr2=newstring(Hello ); 这两个String对象的创建方法有什么不同吗? 当然有区别。 不同的是,第一种方法是在目标池中获取对象,第二种方法是直接生成新对象。
在JDK5.0中,Java虚拟机将在启动时实例化九个对象池。 这九个对象池分别用于存储八种基本类型的包装类对象和字符串对象。 如果在程序中将字符串直接用双引号括起来,JVM会去查找String的对象池中是否有相同值的对象,如果有,则获取现成的对象,否则在对象池中创建对象并返回。
所以,我发现下面的代码输出true。 stringstr1='Hello '; String str2='hello '; system.out.println(str1==str2; 这表明str1和str2指向同一个对象。 所有这些都在对象池中获得,以下代码输出为false : stringstr3=' hello ' stringstr4=new string (' hello ' )。 system.out.println(str3==str4; 无论如何,如果你去了new的String对象,那就是创建了新的对象。
与此类似,在JDK5.0中,八种基本类型的包类也存在这些差异。
Integer i1=5; //在对象池中取
Integer i2=5; //所以i1==i2
integerI3=newinteger(5; //因为要重新制作新对象,所以i2!=i3
虽然存在对象池是为了避免频繁创建和销毁对象而影响系统性能,但是否可以在自己编写的类中使用对象池? 当然,请考察以下代码。 import java.util.*;
公共类student {
私有字符串名称;
私有输入;
privatestatichashsetpool=new hashset (;
//象池
公共student (string name,int age ) {
this.name=name;
this.age=age;
}
//如何使用对象池获得对象
publicstaticstudentnewinstance (string name,int age )。
for(studentstu:pool ) (/循环扫描池
if(stu.name.equals(name ) stu.age==age ) )
return stu;
}
}
//如果找不到具有相同值的Student对象,请创建Student对象
//将其添加到对象池并返回该对象。
sudentstu=newstudent(name,age );
pool.add(stu;
return stu;
}
}
class Test { (
publicstaticvoidmain (string [ ] args ) {
students tu1=student.new instance (' tangliang ',30 );
//在象池中取
students tu2=student.new instance (' tangliang ',30 );
//所以stu1==stu2
students tu3=new student (' tangliang ',30 );
//因为要重新制作,所以stu1!=stu3
system.out.println(stu1==stu2;
system.out.println(stu1==stu3;
}
}