|
| |
精品推荐 |
 |
|
| |
|
|
|
|
达内金牌讲师唐亮Java语言细节(中)
|
日期:2007年12月27日 作者: 查看:[大字体
中字体 小字体]
|
String str1="hello";t` String str2="hello";H System.out.println(str1==str2);\5]+% 这说明str1和str2指向同一个对象,因为它们都是在对象池中拿到的,而下面的代码输出为false:0)BvDc String str3="hello"7xu{ String str4=new String("hello");YH System.out.println(str3==str4);8 因为在任何情况下,只要你去new一个String对象那都是创建了新的对象。JcW*? 与此类似的,在JDK5.0里面8种基本类型的包装类也有这样的差异:> Integer i1=5;//在对象池中拿^ Integer i2 =5;//所以i1==i2)T! Integer i3=new Integer(5);//重新创建新对象,所以i2!=i3R{ ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛 jxpB 对象池的存在是为了避免频繁的创建和销毁对象而影响系统性能,那我们自己写的类是否也可以使用对象池呢?当然可以,考察以下代码:*:s; class Student{d"'D private String name;v]D> private int age;>@e private static HashSet pool=new HashSet();//对象池pP~i1 ew#F2a public Student(String name,int age){jf e this.name=name;Lp pu this.age=age; X^4"B }zdO*:` ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛 4yBp //使用对象池来得到对象的方法r public static Student newInstance(String name,int age){A7b //循环遍历对象池%B for(Student stu:pool){uY4_ if(stu.name.equals(name) && stu.age==age){Ib!yH return stu;6;Rk(9 }K }Q1%g[o //如果找不到值相同的Student对象,则创建一个Student对象T //并把它加到对象池中然后返回该对象。0ac~ Student stu=new Student(name,age);.;=S pool.add(stu);$pO*h return stu;JdF }Vi o }©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛 ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛 H- public class Test{-G>_ public static void main(String[] args){yy Student stu1=Student.newInstance("tangliang",30);//对象池中拿+ Student stu2=Student.newInstance("tangliang",30);//所以stu1==stu2J p5 Student stu3=new Student("tangliang",30);//重新创建,所以stu1!=stu3B'@> System.out.println(stu1==stu2);i,:r4 System.out.println(stu1==stu3);)dg_ }eZA }© 6,2.0-1.1==0.9吗?Vz&]G0 考察下面的代码:3z"I double a=2.0,b=1.1,c=0.9;a if(a-b==c){$s System.out.println("YES!");i8 }else{)i System.out.println("NO!");`cQI }©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛 S 以上代码输出的结果是多少呢?你认为是“YES!”吗?那么,很遗憾的告诉你,不对,Java语言再一次cheat了你,以上代码会输出“NO!”。为什么会这样呢?其实这是由实型数据的存储方式决定的。我们知道实型数据在内存空间中是近似存储的,所以2.0-1.1的结果不是0.9,而是0.88888888889。所以在做实型数据是否相等的判断时要非常的谨慎。一般来说,我们不建议在代码中直接判断两个实型数据是否相等,如果一定要比较是否相等的话我们也采用以下方式来判断:Sb_ if(Math.abs(a-b)<1e-5){{h$?z //相等?yh< }else{/Z //不相等1]]z- }kx`jG 上面的代码判断a与b之差的绝对值是否小于一个足够小的数字,如果是,则认为a与b相等,否则,不相等。 7,判断奇数 以下的方法判断某个整数是否是奇数,考察是否正确:'L#a public boolean isOdd(int n){VJ1* return (n%2==1);Q6Dz }n 很多人认为上面的代码没问题,但实际上这段代码隐藏着一个非常大的BUG,当n的值是正整数时,以上的代码能够得到正确结果,但当n的值是负整数时,以上方法不能做出正确判断。例如,当n=-3时,以上方法返回false。因为根据Java语言规范的定义,Java语言里的求余运算符(%)得到的结果与运算符左边的值符号相同,所以,-3%2的结果是-1,而不是1。那么上面的方法正确的写法应该是:_ public boolean isOdd(int n){Y$;*\c return (n%2!=0);h5 }x (出处:清风下载学院)
上一篇:asp.net动态设置WebService引用
下一篇:达内金牌讲师唐亮Java语言细节(下)
|
| 达内金牌讲师唐亮Java语言细节(中) 相关文章: |
|
|
|
| 达内金牌讲师唐亮Java语言细节(中) 相关软件: |
|
|
|
|