Java笔记零碎补充(1):大数、用var声明局部变量、字符串
大数
当基本的整数和浮点数精度不能够满足你的需求的时候,我们就可以引入在java.math
包中的两个类——BigInteger
和BigDecimal
。这两个类可以处理任意长度的数值。
BigInteger
类可以处理任何精度的整数运算
,而BigDecimal
类可以处理任何精度的浮点数运算
。
它们的使用方法非常简单:
1 | BigInteger bi = new BigInteger("...");//大整数 |
bi / bd
处可以填入任意你想叫的名字,当然,最好还是尊重一下命名规则,除非你想让你的代码无人能够流畅阅读,甚至是刚睡了一觉的你。而...
处是填入你想要的给bi / bd
赋的数值。
我们也可以使用静态的valueOf
方法将普通的数转换为大数,就像这样:
1 | BigInteger bi = BigInteger.valueOf(100);//100这里可以改成别的数或者是变量 |
由于大数不是基础数据类型,我们就无法使用熟悉的算数运算符来处理大数,而是应该使用大数类型中的方法,下表列出最常见的运算:
BigInteger:
方法名称 | 说明 |
---|---|
add(BigInteger other) | 做加法运算 |
subtract(BigInteger other) | 做减法运算 |
multiply(BigInteger other) | 做乘法运算 |
divide(BigInteger other) | 做除法运算 |
remainder(BigInteger other) | 做取余数运算 |
pow(int n) | 做n次方运算 |
mod(BigInteger other) | 返回两个大数的和、差、积、商、余数 |
BigDecimal:
BigDecimal
基本运算大致与BigInteger
相同,但除法有所不同,因为需要考虑到除不尽末尾小数的处理方法。
方法名称 | 说明 |
---|---|
add(BigDecimal other) | 做加法运算 |
subtract(BigDecimal other) | 做减法运算 |
multiply(BigDecimal other) | 做乘法运算 |
divide(BigDecimal other) | 做除法运算 |
divide(BigDecimal other,int scale, roundingMode) | 做除法运算,三个参数分别代表除数,商后的位数,近似值的处理模式 |
近似值的处理模式有太多种了,这里只介绍一个,即最常见的四舍五入——ROUND_HALF_UP
。
来个例子吧:
1 | public class Test { |
用var声明局部变量
在Java10以上的版本,对于可以从变量初始值推导出他们的类型的,可以用var
关键词声明局部变量。
注意,一定是在Java10以上的版本,var
关键词是在该版本才引入的。
1 | var a = new Student("a", 18, 100); |
var
关键词避免了重复写类型名,优化了写代码体验与观感,非常便利。
字符串
子串
String
类中的substring
方法可以从字符串中提取出一个子串。
使用方法:
1 | String s1 = "Hello"; |
1
处填入的是截取开始的位置,3
截取结束的位置。(tips:字符串位置跟数组一样是从0开始的)
拼接
有截取的方法,那自然有拼接的方法,使用+
号就可以拼接起两个字符串:
1 | String s1 = "Hello"; |
当一个字符串与非字符串拼接时,非字符串就会转换成字符串进行拼接:
1 | String s1 = "Hello"; |
这种用法我们就常常用在输出结果。
当我们希望多个字符串放在一起的时候,我们也可以使用join
方法:
1 | String s1 = "Hello"; |
在Java11以上的版本,还提供了一个重复某个字符串多次的方法repeat
:
1 | String s1 = "Hello"; |
不可变字符串
Java的字符串与C语言的字符串不太相同,Java字符串不是一个数组,它的字符串不可以修改里面的某一个字符,想修改字符串,只能通过截取字符串,再重新拼接方式来修改:
1 | String s1 = "Helle"; |
判断字符串是否相等
虽然字符串不是一个数组,但是我们也不能通过==
来判断是否相等,而是应该用equals
方法来判断:
1 | String s1 = "Hello"; |
如果我们想让判断不区分大小写,我们还可以用equalsIgnoreCase
来判断。
==
判断符只能判断两个字符串是否在同一位置(地址)上,而不能真正判断是否相等:
1 | String str = "Hello"; |
构建字符串
如果我们遇到需要经常拼接的情况,例如读取按键的时候,我们采用上面那种字符串拼接方式,就会导致每次都要构建一个新的String
对象,既耗时又浪费空间,效率低下,这时候,我们使用StringBuilder
类就可以避免这个问题的发生。
首先我们需要构建一个空的字符串构造器:
1 | StringBuilder builder = new StringBuilder(); |
然后就可以使用StringBuilder
类的方法来构建字符串了,下面给出部分常用的方法:
方法名 | 作用 |
---|---|
append(String str / char c) | 添加一个字符串 / 代码单元 |
setCharAt(int i, char c) | 讲第 i 个代码单元替换为 c |
insert(int i, String str / char c) | 在 i 的位置插入字符串str / 代码单元 c |
delete(int i, int j) | 删除 i 到 j 的代码单元 |
在构建完字符串之后就可以使用toString
返回一个字符串了。
例:
1 | StringBuilder builder = new StringBuilder(); |
文件的输入输出
当我们需要读取一个文件,需要构建一个Scanner
对象:
1 | Scanner in = new Scanner(Path.of("test.txt"), StandardCharsets.UTF_8); |
Path.of("...")
这里面填入的是文件的位置,当你填入像上面那种相对地址时,该相对地址是相对于Java虚拟机启动目录的位置,实际上我认为还是填入绝对地址比较方便,例如c:\\testPath\\test.txt
、/home/icewindy/testPath/test.txt
。
StandardCharsets.UTF_8
很容易看出,这里填入的是文件的编码格式,如果不指定文件的编码格式,则会使用运行该程序的机器的“默认编码”,或许会导致不同平台上运行效果的差异,不建议这样使用。