API
    概念:Application Programming Interface
    JDK提供的各种工具类 使用封装 将特定的方法执行过程打包 我们只需要去学习使用方法

    Object类
    超级类 所有类的父类 定义了其他类都具备的方法 允许其他类重写这些方法
    例如 toString() equals() hashCode()…

    String类
    使用””保存的数据 都是字符串类型
    String str1 = new String(“abc”);
    String str2 = “abc”;

    1. 特点:
    2. **保存的值是永不可变
    3. 字符串是可以共享使用的
    4. 字符串从效果上看 相当于char[] 但是底层原理是byte[]字节数组 万物皆字节
    5. 只要涉及到地址(堆内存中的地址 还是 栈空间中地址) 都要采用equals方法进行比较值
    6. String str2 = "a"+"bc";
    7. String str3 = "ab"+"c";
    8. System.out.println(str2==str3);//true
    9. String str4 = "b";//str4在栈中有自己的空间
    10. str2 = str4+"abc";
    11. str3 = str4+"abc";
    12. System.out.println(str2==str3);//false
    13. 拓展:如果是比较两个自定义类型 那么按需求比较两个对象的属性值是否相同
    14. (两个自定义类型的对象 地址必然不同 但是使用.equals()比较 他是去调用Object父类的此方法 比较的依然是地址)
    15. 所以应在实体类中去重写equals() (类似于String类型中重写比较方法一个思路) 快捷键自动生成
    16. 1.方法名(要和功能关联记忆) 2.所属的类型 3.方法需要的参数 4.方法的返回值
    17. 判断字符串是否为空
    18. == null 直接没有对象 不能调用方法
    19. 由对象 判断里面的值是否存在
    20. .length()==0
    21. .isEmpty() true
    22. .equals("")
    23. boolean .equals(Object)
    24. char .charAt(int)
    25. String .toString()
    26. int .length()
    27. int .compareTo("") 比较两个字符串在字母表中的先后顺序 不忽略大小写
    28. int .compareToIgnoreCase("") 忽略大小写比较两个字符串在字母表中先后顺序
    29. String .toUpperCase() 全变大写
    30. String .toLowerCase() 全变小写
    31. String .concat(String) 拼接
    32. int .indexOf(String) 查找当前字符串中参数第一次出现的下标
    33. int .indexOf(String,int) 从第二个参数表示的下标开始查找 第一个参数出现的下标
    34. int .lastIndexOf(String) 倒着查找
    35. int .lastIndexOf(String, int)
    36. String .subString(int) 从参数表示的下标开始一直取到末尾 .subString(int,长度)
    37. Stirng .subString(int 起始下标,int 结束下标+1)
    38. boolean .startsWith(String) 以...开头
    39. boolean .endsWith(String) 以...结尾
    40. boolean .contains("") 判断某个字符是否存在
    41. String[] .split("") 根据某个字符串对原字符串切割 变为数组
    42. String String.join("",String[]) 将某个字符串数组以某个字符串进行连接返回字符串
    43. String .replace('f', '*');
    44. String .replaceAll("f", "");
    45. String .replaceFirst("f", "*"); 替换
    46. String .trim() 不能去掉中间的空格
    47. 练习:
    48. String str = "fsfasasdfasddf"; 查找中间这个a的下标
    49. 测试类中创建一个方法 method(String str) 功能为分别统计str 数字、大写字母、小写字母个数
    50. 练习:
    51. 将录入的字符串首字母变大写 其余字母变小写 判断是否以.class结尾 如果不是 则添加这个后缀
    52. 输入hAn Mei mEI 转换为Han Meimei

    String 增强类
    StringBuffer 线程安全的 效率低
    StringBuilder 线程非安全 效率高

    如果要保存的初始值大小 超出了默认的长度 则+16空间大小 把值保存进去
    如果修改的值大于原长度 进行数组扩容 创建新数组 长度为原来的一倍+2 老数组赋值给新数组

    区别:
    String保存的值是不可变的 常量池
    增强类保存的值是可变的 以char类型数组形式保存

    String .toString() 转换为String类型
    .append() 连接
    .delete(int,int) 移除[ )部分字符串
    .insert(int,””) 在确定位置新增字符串
    .replace(int,int,String) 将范围内的内容替换为新的内容
    .reverse() 逆序输出

    练习:输入hAn Mei mEI 男/女 转换为 姓:Han 名:Meimei male/female

    Math
    数学类
    Math.abs(数值) 绝对值
    Math.PI 圆周率
    Math.random() 随机数[0,1)

    Random ran = new Random();
    ran.nextInt(参数);
    
    .ceil(参数) 向上取整  正负数正常考虑
    .floor(参数) 向下取整 正负数正常考虑
    .pow(a,b)  a的b次方
    .sqrt(参数)  开平方
    .round(参数)   对参数进行四舍五入
     正数:四舍五入  负数:五舍六入
     内部算法:+0.5  正数:向下取整   负数:向上取整
    

    BigDecimal类
    提供一个展示的规范
    构造方法 不推荐 参数为小数会出现无尽小数
    BigDecimal bd = new BigDecimal(8.97);
    需要转成String类型
    BigDecimal bd1 = new BigDecimal(“8.97”);
    推荐使用valueOf()
    BigDecimal bd2 = BigDecimal.valueOf(8.97);

    基本运算方法
    加法
    .add(BigDecimal)
    减法
    .subtract(BigDecimal)
    乘法
    .multiply(BigDecimal)
    除法
    System.out.println(bd2.divide(bd3, 2 ,BigDecimal.ROUND_FLOOR));保留小数 向下取整
    System.out.println(bd2.divide(bd3, 1 ,BigDecimal.ROUND_UP));保留小数 向上取整
    System.out.println(bd2.divide(bd3, 4 ,BigDecimal.ROUND_HALF_UP));保留小数 四舍五入
    
    //定义数字展示规范
    DecimalFormat 
    .format(参数) 将参数按照指定的规范 进行展示
    
    1.设定标准
    DecimalFormat df = new DecimalFormat("0.000");
    2.通过标准对象.format()
    System.out.println(df.format(5.67895));
    
    DecimalFormat df1 = new DecimalFormat("#.##%");
    System.out.println(df1.format(0.67895));
    

    总结对比:
    基本数值类型:byte short int long float double
    做直接的运算非常方便
    Math类:
    都是静态方法 和 静态属性 指数 对数 三角函数等方法 随机数
    BigDecimal类:
    因为double float 不能表示精确的小数 当需求中精度要求比较高时 使用此类
    银行系统 高科技
    DecimalFormat类:
    只负责控制结果的精度 通过创建规范 调用format() 返回String

    Date util.Date
    构造方式:
    Date date = new Date(); date就表示当前计算机的时间
    Date date = new Date(long); 表示从1970年1月1日经过参数这么多毫秒后的时间
    Date date = new Date(int year,int month,int date);
    Date date = new Date(int year,int month,int date,int hours,int minutes);
    Date date = new Date(int year,int month,int date,int hours,int minutes,int seconds);
    通过构造方法传参形式获取时间对象的话 要注意 年要-1900 月要-1
    .getTime(); 当前时间对象表示的日期距离1970年1月1日0点的毫秒数
    long System.currentTimeMillis() 记录当前时间距离1970年1月1日0点的毫秒数
    标准化输出时间SimpleDateFormat类设定标准
    &&标准中的各个时间 一定要用特定的字符
    SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
    1.将Date记录的西方表示法 转换为String类型 并且按照定义的格式String sdf.format(Date)
    String dateStr = sdf.format(new Date());
    2.将一个符合标准的String 转换为一个对应的Date时间对象Date sdf.parse(String)
    Date newDate = sdf.parse(“1980-05-10 20:20:20”);

    通过构造方法
    通过parse() 把一个String 转成Date
    通过Calendar类  getTime()  把Calendar类的对象 转成Date
    

    Calendar 日历类 抽象类
    /
    Calendar calendar = Calendar.getInstance(); //获取Calendar对象
    System.out.println(calendar); //所有信息
    System.out.println(calendar.getTimeInMillis());//毫秒数
    calendar.set(2020, 5, 1);//通过三参 直接传入年月日 也有五参 注意月
    calendar.set(1990,11,5,21,34,5);//通过六参 直接传入年月日时分秒
    System.out.println(calendar.get(Calendar.DATE)); //展示某个属性
    calendar.set(Calendar.YEAR, 1995); //设置某个属性
    calendar.add(Calendar.YEAR, -5); //对某个属性进行增减
    Date date = calendar.getTime(); //转换为Date对象
    */

         /*
         * 
         * YEAR      年
         * MONTH     月-1
         * DAY_OF_MONTH  月中某天
         * HOUR         小时    12小时制
         * HOUR_OF_DAY       24小时制
         * MINUTE     分钟
         * SECOND    秒
         * DAY_OF_WEEK   周中的某天  星期几  周二:3 周三:4 周一:2      周日:1    +1
         * 
         */
    

    学习API:
    了解类的主要功能
    如何创建类对象
    有哪些属性 及意义
    有哪些方法 及意义