java 一文讲透API [常用类 + 常用工具](20万字博文)
目录
3.StringBuilder 和 StringBuffer类
8.常用类补充 —— BigInteger 和 BigDecimal类
一、前言
本篇博文是对Java API 的一个全面总结,同时也囊括了我们“API——常用类”以及“API——常用工具” 两大专题的几乎全部内容。屏幕前的你一定或多或少地听说过“API”这个由三个字母组成的响亮名号;up出这篇博文的目的重点是梳理API中的常用类和常用工具,而不是重点说API本身。
本篇博文将会从API介绍,API常用类,以及API常用工具这三个大的方面同大家娓娓而谈。其中,常用类部分涵盖了诸如Object,String,StringBuffer和StringBuilder,八大包装类等所有常见的类;常用工具部分包括了集合的全部内容和IO流的全部内容;因此博文质量是过关的。注意 : ①代码中的注释也很重要。②点击侧边栏目录或者文章开头的目录可以跳转。良工不示人以朴,所有文章都会适时改进。感谢阅读!
二、API 简介
1.什么是API?
API全称"Application Programming Interface",指应用程序编程接口。当然,我们这里说的API指的是API文档,通常叫做“java文档”,是Java中提供的类的使用说明书。
我们可以直接在浏览器搜索“API+ 当前使用的JDK的版本号”就可以找到java官方的API文档,如下图所示 :
API(JDK17.0)链接如下 :
https://docs.oracle.com/en/java/javase/17/docs/api/
那么,有了API我们能做些什么呢?
当我们遇到没见过的类或者方法,就可以直接在API文档中进行查找。
以String类为例,首先在搜索框输入String,并确定要查看的String类。如下图所示,
点击进入后,首先我们可以看到一些关于String类的简单介绍,包含类属于哪个模块哪个包下,以及它的一些继承关系和实现关系。如下图所示 :
并且,该类所有的构造器,属性,和方法都被列举在了API文档中并出给了说明。如下图所示 :
当然,你也可以利用浏览器自带的翻译功能将页面翻译为中文。不过,up建议,除非是真的看不懂的情况下,不建议使用中文的API文档。
2.java中组件的层次结构 :
模块(module)——> 包(package)——> 类或接口(class / interface)
3.什么是模块
module,模块,是java9开始提供的一种新的java基础组件,在包(package)的基础上又进行了一次封装,可以认为是包的容器。
三、API(常用类)
1.Object类
链接如下 :
https://blog.csdn.net/TYRA9/article/details/129293721?spm=1001.2014.3001.5501
Object类主要内容包括 :
①Object类基本介绍
②Object类构造方法
③Object类成员方法
④JavaBean 重写 Object类的方法
2.String类
链接如下 :
https://blog.csdn.net/TYRA9/article/details/129348766?spm=1001.2014.3001.5501
String类主要内容包括 :
①String类介绍和溯源
②String类构造器
③不同方式创建String类对象的区别
④String类常用成员方法(判断功能 + 获取功能 + 转换功能)
3.StringBuilder 和 StringBuffer类
链接如下 :
https://blog.csdn.net/TYRA9/article/details/129368975?spm=1001.2014.3001.5501
StringBuilder 和 StringBuffer类主要内容包括 :
①StringBuffer类介绍和溯源
②StringBuffer类常用构造器和常用方法
③StringBuffer类 VS String类
④StringBuilder类介绍和溯源
⑤StringBuilder类常用构造器和常用方法
4.Math类 和 System类
链接如下 :
https://blog.csdn.net/TYRA9/article/details/129420332?spm=1001.2014.3001.5501
Math 和 System类主要内容包括 :
①Math类介绍
②Math类常用方法演示
③System类介绍
④System类常用方法演示
5.Date 和 Calender类
链接如下 :
https://blog.csdn.net/TYRA9/article/details/129449704?spm=1001.2014.3001.5501
Date 和 Calendar类主要内容包括 :
①Date类介绍
②SimpleDateFormat类介绍和引入
③Calendar类介绍
④Calendar类使用
⑤LocalDateTime,LocalDate,LocalTime的引入和使用
⑥时间戳Instant的引入和使用
6.八大包装类
链接如下 :
https://blog.csdn.net/TYRA9/article/details/129317036?spm=1001.2014.3001.5501
八大包装类主要内容包括 :
①包装类简介和溯源
②关于拆箱和装箱
③String类型与基本类型的相互转化
④String类型与包装类型的相互转化
⑤八大包装类的常用成员方法汇总(含演示)
7.常用类补充 —— Arrays类
①前言
关于Arrays类,up有些纠结。诚然,Arrays类中一些方法的使用频率还是比较可观的。但是吧,如果单独出一篇博文仅仅去演示Arrays类的常用方法,多少显得没有营养,有些水博文的味道,虽然up很喜欢水博文(bushi);可如果讲得细致一些,包含Arrays类的源码解读和断点调试的过程,放到基础阶段又有些突兀,因为Arrays类的一些方法,在底层源码中不但涉及了java 四种内部类中最难的匿名内部类(内部类up已讲过,放在了 java 进阶专栏,非此基础专栏),而且牵涉到数据结构与算法中的二叉查找等内容(up计划将来发布到 java 数据结构与算法专栏)。因此,Arrays类对于"力求完美"的up来说,就属于这么一个上不上,下不下的位置,相当尴尬。思绪良久,最终计划先暂时将它作为一个补充类放到本篇API总结博文中的常用类位置,简单演示一下它的几个常用方法,明面上也算是我讲到过了。之后如果有机会,我们再对它进行仔细剖析。
②简介
Arrays类是常用类中的一个工具类,其中包含了一系列静态方法,用于管理和操作数组(比方说查找和排序)。
③常用方法介绍演示
1° static String toString(...[] a) :
该方法可以将指定类型的数组转换为String类型的表示。这里的"指定类型"既可以是八大基本数据类型,还可以是引用类型。
2°static void sort(...[] a) :
该方法可以将指定类型的数组进行升序排序。
3°static int binarySearch(...a, ... key) :
该方法可以在一个有序数组中查找某个元素是否存在。需要传入数组和要查找的元素。若存在,返回当前元素在数组中的位置,若不存在,确定当前元素在数组中按大小排序应该所在的位置,并返回 - (该位置索引 + 1)。
4°static ...[] copyOf(...[] original, int newLength) :
该方法可以将原数组中指定长度的内容拷贝到新数组中。若指定长度大于原数组长度,则多出来的部分以默认值填充。
Δ演示 :
up以Arrays_类为演示类,代码如下 :
package csdn.knowledge.api.arrays;
import java.util.Arrays;
import java.util.Objects;
public class Arrays_ {
public static void main(String[] args) {
//演示 : Arrays类常用方法
//1.static String toString(...[] a) :
int[] array_0 = new int[]{0, 1, 2, 3, 5};
double[] array_1 = new double[]{2.33, 11.2, 5.5555, 23.24, 211.8};
Integer[] array_2 = new Integer[]{0, 2, 33, 77, 11, 2, 5};
String strArray_0 = Arrays.toString(array_0);
String strArray_1 = Arrays.toString(array_1);
String strArray_2 = Arrays.toString(array_2);
System.out.println("array_0的String类型表示 = " + strArray_0);
System.out.println("array_1的String类型表示 = " + strArray_1);
System.out.println("array_2的String类型表示 = " + strArray_2);
System.out.println("==================================");
//2.static void sort(...[] a) :
Arrays.sort(array_0);
Arrays.sort(array_1);
Arrays.sort(array_2);
System.out.println("array_0数组升序排序后的字符串表示形式 = " + Arrays.toString(array_0));
System.out.println("array_1数组升序排序后的字符串表示形式 = " + Arrays.toString(array_1));
System.out.println("array_2数组升序排序后的字符串表示形式 = " + Arrays.toString(array_2));
System.out.println("==================================");
//3.static int binarySearch(...a, ... key) :
int[] ints = new int[]{1, 2, 5, 11, 23, 24, 77, 141, 211, 985};
System.out.println("11在ints数组中存在吗,存在请返回索引:" + Arrays.binarySearch(ints, 11));
System.out.println("77在ints数组中存在吗,存在请返回索引:" + Arrays.binarySearch(ints, 77));
System.out.println(" 1在ints数组中存在吗,存在请返回索引:" + Arrays.binarySearch(ints, 1));
System.out.println("==================================");
//4.static ...[] copyOf(...[] original, int newLength) :
String[] names1 = new String[]{"大伟哥", "王天一", "钟离", "布洛妮娅", "三鹰仁", "雪之下"};
String[] names2 = Arrays.copyOf(names1, 3); //拷贝三个元素过去
String[] names3 = Arrays.copyOf(names1, names1.length); //全部拷贝过去
System.out.println("新数组names2 = " + Arrays.toString(names2));
System.out.println("新数组names3 = " + Arrays.toString(names3));
}
}
运行结果 :
8.常用类补充 —— BigInteger 和 BigDecimal类
①前言
关于BigInteger 和 BigDecimal类,补充这两个类是因为——在某些情况下,我们需要存储或使用非常大的数,比如中国2022年的GDP总值,120万亿,这时候你就算拿long类型存储,也放不下,如下图所示 :
再比如,某些情况下,我们需要得到一个精度非常高的小数,不如说圆周率PI 的前30位。就算你用double类型也无法全部保存,虽然IDEA并不会向long类型一样直接报错,但是如果你设法直接输出数据,就会丢失精度。如下所示 :
//以下代码仅作演示用,无实际意义。
public static void main(String[] args) {
double temp_b_0 = 3.141592653589793238462643383279;
System.out.println(temp_b_0);
}
输出结果 :
因此,为了解决以上两个问题,我们就需要用到BigInteger类和BigDecimal类。
②简介
BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。
BigDecimal类则可以保存精度远超double可保存范围内的小数,而不造成数据丢失。
BigInteger类和BigDecimal类都属于java.base模块,java.math包下。这俩之所以这么牛逼,原因在于它们的底层是把一个超大的数或者一个超高精度的小数当成字符串来进行处理的。想使用BigInteger对象 和 BigDecimal对象保存的数进行运算,需要用到类中对应的方法。如下 :
③常用方法介绍演示
Δ前言 : 因为二者的一些方法在具体使用时大同小异,而且本身这俩就是常用类的一个补充内容,因此此处方法介绍中up仅以BigInteger类为例。(但实际演示中俩个都会演示到的)
①BigInteger add(BigInteger val) :
该方法可以对BigInteger类对象保存的超大数进行加法运算。可以不作接收。(传入的形参的加数)
②BigInteger subtract(BigInteger val) :
同上,但进行减法运算。(传入的形参为减数)
③BigInteger multiply(BigInteger val) :
同上,但进行乘法运算。(传入的形参为乘数)
④BigInteger divide(BigInteger val)
同上,但进行除法运算。(传入的形参为除数)
Δ演示 :
up以BigBig类为演示类,代码如下 :
package csdn.knowledge.api.big;
import java.math.BigDecimal;
import java.math.BigInteger;
public class BigBig {
public static void main(String[] args) {
//演示1 : BigInteger
//超大数演示
BigInteger bigInteger = new BigInteger("120000000000000");
System.out.println("2022年中国国内GDP总值 = " + bigInteger);
System.out.println("-----------------------------");
//加法运算
BigInteger bigInteger1 = new BigInteger("666666666666666666");
BigInteger bigInteger2 = new BigInteger("333333333333333334");
System.out.println("超大数1 + 超大数2 = " + bigInteger1.add(bigInteger2));
//减法运算
System.out.println("超大数1 - 超大数2 = " + bigInteger1.subtract(bigInteger2));
//乘法运算
System.out.println("超大数1 * 超大数2 = " + bigInteger1.multiply(bigInteger2));
//除法运算
System.out.println("超大数1 / 6 = " + bigInteger1.divide(new BigInteger("6")));
System.out.println("\n=============================================================\n");
//演示2 : BigDecimal
//超高精度小数演示
BigDecimal bigDecimal = new BigDecimal("1970.111200123445677889");
System.out.println("来整个超高精度小数: " + bigDecimal);
System.out.println("-----------------------------");
//加法运算
BigDecimal bigDecimal1 = new BigDecimal("24.4444444444444444444444444444");
BigDecimal bigDecimal2 = new BigDecimal("1.5555555555555555555555555556");
System.out.println("超高精度数1 + 超高精度数2 = " + bigDecimal1.add(bigDecimal2));
//减法运算
System.out.println("超高精度数1 - 超高精度数2 = " + bigDecimal1.subtract(bigDecimal2));
//乘法运算
System.out.println("超高精度数1 * 超高精度数2 = " + bigDecimal1.multiply(bigDecimal2));
//除法运算
System.out.println("超高精度数1 / 2 = " + bigDecimal1.divide(new BigDecimal("2")));
}
}
运行结果 :
④关于BigDecimal类的一些补充 :
在使用BigDecimal类的divide方法时——即进行超高精度小数的除法运算时,注意,jvm可能会抛出异常。这是因为,如果两个小数的相除结果为无限小数时,就算你BigDecimal类对象可以保存特别长,精度特别高的小数,但是你究竟是不能保存一个无限长的小数的。因此这时候jvm会抛出ArithmeticException(算术异常),如下图所示 :
当然,对于上述问题java提供了补救的办法。你可以在使用divide方法时额外传入一个参数,如下 :
bigDecimal1.divide(bigDecimal2, RoundingMode.CEILING)
传入RoundingMode.CEILING参数后,可以将运行结果默认保留至分子的小数位数,即截取到无限小数前面和分子相同位数的地方停止。
四、API(常用工具)
1.集合
链接如下 :
https://blog.csdn.net/TYRA9/article/details/129899534?spm=1001.2014.3001.5502
常用工具——集合篇章主要内容包括 :
①集合简介
②集合框架图
③List集合 万字详解(含源码分析)
④Set集合 万字详解(含源码分析)
⑤增强for和迭代器 万字详解
⑥Map集合 万字详解(含源码分析)
⑦Collections类 详解
⑧泛型 详解
⑨集合框架总结
2.IO流
0° 拾枝杂谈
常用工具——IO流篇章内容较多较杂;up将其分为三部分——①异常;②File类;③IO流基础。
1° 异常基础
链接如下 :
https://blog.csdn.net/TYRA9/article/details/127295364
异常基础主要内容包括 :
①异常概述
②异常分类
③异常的产生机制
④异常相关
⑤异常处理
⑥异常进阶
2° File类基础
链接如下 :
https://blog.csdn.net/TYRA9/article/details/127541155
File类基础主要内容包括 :
①File类构造方法的演示
②File类成员方法的演示(详细)
3° IO流基础
链接如下 :
https://blog.csdn.net/TYRA9/article/details/127337688
IO流基础主要内容包括 :
①IO流简介(详细)
②字符流读写文件(详细)
③字节流读写文件(详细)
五、API 专题总结
API(常用类+常用工具)其实是把javaSE的两个专题放一块儿了。对于常用类专题,大家主要是掌握每个类的特点和常用方法,因为常用类重点的地方就在于它们的常用方法,就和Linux系统下的一些常用指令一样,你能用起来6的飞起,就已经顶好了。而对于常用工具专题,又可分为集合篇章和IO流篇章,对于集合篇章,没得说就是底层源码了,最好能把每个类的底层源码都自己下来Debug扣一扣。对于IO流篇章,异常这一块儿主要是异常的产生机制,以及异常的处理,必须掌握;对于File类,把常用的一些方法用熟练就可以了;对于IO流基础,字符流字节流的体系图,还有缓冲流,拷贝文件,这些都要掌握。
🆗,以上就是我们API(常用类 + 常用工具)的全部内容了。下一专题是我们的反射专题,不见不散。感谢阅读!
System.out.println("END------------------------------------------------------------------------------");
- 点赞
- 收藏
- 关注作者
评论(0)