第十七天课堂笔记
Java常用类
数学类★★★
math
-  java.lang.Math , 数学类 
-  round(x) : 四舍五入 , 把 x加0.5 后向下取整 
-  ceil(x) : 返回大于等于x的最小整数 , 向上取整 
-  floor(x) : 返回小于等于x的最大整数 , 向下取整 
-  sqrt(x) : 平方根 
-  cbrt(x): 立方根 
-  pow(a , b) : a的b次方 
-  random: 返回[0 , 1) 返回内的随机数 
-  max(a , b) , min(a , b) : 返回两个数中最大/最小值 
-  代码如下: public static void main(String[] args) {// random生成[0 , 1) 的随机数double random = Math.random();System.out.println("random = " + random);// 生成 [ min , max) 中的随机数int max = 10, min = 5;System.out.println("Math.random() * (max - min) + min = " + (Math.random() * (max - min) + min));// max(a,b) 返回较大值System.out.println("Math.max(123453, 543261) = " + Math.max(123453, 543261));// min(a , b) 返回较小数System.out.println("Math.min(123, 523) = " + Math.min(123, 523));// round(x) 四舍五入, x加上0.5后向下取整System.out.println("Math.round(3.5) = " + Math.round(3.5));System.out.println("Math.round(3.2) = " + Math.round(3.2));System.out.println("Math.round(-3.5) = " + Math.round(-3.5)); // -3System.out.println("Math.round(-3.9) = " + Math.round(-3.9)); // -4// ceil(x) 向上取整 : 返回大于等于x的最小整数System.out.println("Math.ceil(4.13) = " + Math.ceil(4.13)); // 5.0System.out.println("Math.ceil(-3.1) = " + Math.ceil(-3.1)); // -3.0// floor(x) 向下取整 : 返回小于等于x的最大整数System.out.println("Math.floor(3.6) = " + Math.floor(3.6)); // 3.0System.out.println("Math.floor(-3.6) = " + Math.floor(-3.6)); // -4.0// sqrt(a) 平方根System.out.println("Math.sqrt(100) = " + Math.sqrt(100)); // 10// cbrt(b) 立方根System.out.println("Math.cbrt(1000) = " + Math.cbrt(1000)); // 10// 次方powSystem.out.println("Math.pow(2, 10) = " + Math.pow(2, 10)); // 1024}
random
-  java.util.Random : 随机数类 
-  Random rnd = new Random() 创建随机数对象 
-  rmd.nextInt() : 随机整数 
-  rmd.nextDouble(): 随机小数 
-  rmd.nextInt(limit) : [0 , limit) 的随机数 , limit > 0 
-  jdk17新增方法 - nextInt(a , b) : [a , b)的随机数
- nextDouble(a . b): [a , b)随机小数
 
-  代码如下: public static void main(String[] args) {// 创建随机数对象Random random = new Random();// 生成随机整数 nextInt()System.out.println("random.nextInt() = " + random.nextInt());// 生成随机小数 nextDouble()System.out.println("random.nextDouble() = " + random.nextDouble());// 生成[0 , bound) 的整数, 且 limit > 0System.out.println("random.nextInt(20) = " + random.nextInt(20));// 生成[0 , bound) 随机小数System.out.println("random.nextDouble(30) = " + random.nextDouble(30));// jdk17新增方法 , 生成[origin , bound)之间的随机数System.out.println("random.nextInt(10 , 20) = " + random.nextInt(10, 20));}
decimalformat
-  java.text : 把小数 转换 为指定格式的字符串 
-  常见格式 : -  0 : 数字 , 不够四位自动补零 , 够了四舍五入 
-  #: 数字 
-  , : 千位 
-  . : 小数点 
  
-  
-  构造: 调用构造方法创建 , new DecimalFormat(“###,###.0000”); 
-  方法 - format(double) : 把 小数 根据定义的格式 转换为 字符串 : 小数 -> 格式化字符串
- applyPattern(“格式”) : 重新设置 模式串
 
-  代码如下: public static void main(String[] args) {// 调用,根据构造方法创建格式DecimalFormat decimalFormat = new DecimalFormat("###,###.0000");// 进行格式转换 , 0不够四位自动补零String format = decimalFormat.format(124322.445);System.out.println("format = " + format);// 从新设置模式串applyPatterndecimalFormat.applyPattern("000,000.###");System.out.println("decimalFormat.format(1234.56) = " + decimalFormat.format(1234.56));System.out.println("decimalFormat.format(45678912.456789) = " + decimalFormat.format(45678912.456789));}
biginteger/bigdecimal
-  大的整数类/大的小数类 
-  应用于 精度要求比较高的场景 
-  由于 int , long 整数取值受限 , 小数采用近似值保存不准确 => 采用有string参数的构造方法创建对象 
-  方法 -  add() 加 
-  subtract() 减 
-  multiply() 乘 
-  divide() 除 - 在大的小数的类中, 两个大的小数进行除操作, 当除不断的时候 , 会存在 java . lang.arithmeticException 算术异常
- 故需要调用的是 divisor(除数 , scale保留小数的位数 , roundingMode尾数的处理方式) 这个重载的方法
 
-  remainder() 取余 
-  代码如下: public static void main(String[] args) {// 小数采用的近似值保存,不准确System.out.println(2 - 1.1);BigInteger b1 = new BigInteger("3124325452345543545265622524145415");BigInteger b2 = new BigInteger("54235346522451515154454");// 加addSystem.out.println("b1.add(b2) = " + b1.add(b2));// 减subtractSystem.out.println("b1.subtract(b2) = " + b1.subtract(b2));// 乘multiplySystem.out.println("b1.multiply(b2) = " + b1.multiply(b2));// 除divideSystem.out.println("b1.divide(b2) = " + b1.divide(b2));// 取余 remainderSystem.out.println("b1.remainder(b2) = " + b1.remainder(b2));// 大的小数BigDecimal d1 = new BigDecimal("1243676453213432545332143222.457644134532");BigDecimal d2 = new BigDecimal("1243676453414141343222.45764532");// 加addSystem.out.println("d1.add(d2) = " + d1.add(d2));System.out.println("d1.subtract(d2) = " + d1.subtract(d2));System.out.println("d1.multiply(d2) = " + d1.multiply(d2)); // System.out.println("d1.divide(d2) = " + d1.divide(d2)); //.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.System.out.println("d1.divide(d2, 10, RoundingMode.CEILING) = " + d1.divide(d2, 10, RoundingMode.CEILING));System.out.println("d1.remainder(d2) = " + d1.remainder(d2));}
 
-  
枚举:
-  一组 常量的 组合 , 引用数据类型 
-  使用情况: 当某个类型的 变量取值范围 只有几个 离散值时 
-  使用 enum关键字 定义枚举类型 
-  赋值 : 只能赋值枚举常量 , 枚举名.常量; 
-  定义枚举类型后, 系统自动添加两个静态方法 - values() : 获得 该枚举类中 所有的枚举常量
- valueOf() : 将字符串 转换为 枚举常量
 
-  代码如下: public static void main(String[] args) {Season spring = Season.SPRING;System.out.println("spring = " + spring);// 获取所有的枚举常量Season[] values = Season.values();for (Season value : values) {System.out.println(value);}// 将字符串类型转换成枚举常量String str = "WINTER";spring = Season.valueOf(str);spring = Season.SUMMER;System.out.println(spring);}// 定义一个枚举类型 , 定义季节枚举类型的常量值enum Season {SPRING, SUMMER, AUTUMN, WINTER;}
-  数据类型的作用 - 决定数据类型的存储方式
- 决定数据类型的取值范围
- 决定数据允许的操作
 
日期类★★★
Date
-  Java.util.Date 日期类 , 是线程不安全的 
-  Date(long millis) : 根据毫秒值获取从1970-1-1年开始对应的时间 - CST: 中国标准时间
- millis 为 负值时 : 获取的是从1970-1-1年开始 往前 对应的时间
 
-  getTime() : 获得date对象 从1970-1-1年开始 对应的毫秒数 
-  时间戳: - System.currentTimeMillis()
- new Date().getTime()
 
-  转换 - 时间对象 转换成 指定格式 字符串 : SimpleDateFormat类 - 先通过SimpleDateFormat(String pattern) 创建个对象并指定日期格式串 - y年, M月 , d日 , H时 , m分 , s秒 , S毫秒
 
- 调用 该对象 的 format( date )方法 , 将date对象时间 返回成一个字符串
 
- 先通过SimpleDateFormat(String pattern) 创建个对象并指定日期格式串 
- 字符串 解析成 时间对象 - 首先也是通过SimpleDateFormat(String pattern) 创建对象 并指定日期格式串
- 调用该对象的parse( string ) 方法 , 将字符串 安装格式 解析成一个date对象
- parse方法会存在parseException 解析异常 , 因为string的格式 必须跟指定的日期格式串的格式保持一致
 
 
- 时间对象 转换成 指定格式 字符串 : SimpleDateFormat类 
-  代码如下: public static void main(String[] args) throws ParseException {// 创建date对象,返回当前时间Date date = new Date();System.out.println("date = " + date);// 通过date(long millis)构造方法 构造指定从1970年经过millis毫秒数的时间Date date1 = new Date(123445324543L);System.out.println("date1 = " + date1);// 负毫秒值情况 , 从1970年1月1向前查询毫秒值对应的时间Date date2 = new Date(-14353564543L);System.out.println("date2 = " + date2);// 获取时间对应的毫秒数 : getTime()System.out.println("date.getTime() = " + date.getTime());System.out.println("date1.getTime() = " + date1.getTime());System.out.println("date2.getTime() = " + date2.getTime());// 时间戳, 获取当前时间距离1970-1-1 00:00:00 经过的毫秒数long millis = System.currentTimeMillis();System.out.println("millis = " + millis);System.out.println("new Date().getTime() = " + new Date().getTime());// 格式化时间格式, 返回成指定的字符串 , y年, M月,d日, H小时,m分钟,s秒,S毫秒SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// format() , 将时间转换成字符串打印 = date -> stringString formatDate = simpleDateFormat.format(date);System.out.println("formatDate = " + formatDate);// string -> date , 字符串解析date对象String strDate = "2024-04-01 11:19:20";// 使用parse(字符串)解析// Unhandled exception: java.text.ParseException 抛出处理// 当给定字符串格式 不符合定义格式java.text.ParseException: Unparseable date: "2024-04-01 11:19:20"Date date3Parse = simpleDateFormat.parse(strDate);System.out.println("date3Parse = " + date3Parse);// 当字符串没有该时间情况 , 会自动将时间往后顺延为合理时间String strDate1 = "2086-15-16 10:28:56";Date parse = simpleDateFormat.parse(strDate1);System.out.println("parse = " + parse);}
Calendar
-  Java.util.calendar日历类 , 是一个抽象类 , 故无法通过构造方法创建对象 
-  创建对象: 通过**调用静态方法getInstance()**方法实现 -> Calendar.getInstance(); 
-  get(int field ): 返回指定字段值 -  field可以为 : 1-> 年 , 2 -> 月 . 5 -> 日 , 11 -> 小时 , 12 -> 分钟 . 13 -> 秒 
-  同时, 也可以为Calendar提供的 静态常量获取如 public static final int YEAR = 1; public static final int MONTH = 2; public static final int DATE = 5; public static final int HOUR = 10; public static final int HOUR_OF_DAY = 11; public static final int MINUTE = 12; public static final int SECOND = 13;
 
-  
-  代码如下: public static void main(String[] args) {// Calendar是一个抽象类, 'Calendar' is abstract; cannot be instantiated//需要通过调用它的静态方法getInstance() 创建它的对象 ,->createCalendar(defaultTimeZone(aLocale), aLocale);Calendar calendar = Calendar.getInstance();// get方法 , 返回指定字段值System.out.println("calendar.get(1) = " + calendar.get(1)); // 1 -> 年System.out.println("calendar.get(2) = " + calendar.get(2)); // 2 -> 月 // 月字段是从0开始的System.out.println("calendar.get(5) = " + calendar.get(5)); // 日System.out.println("calendar.get(11) = " + calendar.get(11));// 小时System.out.println("calendar.get(12) = " + calendar.get(12));//分钟System.out.println("calendar.get(13) = " + calendar.get(13));//秒System.out.println("calendar.get(1) = " + calendar.get(Calendar.YEAR)); // 1 -> 年System.out.println("calendar.get(2) = " + calendar.get(Calendar.MONTH)); // 2 -> 月 // 月字段是从0开始的System.out.println("calendar.get(5) = " + calendar.get(Calendar.DATE)); // 日System.out.println("calendar.get(10) = " + calendar.get(Calendar.HOUR)); // 小时 -> 12System.out.println("calendar.get(11) = " + calendar.get(Calendar.HOUR_OF_DAY));// 小时->24System.out.println("calendar.get(12) = " + calendar.get(Calendar.MINUTE));//分钟System.out.println("calendar.get(13) = " + calendar.get(Calendar.SECOND));//秒}
LocalDateTime
-  jdk8 新增的 线程安全 的 日期类 
-  创建LocalDateTime对象 - 由于LocalDateTime类的构造方法是 private 私有的, 不能直接 new 对象 ,
- 故 调用该类的静态方法 now() 创建对象
- 也可以调用该类的静态方法 of(year , month , day , hour , minute , second) 创建对象
 
-  返回指定字段 , 可以通过该对象内设的getXXX()方法去获取指定的字段 now.getYear(); public int getYear() {return date.getYear();} now.getMonthValue(); public int getMonthValue() {return date.getMonthValue();} now.getDayOfMonth(); public int getDayOfMonth() {return date.getDayOfMonth();} now.getHour();public int getHour() {return time.getHour();} now.getMinute();public int getMinute() {return time.getMinute();} now.getSecond();public int getSecond() {return time.getSecond();}
-  转换 : - 定义格式 dateTimeFormatter , 该类不是public 修饰的, 故需要调用它的静态方法 ofPattern来设置
- 时间 -> string : 设置格式 format( datetimeformatter )返回一个字符串
- 字符串 -> 解析成时间 : 调用prase(s , datetimeformatter ) 方法解析 , 返回一个时间对象
 
-  代码如下: public static void main(String[] args) {// 创建 localdatetime 对象, localdatetime类的构造方法是private,不能直接new对象,需要调用它的静态方法 now()创建对象LocalDateTime now = LocalDateTime.now();System.out.println("now = " + now); //now = 2024-04-01T12:40:33.341786800// 或者调用静态方法 of(year , month , day , hour , minute , second) 创建对象LocalDateTime of = LocalDateTime.of(2021, 6, 7, 8, 30);System.out.println("of = " + of); //of = 2021-06-07T08:30// 返回指定字段System.out.println("now.getYear() = " + now.getYear());System.out.println("now.getMonthValue() = " + now.getMonthValue());System.out.println("now.getDayOfMonth() = " + now.getDayOfMonth());System.out.println("now.getHour() = " + now.getHour());System.out.println("now.getMinute() = " + now.getMinute());System.out.println("now.getSecond() = " + now.getSecond());// 定义格式 : datetimeformatter , DateTimeFormatter不是 public 修饰的, 故需要调用它的静态方法 ofPattern来设置DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");// 时间 -> string// 设置格式 format( datetimeformatter ) , 返回成为一个字符串String s = now.format(dtf);System.out.println("s = " + s);// 字符串 解析成 localdatetime对象String text = "2086年04月01日 11:52:15";// 调用parse(s ,datetimeformatter )方法解析 , 返回一个时间对象LocalDateTime parse = LocalDateTime.parse(text, dtf);System.out.println("parse = " + parse);}
包装类★★★
-  目的 : 为了编程方便 , Java为每个基本类型提供了一个包装类 
-  Java是面向对象的程序设计语言 给每一个包装类提供了一个基本类型 
-  创建包装类对象 - 其实就是把数 保存到对象的 value 属性中
- 根据对应基本类型数据创建包装类对象
- 除了character字符类型外, 其他包装类都可以根据string字符串创建
- 包装类的构造方法从 jdk9开始标记为 @Deprecated已弃用 -> 故建议通过静态方法创建包装类对象 valueOf( )方法
 
-  包装类的常用方法 -  xxxValue()方法 => 拆箱操作 - 使用包装类
- 包装类底层 都有 一个 value属性 存储 包装类对象 对应的 基本数据类型
- 通过调用 包装类对象的 xxxValue方法 把 包装类对象的value属性值 -> 基本数据类型 来实现自动拆箱过程
 
-  static int compare(double d1 , double d2) 比较两个基本类型的大小 - 前面大 : return 正数
- 前面小 : return 负数
- 相等 : return 0
 
-  int compareTo(Double anotherDouble) : 比较两个包装类对象的大小 - 所有包装类都实现了 Comparable接口 ,
- 比较两个包装类对象的大小 ==> 其实比较的是两个包装类对象的value属性值的大小 (隐含了自动拆箱的过程)
 
-  static double parseDouble(string s) ; 把字符串 解析为 基本数据类型 - character 字符类型不能 使用该方法 将字符串解析
- 注意, 字符串 要符合相应的基本类型格式 , 否则会报 Java.lang.numberformatException异常
- parseBoolean(string s) : 要么为true, 其他非true的都为false - 底层源码为 “true”.equalsIgnoreCase(s);
 
 
-  将基本数据类型 转换为 字符串 : 通过字符串类中的 String.valueOf(value)方法实现 
-  装箱 : 调用包装类中静态的valueOf()方法实现的 - static Double valueOf(double d) : 根据基本类型创建
- static Double valueOf(String s) : 根据字符串给你创建 , 不包括Character
 
-  不同包装类的特有方法 - Double 中 : static long doubleToLongBits(double value) : 可以把double小数的二进制转换为long整数
- Integer类中: - static string toBinaryString(int i): 把十进制整数 转换为 二进制
- static string toHexString(int i) : 把十进制整数转换为十六进制
 
 
-  小数是否相等的比较方式 - 1>. x - y < 0.00000001 就认为x与y相等
- 2>. 比较小数的 二进制位 是否完全一样 , 调用Double.doubleToLongBitys(x) 方法返回值 与Double.doubleToLongBitys(y) 返回值 比较是否相等
- 3>. Double.compare(x , y) 看返回值是否为0
 
-  把小数转换为二进制分析流程  
 
-  
-  自动装箱和拆箱 - Java可以自动装箱 \ 自动拆箱
- 装箱 : 基本数据类型 -> 包装类对象 => valueOf()
- 拆箱: 包装类对象 -> 基本数据类型 => xxxValue()
- -128 ~ 127范围内的整数自动装箱保存在 缓存 当中, 采用享元模式
 
类与类之间的关系★★★
- 两个类中间产生了 使用
- 关系有 : 继承 , 实现 , 关联 , 依赖
- 使用类图来描述 -> UML图 为 统一建模语言 - 在分析,设计阶段, 使用UML图 以可视化的形式 描述类或者对象的关系\状态
- 常用的UML图: 用例图 , 类图 , 时序图 , 状态图
- 常用的软件 : Star UML , Rational Rose
 
ToLongBitys(y) 返回值 比较是否相等
 * 3>. Double.compare(x , y) 看返回值是否为0
-  把小数转换为二进制分析流程 [外链图片转存中…(img-JaRbPOfV-1712033162760)] 
-  自动装箱和拆箱 - Java可以自动装箱 \ 自动拆箱
- 装箱 : 基本数据类型 -> 包装类对象 => valueOf()
- 拆箱: 包装类对象 -> 基本数据类型 => xxxValue()
- -128 ~ 127范围内的整数自动装箱保存在 缓存 当中, 采用享元模式
 
类与类之间的关系★★★
- 两个类中间产生了 使用
- 关系有 : 继承 , 实现 , 关联 , 依赖
- 使用类图来描述 -> UML图 为 统一建模语言 - 在分析,设计阶段, 使用UML图 以可视化的形式 描述类或者对象的关系\状态
- 常用的UML图: 用例图 , 类图 , 时序图 , 状态图
- 常用的软件 : Star UML , Rational Rose
 
