Java初学常见问题
常见问题1:double和float浮点数比较相等问题
package cn.javaBasic;
public class TestJavaDataType {
public static void main(String[] args) {
double num1 = 0.1;
float num2 = (float) (1.0/10);
System.out.println(num1);
System.out.println(num2);
System.out.println(num1==(double)num2);
float num3 = 33333333333333333f;
System.out.println(num3==num3+10);
float num4 = 0.10f;
float num5 = 0.11f;
System.out.println(num5-0.10f);
System.out.println(num5-0.10f==num4);
}
}
以上问题是常见的一个坑,我们在学习中也经常会遇到这种问题,包括浮点数比较相等,浮点数加法,浮点数比较大小,我们采取的原则是:只要能避免使用浮点数比较,就尽可能地避免。
对于比较两个数是否相等,我们地解决方案:
//方法1,对于精度要求不是很高的情况下
final double esp = 0.000001f;
if(num5-0.10f-num4<esp){
System.out.println("相等");
}
/*使用BigDecimal类型的equals方法或compareTo方法,使用字符串形式的float型和double型构造BigDecimal:BigDecimal(String val)。
BigDecimal的euquals方法是先判断要比较的数据类型,如果对象类型一致前提下同时判断精确度(scale)和值是否一致;
compareTo方法则不会比较精确度,把精确度低的那个对象转换为高精确度,只比较数值的大小。*/
System.out.println(new BigDecimal("1.1").equals(new BigDecimal("1.10")));//false
System.out.println(new BigDecimal("1.1").compareTo(new BigDecimal("1.10"))==0);//true
常见问题2:new String()创建几个对象?
String s1 = new String("hello");
String s2 = "hello";
常见问题3:==和equals的区别
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
常见问题4:Java变量的作用域问题
- Java用一对大括号作为语句块的范围,称为作用域,作为在作用域里定义的一个变量,它只有在哪个作用域结束之前才可使用。
- 同一个作用域中不能重复定义一个变量
在同一作用域范围的包裹下成员变量名和局部变量名是可以变量名相同的,在同一个作用域范围的包裹下局部变量和局
部变量不可以变量名相同(作用域内不能重复命名),在方法中使用变量的时候如果不指明使用成员变量还是局部变
量,那么默认的就是使用局部的那个变量,但是如果局部变量超出了它本身的作用域范围则会失效,被JVM垃圾回收,
那么则可以重复命名此变量,并使用最新定义的这个局部变量。