bigdecimal 比较_Java之常用类——Object、Scanner、Date、Random、BigDecimal类

文章前言

学完Java的数组类,我们继续看Java常用类的Object类、Scanner类、Date类、BigDecimal类、Random类。看起来有点多,但其实有的了解就行。

Scanner类

对于位于java.util包下的Scanner类,我们前面有提到说这个类可以接收用户的输入,但只是简单的提了它的next()和nextInt()两个方法而已。但有实践的小伙伴们可能就会发现,这两个方法只能接收输入的一个整数或字符串而已,如果我们想要输入一行或者小数的话,这两个方法是不够的,所以我们又引入的几个常用方法:

71e92070ba5628c7caaffa1efdd03733.png

因为我们用Scanner类一般都是接收输入而已,所以我们重点介绍几个常用的接收方法。

1、从上图可以知道如果我们想要接收其他基本数据类型的数据的时候,我们可以直接调用next+基本数据类型名称首字母大写()的方法来接收。

2、接收一行的话用nextLine()这个方法。

注意事项

nextLine和其他方法的一些区别,这里我们需要掌握,不然读者可能会像作者曾经那样百思不得其解:

对于next()和next+基本数据类型名称()这些方法来说,它会自动跳过一些空格,回车等符号,直到读取到有效字符的个数满足需求的时候回车才会依次接收输入,而nextLine因为接收一行所以任何字符都可以接收,于是乎会出现下面的现象:

582e525e1e7d307ffc51de9def8de465.png

以上代码的本意是接收一个数字来定义数字的长度,然后依次接收用户输入的一行作为字符串存起来,但按照本意输入数字后应该还要再输入3个字符串才对,但是才输入两个就停止了,这是为什么呢?好好理解我们上述的那段红字,然后我们输入的话我们其实可以看成是这样的,我们输入3之后按了回车于是输入的第一行变成了

3\n

由于我们int类型只需要一个,所以3被nextInt()拿走了,剩下:

\n

然后继续输入就可以看成是:

\n

小明\n

小红\n

到了小红\n的时候,有效字符已经符合要求了,所以我们nextLine()依次读取每一行\n前面的内容,第一行为虽然只有一个\n,但它还是接收了,之后接收小明,然后小红。于是就出现了上述的情况。

那怎么解决呢?只能在接收输入用户输入的一个字符后加一个Scanner类的nextLine方法把回车的符号删除了。

Object类

对于我们Java的万类之父——Object类,我们不得不去了解它。我们查看API文档,会发现其实这个类的方法很少:

6307d3c4581b80c4236bb61307bdd6b8.png

只有以上这几个,而且我们目前不用都了解,因为有的方法到了后面集合或者线程的时候才会讲解。今天,我们主要来看看它的toString()和equals()这两个方法:

对于toString()方法,我们之前已经差不多讲完了,在这里我们就简要提下,对于toString()方法,我们在每次的System.out.println()的时候底层就会调用了,而看源代码会发现输出的是一大堆数字,这在输出我们自己的类的时候出现了尤其明显:

399dc7eab8ef187797ea34bf9111560a.png

而读者应该会有疑问,为啥输入像String这种类的时候居然可以输出正常的值,这是因为它底层已经重写了toStirng方法,所以我们每个类不想输出的时候是一堆数字的时候,就应该重写toString()方法。换句话讲toString()方法就是为了被重写的!具体怎么重写其实很简单,看你想输出这个对象的什么属性,就在方法中把属性写上去就行。

而对于equals这个方法,就显得额外重要了!我们在比较数字是否相等的时候,在布尔表达式比较的时候会使用==号来比较,而对于类的对象引用,我们不能用==来比较了,因为我们知道,类的对象引用保存的是这个对象的内存地址,而我们每new一个对象,就会在堆内存开辟一个新空间,这时候内存地址肯定不一样了。而==号比较的就是等号两边的值,所以直接用它来比较对象的引用肯定是会返回false的。

那我们要讲equals方法,以后比较类对象引用就用这个方法来比较嘛?只能说答对了一半,我们看equals的源代码:

b26734316fa5141fa01cbd1bc6884ee4.png

你会发现,这个父类的方法也是默认用==号在比较而已。所以其实不说我们应该也知道,我们也是需要重写equals方法的。看看String里有没有重写呢:

ba04418127c300acbb7b1ea6c778a47c.png

是有的,所以我们想要比较两个字符串是否相等,可以直接用equals方法就行。那我们应该怎么重写equals方法呢?别看String类重写的那么复杂,其实明白了原理,你也能自己重写的。

首先对于比较两个类对象引用是否相同,我们是不是可以拆成以下几个步骤:

1、如果传入的对象是空或者两个引用的类是不同的,肯定不相等

2、如果传入的对象和本身的内存地址一样,肯定相等

3、如果以上的条件不满足,那么就可以判断这个类里面的属性有哪几个需要相同,只有这些需要的属性都相同,才相等。

有了以上的三点我们就可以简要的自己写出equals的实现方法,如:

7fe377fd27d4ffca8c067fce1222ee5e.png

对比eclipse自动生成的:

c60634910c8a1971c5a125f6a1b7622d.png

其实也没差多少。

所以对于Object类中的toString和equals方法,我们新建类的时候一般都要重写的。

Date类

Date日期类,位于java.util包下。对于这个类,我们有必要了解它的构造方法:

f657169e042f1aa611848bccfcb19966.png

其中我们经常用的就是Date()来获取当前日期和Date(long date)来获取从1970年1月1日00:00:00之后加上date毫秒数之后的日期。

而对于日期类的常用方法,这里作者就不再介绍,重点讲解日期和字符串之前的转换

1、日期转换为字符串这里需要用到java.text包中的SimpleDateFormat这个类,这个类可以让我们的日期类按特定的形式转成字符串,如:

6c714cfab2b6834a8f933c2902b416b3.png

这里SimpleDateFormat类的构造方法传参是有讲究的:

yyyy 表示年份

mm 表示月份

dd 表示天数

hh 表示小时数

mm 表示分钟数

ss 表示秒数

SSS 表示毫秒数

我们在构造方法的字符串里自己写想要的日期格式,到时候用该类的format方法就可以把这个日期转换成固定格式,并且称为字符串。

2、字符串转换为日期,还是用上面的类:c63239bd80a18d1714e9018fee38e994.png

用该类的parse方法可以将字符串转换为日期,动手的读者可能会发现如果直接写会报错,因为parse会抛异常(之后就会讲异常),这里直接选第一个抛出就行。

讲到日期这种关于时间的类,就不得不提到System类中有一个方法可以获取初始日期到我们现在的毫秒数:currentTimeMillis()方法:

2a70ad905d447240df303214e80ec6af.png

95a19802281f9c37db3823c89d9c2533.png

有了这个方法,我们就可以在方法前获取一次,方法后再获取一次,然后相减就可以获得这个方法的执行时间了。

BigDecimal类

对于这个类,作者就简要说下,不做扩展。只需要知道,在我们的Java中float和double都不能算是精度最高的数据类型,因为还有java.math包下的BigDecimal这个类:7733fd33536645f43e3638bc4497a215.png

输入值就用在构造方法传值,四则运算只能调用对应的方法。

Random类

对于java.uti包下的Random类,我们有时候需要用它来生成随机数,对于它的方法有:

f129d7eaff33a176ac5d32c47afe8ec0.png

我们最常用的就是用Random r = new Random();创建一个类,然后用r.nextInt();生成0到正无穷的整数值或r.nextInt(int n);来生成0到n的整数值。

a369ce33ba1085ff0f03a10c2a7be5b7.png

048fdfa7c8e0900f7794ef4f962635fd.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值