【Java从入门到大牛】java.lang、java.util包下的常用API 短命女 2024-04-26 02:47 2阅读 0赞 > 🔥 本文由 [程序喵正在路上][Link 1] 原创,CSDN首发! > 💖 系列专栏:[Java从入门到大牛][Java] > 🌠 首发时间:2023年7月22日 > 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 > 🌟 一以贯之的努力 不得懈怠的人生 #### 目录 #### * Math、System、Runtime * BigDecimal * JDK8之前传统的日期、时间 * * Date * SimpleDateFormat * Calendar * JDK8开始新增的日期、时间 * * 为什么要学JDK8新增的时间 ? * LocalDate、LocalTime、LocalDateTime * Zoneld、ZonedDateTime * Instant * DateTimeFormatter * Period、Duration * Arrays * JDK8新特性:Lambda表达式 * * 认识Lambda表达式 * Lambda表达式的省略规则 * JDK8新特性:方法引用 * * 静态方法的引用 * 实例方法的引用 * 特定类型方法的引用 * 构造器引用 ## Math、System、Runtime ## **什么是Math** 代表数学,是一个工具类,里面提供的都是对数据进行操作的一些静态方法 **Math类提供的常见方法** <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public static int abs(int a)</code></td> <td>获取参数绝对值</td> </tr> <tr> <td><code>public static double ceil(double a)</code></td> <td>向上取整</td> </tr> <tr> <td><code>public static double floor(double a)</code></td> <td>向下取整</td> </tr> <tr> <td><code>public static int round(float a)</code></td> <td>四舍五入</td> </tr> <tr> <td><code>public static int max(int a, int b)</code></td> <td>获取两个 int 值中的较大值</td> </tr> <tr> <td><code>public static double pow(double a, double b)</code></td> <td>返回 a 的 b 次幂</td> </tr> <tr> <td><code>public static double random()</code></td> <td>返回值为 double 的随机值,范围 [0.0, 1.0)</td> </tr> </tbody> </table> **什么是System** System 代表程序所在的系统,也是一个工具类 **System类提供的常见方法** <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public static void exit(int status)</code></td> <td>终止当前运行的 Java 虚拟机</td> </tr> <tr> <td><code>public static long currentTimeMillis()</code></td> <td>返回当前系统的时间毫秒值形式</td> </tr> </tbody> </table> **什么是时间毫秒值** 指的是从 1970年1月1日 00::00:00 走到此刻的总毫秒数,应该是很大的 **为什么选择 “1970年1月1日 00::00:00” 作为时间的起点?** 1969年8月,贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会,开始着手创造一个全新的革命性的操作系统,他使用 B 编译语言在老旧的 PDP-7 机器上开发出了 Unix 的一个版本。随后,汤普逊和同事丹尼斯里奇改进了 B 语言,开发出了 C 语言,重写了 UNIX。所以,1970年1月1日 可以算是 C 语言的生日 **什么是Runtime** 代表程序所在的运行环境,Runtime 是一个单例类 **Runtime类提供的常见方法** <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public static Runtime getRuntime()</code></td> <td>返回与当前 Java 应用程序关联的运行时对象</td> </tr> <tr> <td><code>public void exit(int status)</code></td> <td>终止当前运行的虚拟机</td> </tr> <tr> <td><code>public int availableProcessors()</code></td> <td>返回 Java 虚拟机可用的处理器数</td> </tr> <tr> <td><code>public long totalMemory()</code></td> <td>返回 Java 虚拟机中的内存总量</td> </tr> <tr> <td><code>public long freeMemory()</code></td> <td>返回虚拟机中的可用内存</td> </tr> <tr> <td><code>public Process exec(String command)</code></td> <td>启动某个程序,并返回代表程序的对象</td> </tr> </tbody> </table> ## BigDecimal ## **BigDecimal的作用** 用于解决浮点数运算时,出现结果失真的问题 **结果失真** public class Test { public static void main(String[] args) { System.out.println(0.1 + 0.2); System.out.println(1.0 - 0.32); System.out.println(1.015 * 100); System.out.println(1.301 / 100); } } ![在这里插入图片描述][c572e59051674605831ff79e25c2865f.png] **BigDecimal的常见构造器和常用方法** <table> <thead> <tr> <th>构造器</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public BigDecimal(double val)</code></td> <td>将 double 转换为 BigDecimal,<font>不推荐使用这个</font></td> </tr> <tr> <td><code>public BigDecimal(String val)</code></td> <td>把 String 转成 BigDecimal</td> </tr> </tbody> </table> <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public static BigDecimal valueOf(double val)</code></td> <td>转换一个 double 成 BigDecimal</td> </tr> <tr> <td><code>public BigDecimal add(BigDecimal b)</code></td> <td>加法</td> </tr> <tr> <td><code>public BigDecimal subtract(BigDecimal b)</code></td> <td>减法</td> </tr> <tr> <td><code>public BigDecimal multiply(BigDecimal b)</code></td> <td>乘法</td> </tr> <tr> <td><code>public BigDecimal divide(BigDecimal b)</code></td> <td>除法</td> </tr> <tr> <td><code>public BigDecimal divide(另一个BigDecimal对象, 精确几位, 舍入模式)</code></td> <td>除法、可以控制精确到小数几位</td> </tr> <tr> <td><code>public double doubleValue()</code></td> <td>将 BigDecimal 转换为 double</td> </tr> </tbody> </table> ## JDK8之前传统的日期、时间 ## ### Date ### 代表的是日期和时间 <table> <thead> <tr> <th>构造器</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public Date()</code></td> <td>创建一个 Date 对象,代表的是系统当前此刻日期时间</td> </tr> <tr> <td><code>public Date(long time)</code></td> <td>把时间毫秒值转换成 Date 日期对象</td> </tr> </tbody> </table> <table> <thead> <tr> <th>常见方法</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public long getTime()</code></td> <td>返回从 1970年1月1日 00:00:00 走到此刻的总毫秒数</td> </tr> <tr> <td><code>public void setTime(long time)</code></td> <td>设置日期对象的时间为当前时间毫秒值对应的时间</td> </tr> </tbody> </table> ### SimpleDateFormat ### 代表简单日期格式化,可以用来把日期对象、时间毫秒值格式化成我们想要的形式 <table> <thead> <tr> <th>常见构造器</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public SimpleDateFormat(String pattern)</code></td> <td>创建简单日期格式化对象,并封装时间的格式</td> </tr> </tbody> </table> <table> <thead> <tr> <th>格式化时间的方法</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public final String format(Date date)</code></td> <td>将日期格式化成日期 / 时间字符串</td> </tr> <tr> <td><code>public final String format(Object time)</code></td> <td>将时间毫秒值化成日期 / 时间字符串</td> </tr> </tbody> </table> **时间格式的常见符号** <table> <thead> <tr> <th>符号</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>y</td> <td>年</td> </tr> <tr> <td>M</td> <td>月</td> </tr> <tr> <td>d</td> <td>日</td> </tr> <tr> <td>H</td> <td>时</td> </tr> <tr> <td>m</td> <td>分</td> </tr> <tr> <td>s</td> <td>秒</td> </tr> <tr> <td>EEE</td> <td>星期几</td> </tr> <tr> <td>a</td> <td>上午/下午</td> </tr> <tr> <td>yyyy-MM-dd HH:mm:ss</td> <td>2023-07-20 00:00:00</td> </tr> <tr> <td>yyyy年MM月dd日 HH:mm:ss</td> <td>2023年07月20日 00:00:00</td> </tr> </tbody> </table> **SimpleDateFormat解析字符串时间成为日期对象** **2023-07-20 00:00:00** → \\rightarrow → **Date日期对象** ? <table> <thead> <tr> <th>解析方法</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>public Date parse(String source)</td> <td>把字符串时间解析成日期对象</td> </tr> </tbody> </table> ### Calendar ### * 代表的是系统此刻时间对应的日历 * 通过它可以单独获取、修改时间中的年、月、日、时、分、秒等 **Calendar日历类的常见方法** <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public static Calendar getInstance()</code></td> <td>获取当前日历对象</td> </tr> <tr> <td><code>public int get(int field)</code></td> <td>获取日历中的某个信息</td> </tr> <tr> <td><code>public final Date getTime()</code></td> <td>获取日期对象</td> </tr> <tr> <td><code>public long getTimeInMillis()</code></td> <td>获取时间毫秒值</td> </tr> <tr> <td><code>public void set(int field, int value)</code></td> <td>修改日历的某个信息</td> </tr> <tr> <td><code>public void add(int field, int amount)</code></td> <td>为某个信息增加 / 减少指定的值</td> </tr> </tbody> </table> 注意:Calendar 是可变对象,一旦修改后其对象本身表示的时间将产生变化 ## JDK8开始新增的日期、时间 ## ### 为什么要学JDK8新增的时间 ? ### **JDK8之前传统的时间API** 1. 设计不合理,使用不方便,很多都被淘汰了 2. 都是可变对象,修改后会丢失最开始的时间信息 3. 线程不安全 4. 只能精确到毫秒 **JDK8开始之后新增的时间API** 1. 设计更合理,功能丰富,使用更方便 2. 都是不可变对象,修改后会返回新的时间对象,不会丢失最开始的时间 3. 线程安全 4. 能精确到毫秒、纳秒 **JDK8新增的时间,都是 java.time 包下的类** **代替 Calendar** * LocalDate:年、月、日 * LocalTime:时、分、秒 * LocalDateTime:年、月、日、时、分、秒 * ZoneId:时区 * ZonedDateTime:带时区的时间 **代替 Date** * Instant:时间戳 / 时间线 **代替 SimpleDateFormat** * DateTimeFormatter:用于时间的格式化和解析 **其他补充** * Duration:时间间隔(时、分、秒、纳秒) * Period:时间间隔(年、月、日) ### LocalDate、LocalTime、LocalDateTime ### * LocalDate:代表本地日期(年、月、日、星期) * LocalTime:代表本地时间(时、分、秒、纳秒) * LocalDateTime:代表本地日期、时间(年、月、日、星期、时、分、秒、纳秒) **获取对象的方案** <table> <thead> <tr> <th>方法名</th> <th>实例</th> </tr> </thead> <tbody> <tr> <td><code>public static Xxxx now()</code>:获取系统当前时间对象的该对象</td> <td><code>LocalDate Id = LocalDate.now();</code></td> </tr> <tr> <td><span><span><span> \quad </span><span><span><span style="height: 0em;"></span><span style="margin-right: 1em;"></span></span></span></span></span></td> <td><code>LocalTime It = LocalTime.now();</code></td> </tr> <tr> <td><span><span><span> \quad </span><span><span><span style="height: 0em;"></span><span style="margin-right: 1em;"></span></span></span></span></span></td> <td><code>LocalDateTime Idt = LocalDateTime .now();</code></td> </tr> <tr> <td><code>public static Xxxx of(...)</code>:获取指定时间的对象</td> <td><code>LocalDate localDatel = LocalDate.of(2099, 11, 11);</code></td> </tr> <tr> <td><span><span><span> \quad </span><span><span><span style="height: 0em;"></span><span style="margin-right: 1em;"></span></span></span></span></span></td> <td><code>LocalTime localTimel = LocalTime.of(9, 8, 59);</code></td> </tr> <tr> <td><span><span><span> \quad </span><span><span><span style="height: 0em;"></span><span style="margin-right: 1em;"></span></span></span></span></span></td> <td><code>LocalDateTime localDateTimel = LocalDateTime.of(2025, 11, 16, 14, 30, 01);</code></td> </tr> </tbody> </table> **LocalDate的常用API(都是处理年、月、日、星期相关的)** <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>public int getYear()</td> <td>获取年</td> </tr> <tr> <td>public int getMonthValue()</td> <td>获取月份(1-12)</td> </tr> <tr> <td>public int getDayOfMonth()</td> <td>获取日</td> </tr> <tr> <td>public int getDayOfYear()</td> <td>获取当前是一年中的第几天</td> </tr> <tr> <td>public DayOfWeek getDayOfWeek()</td> <td>获取星期几:ld.getDayOfWeek().getValue()</td> </tr> </tbody> </table> <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>withYear、withMonth、withDayOfMonth、withDayOfYear</td> <td>直接<font>修改</font>某个信息,<font>返回新日期对象</font></td> </tr> <tr> <td>plusYears、plusMonths、plusDays、plusWeeks</td> <td>把某个信息<font>加多少</font>,<font>返回新日期对象</font></td> </tr> <tr> <td>minusYears、minusMonths、minusDays、minusWeeks</td> <td>把某个信息<font>减多少</font>,<font>返回新日期对象</font></td> </tr> <tr> <td>equals、isBefore、isAfter</td> <td>判断两个日期对象是否相等,在前还是在后</td> </tr> </tbody> </table> **LocalDateTime的常用API(可以处理年、月、日、星期、时、分、秒、纳秒等信息)** <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>getYear、getMonthValue、getDayOfMonth、getDayOfYear、getDayOfWeek、getHour、getMinute、getSecond、getNano</td> <td>获取年月日、时分秒、纳秒等</td> </tr> <tr> <td>withYear、withMonth、withDayOfMonth、withDayOfYear、withHour、withMinute、withSecond、withNano</td> <td>修改某个信息,返回新日期时间对象</td> </tr> <tr> <td>plusYears、plusMonths、plusDays、plusWeeks、plusHours、plusMinutes、plusSeconds、plusNanos</td> <td>把某个信息加多少,返回新日期时间对象</td> </tr> <tr> <td>minusYears、minusMonths、minusDays、minusWeeks、minusHours、minusMinutes、minusSeconds、minusNanos</td> <td>把某个信息减多少,返回新日期时间对象</td> </tr> <tr> <td>equals、isBefore、isAfter</td> <td>判断两个日期对象是否相等,在前还是在后</td> </tr> </tbody> </table> **LocalDateTime转换成LocalDate、LocalTime的API** <table> <thead> <tr> <th>方法名</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>public LocalDate toLocalDate()</code></td> <td>转换成一个 LocalDate 对象</td> </tr> <tr> <td><code>public LocalTime toLocalTime()</code></td> <td>转换成一个 LocalTime 对象</td> </tr> </tbody> </table> ### Zoneld、ZonedDateTime ### **什么是时区 ?** 由于世界各个国家与地区的经度不同,各地区的时间也有所不同,因此会划分为不同的时区 ZoneId:代表时区 Id 世界标准时间(UTC),中国标准时间为 UTC + 8 小时 **ZoneId 时区的常见方法** ![在这里插入图片描述][4a229157e70a4b218fd6129b970ae9f9.png] **ZonedDateTime 带时区时间的常见方法** ![在这里插入图片描述][182eec10c7454c3dbcea289c90350e20.png] ### Instant ### **Instant 时间线上的某个时刻/时间戳** * 通过获取 Instant 的对象可以拿到此刻的时间,该时间由两部分组成:从 1970-01-01 00:00:00 开始走到此刻的总秒数 + 不够 1 秒的纳秒数 ![在这里插入图片描述][2048141ebec2474389dd46b0422db2b4.png] * 作用:可以用来记录代码的执行时间,或用于记录用户操作某个时间的时间点 * 传统的 Date 类,只能精确到毫秒,并且是可变对象 * 新增的 Instant 类,可以精确到纳秒,并且是不可变对象,推荐用 Instant 代替 Date ### DateTimeFormatter ### ![在这里插入图片描述][814eef2cf20a44e7a598567c3c869a1a.png] **LocalDateTime提供的格式化、解析时间的方法** ![在这里插入图片描述][4188e59982bc4bf199557315d8bd71ff.png] ### Period、Duration ### **Period(一段时期)** 可以用于计算两个 LocalDate 对象相差的年数、月数、天数 ![在这里插入图片描述][29f093ccc8384eb982dc009905b1132b.png] **Duration(持续时间)** 可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数;支持 LocalTime、LocalDateTime、Instant 等时间 ![在这里插入图片描述][e9417814ae91498c856604822a8812e3.png] ## Arrays ## **什么是 Arrays?** 用来操作数组的一个工具类 **Arrays类提供的常见方法** ![在这里插入图片描述][f69890d1a88d403481df987d4574b936.png] **对数组中的数据进行排序** double[] prices = { 99.8, 128, 100}; Arrays.sort(prices); System.out.println(Arrays.toString(prices)); **如果数组中存储的是对象,怎么排序 ?** * 方法一:让该对象的类实现 Comparable(比较规则)的接口,然后重写 compareTo 方法,自己来制定比较规则 * 方法二:使用下面这个 sort 方法,创建 Comparator 比较器接口的匿名内部类对象,然后自己制定比较规则 public static <T> void sort(T[] arr, Comparator<? super T> c) // 对数组进行排序(支持自定义排序规则) **自定义排序规则时,需要遵循的官方约定,升序规则如下。:** * 如果认为左边对象 大于 右边对象 应该返回正整数 * 如果认为左边对象 小于 右边对象 应该返回负整数 * 如果认为左边对象 等于 右边对象 应该返回0整数 ## JDK8新特性:Lambda表达式 ## ### 认识Lambda表达式 ### **什么是Lambda表达式 ?** Lambda 表达式是 JDK 8 开始新增的一种语法格式,作用:用于简化匿名内部类的代码写法 **格式** (被重写方法的形参列表) -> { 被重写方法的方法体代码 } 注意:Lambda 表达式只能简化函数式接口的匿名内部类 **什么是函数式接口 ?** * 有且仅有一个抽象方法的接口 * 注意:将来我们见到的大部分函数式接口,上面都可能会有一个 `@FunctionalInterface` 的注解,有该注解的接口必定是函数式接口 **Lambda表达式简化setAll方法中匿名内部类** double[] scores = { 99.8, 128.0, 100.0}; Arrays.setAll(scores, new IntToDoubleFunction() { @Override public double applyAsDouble(int value) { return scores[value] * 0.8; } }); System.out.println(Arrays.toString(scores)); // Lambda表达式 Arrays.setAll(scores, (int value) -> { return scores[value] * 0.8; }); **Lambda表达式简化Comparator接口的匿名形式** public static void main(String[] args) { ... Arrays.sort(students, new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { return s1.getAge() - s2.getAge(); } }); ... } // Lambda表达式 Arrays.sort(students, (Student s1, Student s2) -> { return s1.getAge() - s2.getAge(); }); ### Lambda表达式的省略规则 ### **Lambda 表达式的省略写法(进一步简化 Lambda 表达式的写法)** * 参数类型可以省略不写 * 如果只有一个参数,参数类型可以省略,同时 () 也可以省略 * 如果 Lambda 表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号。此时,如果这行代码是 return 语句,也必须去掉 return 不写 ## JDK8新特性:方法引用 ## ### 静态方法的引用 ### **格式** `类名::静态方法` **使用场景** 如果某个 Lambda 表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用 ### 实例方法的引用 ### **格式** `对象名::实例方法` **使用场景** 如果某个 Lambda 表达式里只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用 ### 特定类型方法的引用 ### **格式** `类型::方法` **使用场景** 如果某个 Lambda 表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用 ### 构造器引用 ### **格式** `类名::new` **使用场景** 如果某个 Lambda 表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用 [Link 1]: https://blog.csdn.net/weixin_62511863?spm=1011.2421.3001.5343 [Java]: https://blog.csdn.net/weixin_62511863/category_12365679.html?spm=1001.2014.3001.5482 [c572e59051674605831ff79e25c2865f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/2a6f1d1c39b24367b1ecef606cd8fd87.png [4a229157e70a4b218fd6129b970ae9f9.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/2b2eefc8f2204d889775fd85b792b398.png [182eec10c7454c3dbcea289c90350e20.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/b0cd8ed5fed94b379c4bacf598f81167.png [2048141ebec2474389dd46b0422db2b4.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/691e1d45060948e099d41e5a4a5016ed.png [814eef2cf20a44e7a598567c3c869a1a.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/588ed3b901c442fd95a5a5520673b77c.png [4188e59982bc4bf199557315d8bd71ff.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/ff7cbac8e34e463fbd2ebd52f9755e8e.png [29f093ccc8384eb982dc009905b1132b.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/fdabc1612f6542c6ac17d66229e96fd9.png [e9417814ae91498c856604822a8812e3.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/418dc4b9a42d4b5e977306d36e42e958.png [f69890d1a88d403481df987d4574b936.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/ff5107a7693d4ed1bf7c1d209663f278.png
相关 【Java从入门到大牛】Java高级技术 注解(Annotation)就是 Java 代码里的特殊标记,比如:@Override、@Test 等,作用是:让其他程序根据注解信息来决定怎么执行该程序自定义注解,就是... 忘是亡心i/ 2024年04月26日 02:57/ 0 赞/ 7 阅读
相关 【Java从入门到大牛】网络编程 可以让设备中的程序与网络上的其他设备中的程序进行数据交互,也就是实现网络通信Java的 java.net.* 包下提供了网络编程的解决方案。 Myth丶恋晨/ 2024年04月26日 02:56/ 0 赞/ 6 阅读
相关 【Java从入门到大牛】java.lang、java.util包下的常用API 本文主要介绍了Java一些常用的API,以及Lambda表达式和方法引用。 短命女/ 2024年04月26日 02:47/ 0 赞/ 3 阅读
还没有评论,来说两句吧...