文章目录
前言
-
什么是API
API (Application Programming Interface) :应用程序编程接口
-
java中的API
指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来。
我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。
一、知识网图
如图可以清晰的看到核心类库和拓展类库共同组成为类库,我们的API就是编程接口帮助我们具体实现这个类库。
在核心类库中,目前主要用到得比较多的是java.lang包和java.util包下的类
- 本篇主要先说说java.lang包下的类
- 注意:直接属于java.lang包下的类使用时都不需要导包
二、java.lang包下的常用API
1. Scanner类—键盘录入字符串
Scanner类 :
- next() : 遇到了空格, 就不再录入数据了 , 结束标记: 空格, tab键
- nextLine() : 可以将数据完整的接收过来 , 结束标记: 回车换行符
- 问题:由于nextLine()遇到回车换行符就会结束,因此永远不能实现用户输入字符串的功能,如下:
- 解决方法:
2. String类
2.1 String概述
1 String 类在 java.lang 包下,所以使用的时候不需要导包
(所有在 java.lang 包下的类,使用时都不需要导包)
2 String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象
3 字符串是常量,是不可变的,它们的值在创建后不能被更改
- 因为String内部都是被final修饰的
2.2 String类的构造方法
常用的构造方法
2.3 字符串的特点
-
java程序中所有的双引号字符串,都是String类型的对象
-
字符串不可变,它们的值在创建后不能被更改
-
内存结构图解:
虽然String的值是不可变的,但是它们可以共享
-
(原因:下面注意中的第二点)
-
注意:
-
所有字符串常量都会存在方法区的字符串常量池中
-
使用字符串字面量创建对象时,系统会检查该字符串是否在字符串常量池(方法区中)存在,
- 如果不存在,会创建新的
- 如果存在,不会重新创建而是直接复用
2.4 创建字符串对象的区别对比
-
通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
-
在内存中的理解
2.5 String方法小结
- String类的常用方法 :
- 字符串的比较
- public boolean equals(Object anObject) :
- 比较字符串的内容,严格区分大小写
- public boolean equalsIgnoreCase(String anotherString)
- 比较字符串的内容,忽略大小写
- 遍历字符串
- public int length()
- 返回此字符串的长度
- public char charAt(int index)
- 返回指定索引处的 char 值
- 遍历并统计字符串中字符的个数
- public char[] toCharArray()
- 将字符串拆分为字符数组后返回
- 截取字符串
- public String substring(int beginIndex, int endIndex)
- 根据开始和结束索引进行截取,得到新的字符串(包含头,不包含尾)
- public String substring(int beginIndex)
- 从传入的索引处截取,截取到末尾,得到新的字符串
- 替换字符串
- public String replace(CharSequence target, CharSequence replacement)
- 使用新值,将字符串中的旧值替换,得到新的字符串
- 切割字符串
- public String[] split(String regex)
- 根据传入的规则切割字符串,得到字符串数组
3. StringBuilder类
3.1 StringBuilder类概述
为什么要用StringBuilder:
在字符串拼接操作中,如果用"+"拼接运算中会产生大量的临时StringBuilder对象和临时字符串对象,浪费内存空间
- 用"+"拼接运算时,StringBuilder对象和临时字符串对象的内存结构
- 所以为了避免内存空间的浪费,我们可以通过StringBuilder来完成,
- 故StringBuilder适用于大量字符串拼接的场景
概述 : StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的
3.2 StringBuilder类和String类的区别
-
String类:
- 内容是不可变的
-
StringBuilder类:
- 内容是可变的
- 默认长度为16
3.3 StringBuilder类的构造方法
常用的构造方法
public class StringBuilderDemo01 {
public static void main(String[] args) {
//public StringBuilder():创建一个空白可变字符串对象,不含有任何内容
StringBuilder sb = new StringBuilder();
System.out.println("sb:" + sb);
System.out.println("sb.length():" + sb.length());
//public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
StringBuilder sb2 = new StringBuilder("hello");
System.out.println("sb2:" + sb2);
System.out.println("sb2.length():" + sb2.length());
}
}
3.4 StringBuilder常用的成员方法
-
添加和反转方法
-
PS1:public StringBuilder append(任意类型)使用中
-
原本的StringBuilder对象接收添加后的内容
-
链式调用
- PS2:public StringBuilder reverse()反转
-
reverse()方法:是StringBuilder 类中利用位运算符进行字符位置交换的一个方法
-
进行反转后,是会改变对象的内容的
### 3.5 StringBuilder和String相互转换【应用】
-
StringBuilder转换为String
public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
-
String转换为StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
-
示例代码
public class StringBuilderDemo02 {
public static void main(String[] args) {
/*
//StringBuilder 转换为 String
StringBuilder sb = new StringBuilder();
sb.append("hello");
//String s = sb; //这个是错误的做法
//public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
String s = sb.toString();
System.out.println(s);
*/
//String 转换为 StringBuilder
String s = "hello";
//StringBuilder sb = s; //这个是错误的做法
//public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
StringBuilder sb = new StringBuilder(s);
System.out.println(sb);
}
}
- PS:进行转换后,还能再反复进行互相转换
- 结论:反复进行互相转换,即当需要变化内容就转换为StringBuilder类的对象,如果不需要改变了,想让其不被改变,又可以转换为String类的对象。
3.6 StringBuilder拼接字符串案例
案例需求 :
定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,
并在控制台输出结果。例如,数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]
实现步骤 :
- 定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
- 定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回。
返回值类型 String,参数列表 int[] arr - 在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
- 调用方法,用一个变量接收结果
- 输出结果
代码实现 :
/*
思路:
1:定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
2:定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回。
返回值类型 String,参数列表 int[] arr
3:在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
4:调用方法,用一个变量接收结果
5:输出结果
*/
public class StringBuilderTest01 {
public static void main(String[] args) {
//定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
int[] arr = {1, 2, 3};
//调用方法,用一个变量接收结果
String s = arrayToString(arr);
//输出结果
System.out.println("s:" + s);
}
//定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回
/*
两个明确:
返回值类型:String
参数:int[] arr
*/
public static String arrayToString(int[] arr) {
//在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i=0; i<arr.length; i++) {
if(i == arr.length-1) {
sb.append(arr[i]);
} else {
sb.append(arr[i]).append(", ");
}
}
sb.append("]");
String s = sb.toString();
return s;
}
}
3.7 StringBuilder—字符串反转案例
案例需求 :
例如: 键盘录入abcd,输出结果为dcba
思路:
- 键盘录入一个字符串,用Scanner实现
- 定义一个方法,实现字符串反转,返回值类型String,参数String类型
- 在方法中使用StringBuilder实现字符串的反转,并把结果转成Strin类型返回
代码实现:
// 2. 定义一个方法,实现字符串反转,返回值类型String,参数String类型
// 3. 在方法中使用StringBuilder实现字符串的反转,并把结果转成Strin类型返回
public static String show(String str){
StringBuilder sb = new StringBuilder(str);
sb=sb.reverse();
str=sb.toString();
return str;
}
public static void main(String[] args) {
// 例如: 键盘录入abcd,输出结果为dcba
// 1. 键盘录入一个字符串,用Scanner实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String str=sc.next();
str=show(str);
System.out.println(str);
}
4. Math类
-
1、Math类概述
- Math 包含执行基本数字运算的方法
-
2、Math中方法的调用方式
- Math类中无构造方法,但内部的方法都是静态的
- 则可以通过 类名.进行调用
-
3、Math类的常用方法
5. System类
-
被final修饰-不能被继承;没有构造方法-不能被实例化
-
内部方法都是静态的方法,通过类名.进行调用
-
System类的常用方法
-
示例代码
-
public static long currentTimeMillis()
-
需求1:在控制台输出1-10000,计算这段代码执行了多少毫秒
public class SystemDemo {
public static void main(String[] args) {
// 获取开始的时间节点
long start = System.currentTimeMillis();
for (int i = 1; i <= 10000; i++) {
System.out.println(i);
}
// 获取代码运行结束后的时间节点
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒");
}
}
-
需求2:从指定源数组中复制一个数组
- 复制从指定的位置开始,到目标数组的指定位置结束
-
使用方法:public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
6. Object类
6.1 Object类的toString方法
-
Object类概述
-
Object 是类层次结构的根
-
每个类都可以将 Object 作为超类。
-
所有类都直接或者间接(多层继承直至Objeck类)的继承自该类,换句话说,该类所具备的方法,所有类都会有一份
-
内部方法都是非私有的方法,子类都能调用
-
-
查看方法源码的方式
- 选中方法,按下Ctrl + B
-
重写toString方法的方式
-
- Alt + Insert 选择toString
-
- 在类的空白区域,右键 -> Generate -> 选择toString
-
某类若没有重写Object类中toString方法,输出打印该类对象时就会调用Objeck的toString方法,如上
-
toString方法的作用:
- 以良好的格式,更方便的展示对象中的属性值
6.2 Object类的equals方法
-
equals方法比较实体类对象时比较的是地址值
-
在String类中比较的是字符串的内容:并且区分大小写
-
equals方法的作用
- 用于对象之间的比较,返回true和false的结果
- 举例:s1.equals(s2); s1和s2是两个对象
-
重写equals方法的场景
- 不希望比较对象的地址值,想要结合对象属性进行比较的时候。
-
重写equals方法的方式
- 方式一:alt + insert 选择equals() and hashCode(),IntelliJ Default,一路next,finish即可
- 方式二:在类的空白区域,右键 -> Generate -> 选择equals() and hashCode(),后面的同上
7. Objects类
-
在 JDK1.7以后才有的Objects 类
-
内部的方法都是静态方法,因此直接通过 类名. 进行调用
-
常用方法
Objects类常用方法-示例代码
测试类
package com.wedu.ObjeckStudy;
import com.wedu.ObjeckStudy.domain.Student;
import java.util.Objects;
public class ObjeckStudyDemo01 {
public static void main(String[] args) {
/*
* Objects (应用)——常用方法如下
*/
//1.
//public static tring tostring(对象)返回参数中对象的字符串表示形式
Student student1 = new Student("01","猪八戒", 50);
System.out.println(Objects.toString(student1));//与下面那条语句的结果一样,了解即可
System.out.println(student1);
//2.
//public static String tostring(对象,默认字符串)返回对象的字符串表示形式
Student student2 = new Student();//如果无参构造了该对象,控制台打印结果依旧会执行Student.toString方法
System.out.println(Objects.toString(student2,"该对象为空,请知晓"));
student2=null;
System.out.println(Objects.toString(student2,"该对象为空,请知晓"));
System.out.println("================================");
//3.
//public static Boolean isNuLL(对象)判断对象是否为空——是不是空的
System.out.println(Objects.isNull(student2));
System.out.println(student2 == null);
//4.
//falsepublic static Boolean nonNuLL(对象)判断对象是否不为空——是不是不为空的/是不是有内容在里面
System.out.println(Objects.nonNull(student2));
System.out.println(student2!=null);
}
}
8. BigDecimal类
-
为什么适用BigDecimal
-
运算过程:
先要将十进制转换为二进制,得出运算结果后再转换为十进制进行显示
而浮点数没法通过二进制精确表示,所以存在精度误差问题
-
作用
- 可以用来进行精确计算
- 场景:适用于对精度比较高的场景,尤其用于金融场景下金额的计算
-
特殊:
在API帮助文档可以看到BigDecimal类是属于math类下的子类,因此虽然间接在java.lang包下,但是也需要导入math类的包才能使用
-
构造方法
-
尽量使用BigDecimal(String val),传递字符串形式进行精度问题的解决
-
常用方法
-
总结
- BigDecimal是用来进行精确计算的
- 创建BigDecimal的对象,构造方法使用参数类型为字符串的
- 四则运算中的除法,如果除不尽请使用divide的三个参数的方法
BigDecimal divide = bd1.divide(参与运算的对象,小数点后精确到多少位,舍入模式);
(以下都是API-JDK9中已过时的方法,可以用,但是存在可替代的方法,后期再学习)参数1 ,表示参与运算的BigDecimal 对象。 参数2 ,表示小数点后面精确到多少位 参数3 ,舍入模式
BigDecimal.ROUND_UP 进一法 BigDecimal.ROUND_FLOOR 去尾法
BigDecimal.ROUND_HALF_UP 四舍五入
9. 包装类
9.1 基本类型包装类
-
基本类型包装类的作用
将基本数据类型封装成对象的好处在于:可以在对象中定义更多的功能方法操作该数据
常用的操作之一:用于基本数据类型与字符串之间的转换
-
基本类型对应的包装类
9.2 Integer类(应用)
-
Integer类概述
包装一个对象中的原始类型 int 的值
-
Integer类构造方法
-
其他类型同理
9.3 自动拆箱和自动装箱
-
自动装箱
把基本数据类型转换为对应的包装类类型
-
自动拆箱
把包装类类型转换为对应的基本数据类型
9.4 int和String类型的相互转换
-
int转换为String
-
转换方式
-
方式一:直接在数字后加一个空字符串
-
方式二:通过String类静态方法valueOf()
-
-
String转换为int
-
转换方式
-
方式一:先将字符串数字转成Integer,再调用valueOf()方法
-
方式二:通过Integer静态方法parseInt()进行转换
-
注意:(方式一方式二同理)
-
9.5 字符串数据排序案例
-
案例需求
有一个字符串:“91 27 46 38 50”,请写程序实现最终输出结果是:27 38 46 50 91
-
思路
-
使用String中的String[] split(String regex)方法进行切割
分隔符选择空格,因为字符串中的有效数字之间是用空格分隔的
-
创建int类型的数组,来接收字符串切割后并经过转换的数据,因为转换类型后才能进行排序
-
用循环和String转换为int的方式二进行类型转换得到最终的int数组
-
按要求进行排序
-
使用循环遍历打印该数组
-
-
代码实现:
public class IntegerTest {
public static void main(String[] args) {
//定义一个字符串
String s = "91 27 46 38 50";
//把字符串中的数字数据存储到一个int类型的数组中
String[] strArray = s.split(" ");
// for(int i=0; i<strArray.length; i++) {
// System.out.println(strArray[i]);
// }
//定义一个int数组,把 String[] 数组中的每一个元素存储到 int 数组中
int[] arr = new int[strArray.length];
for(int i=0; i<arr.length; i++) {
arr[i] = Integer.parseInt(strArray[i]);
}
//对 int 数组进行排序
Arrays.sort(arr);
for(int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
}
}