Java初学常见问题

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);//0.1
        System.out.println(num2);//0.1
        System.out.println(num1==(double)num2);//输出false
        float num3 = 33333333333333333f;
        System.out.println(num3==num3+10);//true
        float num4 = 0.10f;
        float num5 = 0.11f;
        System.out.println(num5-0.10f);//0.009999998
        System.out.println(num5-0.10f==num4);//false
    }
}

        以上问题是常见的一个坑,我们在学习中也经常会遇到这种问题,包括浮点数比较相等,浮点数加法,浮点数比较大小,我们采取的原则是:只要能避免使用浮点数比较,就尽可能地避免。
		对于比较两个数是否相等,我们地解决方案:
		//方法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()创建几个对象?
/*以下两种方法可以创建字符串“hello”的存放位置是不同的,第一种存放在堆上,
第二种存放在常量池中,当采用第一种方法new String("hello")的时候,首先会检查常量池中
是否有"hello"字符串,如果有,则在堆上创建一个"hello"的String对象;
如果没有,则需要同时在常量池中创建一个。综上,采用new String可能创建一个或者两个对象,
但是采用第二种方法,先检查常量池,有则不创建,没有则创建,故第二种方法会创建1个或者0个对象。
*/
String s1 = new String("hello");//堆
String s2 = "hello";//常量池
常见问题3:==和equals的区别
/*
1)==,比较的是值是否相等,,如果作用于基本数据类型的变量,则直接比较其存储的 值是否相等,
如果作用于引用类型的变量,则比较的是所指向的对象的地址是否相等。
2)对于equals方法,比较的是是否是同一个对象
首先,equals()方法不能作用于基本数据类型的变量,另外,equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,
所以说所有类中的equals()方法都继承自Object类,在没有重写equals()方法的类中,调用equals()方法其实和使用==的效果一样,
也是比较的是引用类型的变量所指向的对象的地址,
不过,Java提供的类中,有些类都重写了equals()方法,重写后的equals()方法一般都是比较两个对象的值,比如String类。
*/
        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1==s2);//false
        System.out.println(s1.equals(s2));//true
常见问题4:Java变量的作用域问题
  • Java用一对大括号作为语句块的范围,称为作用域,作为在作用域里定义的一个变量,它只有在哪个作用域结束之前才可使用。
    在这里插入图片描述
  • 同一个作用域中不能重复定义一个变量
    在这里插入图片描述
在同一作用域范围的包裹下成员变量名和局部变量名是可以变量名相同的,在同一个作用域范围的包裹下局部变量和局
部变量不可以变量名相同(作用域内不能重复命名),在方法中使用变量的时候如果不指明使用成员变量还是局部变
量,那么默认的就是使用局部的那个变量,但是如果局部变量超出了它本身的作用域范围则会失效,被JVM垃圾回收,
那么则可以重复命名此变量,并使用最新定义的这个局部变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w͏l͏j͏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值