异常补充
Objects(JDK7)
Objects类是在JDK7之后新增的一个工具类(位于java.util包中),内部提供的方法都是静态方法,因此可以直接通过类名称调用;Objects类主要提供了对于对象的一些空指针安全的访问方法(研究源码得知),比如对象的比较可以使用:Objects.equals(o1,o2)
,判断对象是否为空可以使用:Objects.isNull(obj)
,确保对对象不为空的检查可以使用Object.requireNonNull(obj)
等。
示例如下:
public class ObjectsDemo { public void change(User u){ Objects.requireNonNull(u); u.setName("admin"); } public static void main(String[] args) { String s1 = null; String s2 = null; //原始的比较方法 // if(s1 != null){ // System.out.println(s1.equals(s2)); // } //Objects的比较方法 System.out.println(Objects.equals(s1, s2)); User u = new User("softeem", "123"); User u2 = new User("softeem", "123"); System.out.println(u == null); System.out.println(Objects.isNull(u)); System.out.println(Objects.nonNull(u)); //确保对象重写equals或hashCode System.out.println(Objects.equals(u, u2)); } }
Math&Random
Math类
Math类是由java.lang包提供的一个用作数学相关操作的类,该类为final类,内部提供的所有方法都是static的,并且该类未对外提供公开的构造方法,因此无法在外界直接创建对象。
Math类的常用方法如下:
public class MathDemo { public static void main(String[] args) { //获取圆周率 System.out.println(Math.PI); //绝对值 System.out.println(Math.abs(-100)); //向上取整 System.out.println(Math.ceil(10.01)); //向下取整 System.out.println(Math.floor(9.9999)); //四舍五入 System.out.println(Math.round(9.5)); //分页中: 总记录条数,每页大小数?要求获取总页数? int totalNum = 108; int pageSize = 10; long totalPage = 0; if(totalNum % pageSize == 0){ totalPage = totalNum / pageSize; }else{ totalPage = totalNum / pageSize + 1; } //使用Math类完成总页数计算 totalPage = (int)Math.ceil((double)totalNum/pageSize); System.out.println(totalPage); //比较大小返回较大的一个数 System.out.println(Math.max(10, 20)); //比较大小返回较小的一个 System.out.println(Math.min(10, 20)); //对指定数值开平方根 System.out.println(Math.sqrt(9)); //求第一个的数值的第二个数次幂 System.out.println(Math.pow(2, 4)); //返回一个0.0(包含)~1.0(不包含)之间随机数 System.out.println(Math.random()); //从1-10之间随机获取一个整数? 5-10? System.out.println("---------"); for (int i = 0; i < 100; i++) { // int n = (int)(Math.random() * 10) + 1; int n = (int)Math.ceil(Math.random()*10); System.out.println(n); } } }
Random类
Random类是Java.util包中提供的一个基于伪随机流,用于生成随机数的工具类,该类中提供了一系列用于产生伪随机数据的方法,如:nextBoolean(),nextDouble(),nextInt()等.
Random类用法如下:
public class RandomDemo { public static void main(String[] args) { Random r = new Random(); System.out.println(r.nextInt(10)); //从一个数组中随机产生一名中奖观众? String[] names = {"易大师","盖伦","艾希","玛尔扎哈","提莫","菊花信"}; System.out.println(names[r.nextInt(names.length)]); } }
基于Random类实现一个随机位数的验证码生成器
import java.util.Random; public class ValidateUtils { //ctrl+shift+x/y(大小写转换) static String s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static String genVCode(int count){ Random r = new Random(); //声明临时变量用于存储生成的验证码字符串 String code = ""; //循环count次获取每次取到的字符 for(int i = 0;i<count;i++){ //随机产生一个索引(0~s.length()-1) int index = r.nextInt(s.length()); //把每次获取的字符拼接到字符串中 code += s.charAt(index); } //循环结束后返回生成的字符串对象 return code; } public static void main(String[] args) { //生成并输出长度为6的验证码字符串 System.out.println(genVCode(6)); } }
BigDecimal&DecimalFormat
BigDecimal
由于计算机对浮点数运算时,可能导致精度丢失问题(如double类型0.1和0.2做相加运算时,实际结果不是0.3,而是0.30000000000004),因此Java中提供了一个BigDecimal(java.math.BigDecimal)类型用于表示精确的数值,在对数值类型做运算需要保证精度的情况下,可以使用BigDecimal中提供的相关方法实现。
package com.softeem.lesson13.demo3; import java.math.BigDecimal; import java.text.DecimalFormat; public class BigDecimalDemo { public static void main(String[] args) { double d1 = 0.1; double d2 = 0.2; System.out.println(d1 + d2); BigDecimal bd1 = new BigDecimal("0.1"); BigDecimal bd2 = new BigDecimal("0.3"); //相加 BigDecimal d = bd1.add(bd2); System.out.println(d.toString()); System.out.println(d.doubleValue()); //相减 d = bd2.subtract(bd1); System.out.println(d); //相乘 System.out.println(bd1.multiply(bd2)); //相除 System.out.println(bd1.divide(bd2,BigDecimal.ROUND_CEILING)); System.out.println(0.1/0.3); DecimalFormat fmt = new DecimalFormat("##.###"); System.out.println(fmt.format(0.1/0.3)); //12,312,343,123,213 //34.5% //$5.6 } }
DecimalFormat
java.text.DecimalFormat是一个用于对数值类型数据格式化(解析字符串为数值)处理的类,该类从java.text.NumberFormat类继承,里面提供了一些用于将数值类型表示为不同格式字符串转换方法(货币,百分比,千分数等);
实例如下:
public class NumberFormatDemo { public static void main(String[] args) { //根据本机环境获取货币格式化对象 NumberFormat fmt = NumberFormat.getCurrencyInstance(); String m = fmt.format(3650.5); System.out.println(m);//¥3,650.5 //获取百分比的格式化对象 fmt = NumberFormat.getPercentInstance(); m = fmt.format(0.4556); System.out.println(m);//46% //根据指定匹配模式格式化数值为字符串(百分比) fmt = new DecimalFormat("##.##%"); m = fmt.format(0.4556); System.out.println(m);//45.56% //根据指定匹配模式格式化数值为字符串(千分比) fmt = new DecimalFormat("##.##\u2030"); m = fmt.format(0.4556); System.out.println(m); //198200 1.982*10E5 科学计数法 fmt = new DecimalFormat("#.###E0"); m = fmt.format(198200); System.out.println(m); //将一个字符串表达式,根据指定的格式解析为数值类型 String s = "45.6%"; // 0.456 fmt = new DecimalFormat("##.#%"); Number num = fmt.parse(s); double d = num.doubleValue(); System.out.println(d); } }