常用类库
1.泛型
1.1 概述
1.泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
2.作用
1、 提高代码复用率
2、 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)
3.注意 在编译之后程序会采取去泛型化的措施。
- 也就是说Java中的泛型,只在编译阶段有效。
- 在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
1.2 使用
- 泛型类
定义一个泛型类:
public class ClassName<T>{
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
- 泛型接口
定义一个泛型接口
public interface IntercaceName<T>{
T getData();
}
实现接口时,可以选择指定泛型类型,也可以选择不指定, 如下:
指定类型:
public class Interface1 implements IntercaceName<String> {
private String text;
@Override
public String getData() {
return text;
}
}
不指定类型:
public class Interface1<T> implements IntercaceName<T> {
private T data;
@Override
public T getData() {
return data;
}
}
- 泛型fnagfa
private static <T> T 方法名(T a, T b) {}
1.3 泛型限定和通配符
- 在使用泛型时, 可以指定泛型的限定区域 。
- 例如: 必须是某某类的子类或 某某接口的实现类,格式:
<T extends 类或接口1 & 接口2>
- 类型通配符是使用?代替方法具体的类型实参。
1 <? extends Parent> 指定了泛型类型的上届
2 <? super Child> 指定了泛型类型的下届
3 <?> 指定了没有限制的泛型类型
2. java.util.Objects
2.1 Object与Objects
-
Object
-
Objects
2.2 Objects中的equals
-
使用对象的equals方法
-
使用Objects中的equals方法
-
源码
2.3 Objects中的requireNonNull
判断对象是否为空,若为空则抛出异常。常用于要求对象不能为空的场景:
源码:
3. java.lang.Math
用于数字计算。
4. java.util.Arrays
4.1 二分查找binarySearch
实例:
4.2 复制数组copyOf、copyOfRange
5. java.math.BigDecimal
5.1 问题引入
输出两个小数之和
通过在控制台运行0.1+0.2。 会发现float和double的运算误差由于float类型和doub1 e类型在运算时可能会有误差,为了实现精确运算则需要借助java.math. BigDecima 类加以描述
5.2 常用方法及使用
需要通过BigDecimal创建对象,相要参与运算的小数的字符串形式作为参数。
6. java.util.Date
6.1 概念
6.2 应用
- 打印当前时间
- 打印提前一小时的时间
7. java.text.DateFormat
7.1 概念
用于格式化和解析字符串。DateFormat是一个抽象类,经常使用他的直接子类SimpleDateFormat
7.2 应用
-
格式定义。将时间转换为指定格式
-
使用方法format转换为想要的格式
-
使用方法parse 将指定格式的时间字符串转换为date对象
-
计算时间差
8. java.util.Calendar
可以解决国际化的问题。Calendar为抽象类,需要通过getInstance获得对象;
8.1 获取年月日时分秒:get
实例:
调用过程:get-》internalGet
8.2 获得今天是一年中的第几天:get
8.3 如何设置日历来方便计算:set
8.4 通过加减修改年月日等参数:add
9. java.lang.System
10. String
String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。
- 字符串是不变的; 它们的值在创建后无法更改。
- 字符串缓冲区支持可变字符串。
- 因为String对象是不可变的,所以可以共享它们。(如果两字符串内容完全相同,则采用同一块内存地址)
10.1 字符串常量池
- 方法区
方法区(Method Area),又称永久代(Permanent Generation)(永久存储在内存中,就像静态代码块不会执行两次一样), 又称非堆区( Non-Heap space)方法区,又称永久代(Permanent Generation),常称为PermGen,位于非堆空间,又称非堆区(Non-Heap space)。
方法区是被所有线程共享。
- 所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。
- 简单说,所有定义的方法的信息都保存在该区域,此区属于共享区间。
- 这些区域存储的是:静态变量 +常量+类信息(构造方法/接口定义) +运行时常量池。 但是,实例变量 存在堆内存中,和方法区无关。
以上,只是逻辑上的定义。在HotSpot中,方法区仅仅只是逻辑上的独立,实际上还是包含在Java堆中,也是就说,方式区在物理上属于Java堆区中的一部分,而永久区(Permanent Generation) 就是方法区的实现。
- 堆(heap)
一个JW实例只存在一一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。
堆在逻辑上分为三部分(Perm) :
- 新生代(Young Generation, 常称为YoungGen)
- 老年代(01d Generation,常称为oldGen、TenuringGen)
- 永久代(Permanent Generation, 常称为PermGen)
10.2 常用的字符串方法