[阶段一]Java基础类库(2)

来源:互联网 发布:java 参数null 编辑:程序博客网 时间:2024/05/21 12:46

课程内容

延续上次课的内容,今天继续讲Java基础类库。课程内容如下:

  1. StringBuffer——修改、插入、删除字符串,性能要优于String,并且线程安全,常常用于多线程里面
  2. StringBuilder——接口与StringBuilder的兼容,性能要优于StringBuffer,线程不安全,常常在单线程中使用
  3. Random——生成随机数,注意里面的随机种子概念
  4. BigDecimal——用于精确计算,防止精度丢失

看似简单的几个常用类,里面的细节还是很多的,例如使用BigDecimal的时候构造器的使用,如果是使用new BigDecimal(0.05),它依然存在精度丢失的问题。我们应该选择使用new BigDecimal(“0.05”)或者BigDecimal.valueOf(0.01) 进行初始化。

课堂作业

作业一:设计一个工具类(通用),实现两个double类型数据的加减乘除运算。
要求:传入double类型数据,返回结果也是精确的double
类名:ArithUtils (推荐类名)
提醒:对于除法运算,需要考虑四舍五入问题

package com.mashen.decimal;import java.math.BigDecimal;/** * 用于计算两个double类型数值 的精确结果的工具类 * @author tonyyls * @version v1.0 * */public class ArithUtils {    //默认除法运算精度    private static final int DIV_SCALE=5;    //构造函数私有,让这个类不能实例化    private ArithUtils(){}    //提供精确的加法运算    public static double add(double d1,double d2){        BigDecimal b1=BigDecimal.valueOf(d1);        BigDecimal b2=BigDecimal.valueOf(d2);        return (b1.add(b2)).doubleValue();    }    //提供精确的减法运算    public static double subtract(double d1,double d2){        BigDecimal b1=BigDecimal.valueOf(d1);        BigDecimal b2=BigDecimal.valueOf(d2);        return b1.subtract(b2).doubleValue();    }    //提供精确的乘法运算    public static double multiply(double d1,double d2){        BigDecimal b1=BigDecimal.valueOf(d1);        BigDecimal b2=BigDecimal.valueOf(d2);        return b1.multiply(b2).doubleValue();    }    //提供精确的除法运算    public static double divide(double d1,double d2,int scale){        BigDecimal b1=BigDecimal.valueOf(d1);        BigDecimal b2=BigDecimal.valueOf(d2);        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();    }    //提供精确的除法运算,允许传入精度    public static double divide(double d1,double d2){        BigDecimal b1=BigDecimal.valueOf(d1);        BigDecimal b2=BigDecimal.valueOf(d2);        return b1.divide(b2,DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();    }}

调用方式:

    public static void main(String[] args) {        double d1=0.03;        double d2=0.01;        System.out.println("0.03+0.01="+ArithUtils.add(d1,d2));        System.out.println("0.03-0.01="+ArithUtils.subtract(d1,d2));        System.out.println("0.03*0.01="+ArithUtils.multiply(d1,d2));        System.out.println("0.03/0.01="+ArithUtils.divide(d1,d2,2));    }

作业二:按照office word的标准字数统计方式,计算含有中文的字符串的实际长度(字符串长度)。
注意:字符串里面可能包含数字,汉字,特殊字符
规则:1个汉字长度是2,其他字符均计算为1

补充:这题目有点模糊,首先office 不同版本可能存在不同计算方式,另外WPS 和 office的计算方式不同。所以题目修改为:计算带有中文的字符串的实际长度。

package com.mashen.zhengze;public class AnalizeChinese {    //计算带有中文的字符串的长度    public static int calStringLength(String text) {        // 使用正则表达式匹配汉字        String reg = "^[\u4e00-\u9fa5]{1}$";        int result = 0;        //匹配每一个字符是否是汉字,汉字则长度为2,英文或者其它字符 为1        for (int i = 0; i < text.length(); i++) {            String b = Character.toString(text.charAt(i));            if (b.matches(reg)){                result+=2;            }else {                result+=1;            }        }        return result;    }    public static void main(String[] args) {        String text = "我在码神上课_励志成为伟大的Android工程师~";        System.out.println(calStringLength(text));    }}

课件

统一在上一篇文章中提供

1 0
原创粉丝点击