目录
根类 Object
Object是所有类的根类,提供了对象的基本方法
- getClass():获取所属类的Class对象
- hashCode():获取对象的hashCode,提供对hash表的支持
- equals():判断对象是否相等
- clone():克隆当前对象,得到一个对象副本
- toString()
- wait():
- notify():
- notifyAll():
- finalize():
数学操作 Math
Math.round(x) //四舍五入
Math.floor() //向下取整
Math.ceil() //向上取整
Math.min(x,y) //返回2个数中小的一个
Math.max(x,y) //返回大的一个
Math.random() //返回一个[0,1)之间的伪随机数
/是整除,如果2个操作数都是整数,则结果默认舍弃小数部分、只取整;只要有1个操作数是浮点数,结果就是浮点数。
数字格式化 NumberFormat、DecimalFormat
这2个类都可以格式化数字,只不过目标格式不同
NumberFormat
NumberFormat nf1 = NumberFormat.getCurrencyInstance(Locale.CHINA); //获取指定国家的货币格式,比如中国是¥,美国是$,参数为Locale类的常量
NumberFormat nf2 = NumberFormat.getIntegerInstance(); //整型数字格式,如果含有小数,先四舍五入转换为整数
NumberFormat nf3 = NumberFormat.getNumberInstance(); //通用数字格式,可以格式化所有类型的数字,保留原值、不四舍五入
// 格式化数字,返回字符串。从末尾起,每3位加一个逗号
String str1 = nf1.format(12345); //"¥12,345"
String str2 = nf2.format(12345); //"12,345"
String str3 = nf3.format(12345.678); //"12,345.678"
// 将格式字符串转换为数值,返回Number类型
try {
Number n1 = nf1.parse(str1); //12345
Number n2 = nf2.parse(str2); //12345
Number n3 = nf3.parse(str3); //12345.678
} catch (ParseException e) {
e.printStackTrace();
}
DecimalFormat
//舍弃小数部分,只保留整数部分(不是四舍五入)
DecimalFormat df1 = new DecimalFormat("#");
//保留2位小数
DecimalFormat df2 = new DecimalFormat("#.##");
//转换为百分数形式,%前面部分保留2位小数
DecimalFormat df3 = new DecimalFormat("#.##%");
//参数是数值型,返回的是String
String format = df1.format(60.5);
占位符可以使用#或者0,区别位数不足时,#不会自动填充,0会自动填充0。
eg. 60.5 保留2位小数
#.## => 60.5 不会自动填充0
0.00 => 60.50 位数不够会自动填充0
大数 BigInteger、BigDecimal
- int | Integer 只能表示正负21亿+范围内的整数,对于大整数,需要使用 BigInteger 表示。
- BigDecimal 是借助 BigInteger 实现的, 在 BigInteger 的基础上加入了小数位的概念。
- 计算机表示浮点数有误差,不管是单精度、双精度,还是浮点数的包装类型,都存在这个问题。为保证精度,创建 BigInteger、BigDecimal 实例时尽量使用字符串类型的入参,并通过 BigInteger、BigDecimal 自身提供的方法进行数学运算。
//使用字符串类型的入参
BigInteger bi1 = new BigInteger("1111111111");
BigInteger bi2 = new BigInteger("2222222222");
//add加,subtract减,multiply乘,divide除
BigInteger add = bi1.add(bi2);
BigInteger subtract = bi1.subtract(bi2);
BigInteger multiply = bi1.multiply(bi2);
//整除(直接舍弃小数部分,只保留整数部分)
BigInteger divide = bi1.divide(bi2);
//使用字符串类型的入参
BigDecimal db1 = new BigDecimal("1.00000000000000000");
BigDecimal db2 = new BigDecimal("2.00000000000000000");
//add加,subtract减,multiply乘,divide除
BigDecimal add = db1.add(bd2);
BigDecimal subtract = db1.subtract(bd2);
BigDecimal multiply = db1.multiply(bd2);
//如果除不尽,会直接抛异常
BigDecimal divide = db1.divide(bd2);
//所以尽量指定保留的小数位数,RoundingMode指定取舍模式
BigDecimal divide = db1.divide(db2, 2, RoundingMode.HALF_UP);
//转换为数值型,xxxValue()
double doubleValue = db1.doubleValue();
RoundingMode 枚举和 BigDecimal 内部定义的 ROUND_XXX 系列常量对应,可参考:https://blog.csdn.net/piaoranyuji/article/details/116594403
随机数 Random、ThreadLocalRandom
- Random、ThreadLocalRandom生成的都是伪随机数,生成的随机数是预测的,种子相同时生成的随机数相同
- 并发场景下多线程使用同一个Random对象时,多线程使用的是同一个种子,Random使用原子类+CAS算法保证线程安全,但多线程竞争种子的使用权严重拉低生成随机数的效率。
- ThreadLocalRandom是Random的子类,内部用ThreadLocal存储线程各自的种子,多线程下线程安全,且避免了多线程竞争种子,生成随机数的效率比Random高得多,推荐并发场景下使用ThreadLocalRandom。
- Math.random()是对Random的简易封装,实际使用的还是Random。
- 严格意义上来说,计算机自身不能生成真随机数,生成真随机数往往需要借助外部硬件设备,代价高昂。java.security.SecureRandom借助真实世界中的鼠标点击、按键点击等事件,模拟随机事件生成随机数,虽然生成的也是伪随机数,但比Random、ThreadLocalRandom要随机得多,更趋近于真随机。
Random random1 = new Random(); //默认以当前时间戳作为种子
Random random2 = new Random(1212121122323232L); //设置种子
int next = random1.nextInt(10); //返回[0,10)内的一个随机整数
int i = random1.nextInt(); //返回int范围内的一个随机整数
boolean b = random1.nextBoolean(); //随机生成布尔值
// ThreadLocalRandom是Random的加强版,在并发环境下资源占用更少,并且可以设置范围的下限
ThreadLocalRandom random = ThreadLocalRandom.current();