3.2.常用类库
2.1 泛型
2.1.1 定义
- 参数化类型。将类型有原来的具体类型参数化,类似于方法中的变量参数。
2.1.2 使用方法
2.1.2.1 泛型类
- 作用:声明属性时,类型可以参数化
2.1.2.2 泛型接口
- 作用:声明抽象方法时可以参数化
- 实现该接口时有两种方法
- 指定泛型类型
- 不指定泛型类型
//指定泛型类型
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;
}
}
2.1.2.3 泛型方法
- 作用:提高了非继承的两个类对同一方法的复用性,常和抽象方法结合使用
- 分析:以往若想通过一个方法传两种类型的形参,需方法重载或父子类继承,现在通过泛型化参数,使得两个没有关联的两个类也能使用同一个
- 要点:
- 形参泛型化和与类是否泛型化无关,与方法是否泛型化有关
- 方法泛型具体化后,形参/返回值也必须具体化
- 方法泛型化,若无泛型化形参,则此泛型不起作用,若返回值也为泛型,则起作用
- 方法返回值为泛型前提该方法必须为泛型方法
- 返回值为泛型,多与抽象类使用,否则需形参为泛型,不然无返回值
2.1.3 通配符
2.1.3.1 使用格式
<? extends Parent>//指定了泛型类型的上届,?是子类
<? super Child>//指定了泛型类型的下届,?是父类
2.1.3.2 使用位置
- 通过构造方法,实例化对象时
public class Demo4 {
public static void main(String[] args) {
Test1<? extends Demo4> t=new Test1<>();
Test1<? super Son0fDemo4> t2=new Test1<>();
}
}
class Son0fDemo4 extends Demo4 { }
class Test1<T> { }
2.1.4 注意事项
- 在编译之后程序会采取去泛型化的措施。
- 即Java中的泛型,只在编译阶段有效。不会进入到运行时阶段
- 在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加 类型检查和类型转换的方法。
2.2 Math类
2.2.1 常用方法
//取绝对值
System.out.println(Math.abs(-100));
//取最小值
System.out.println(Math.min(200, 300));
//四舍五入
System.out.println(Math.round(30.5));//31
System.out.println(Math.round(-30.5));//-30
//返回小于等于参数的最大整数
System.out.println(Math.floor(30.5));//30
System.out.println(Math.floor(-30.5));//-31
//返回大于等于参数的最大整数
System.out.println(Math.ceil(30.5));//31
System.out.println(Math.ceil(-30.5));//-30
2.3 Arrays类
2.2.2 常用方法
int[] arr = {1, 4, 3, 5, 2};
//输出数组元素
System.out.println(Arrays.toString(arr));
//数组正向排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//查找某个元素的下标
System.out.println(Arrays.binarySearch(arr,5));
//数组扩容
int[] ints = Arrays.copyOf(arr, 10);
2.4 BigDecimal类
2.4.1 概念
- 通过控制台运行0.1+0.2会发现float和double的运算误差
2.4.2 运算方法
- 运算结果不会参与运算本身的数据,而是会被封装为一个新的BigDecimal对象
BigDecimal b1 = new BigDecimal(0.1);
BigDecimal b2 = new BigDecimal(0.2);
BigDecimal b3 = b2.add(b1);//加法
BigDecimal b4 = b2.subtract(b1);//减法
BigDecimal b5 = b2.multiply(b1);//乘法 结果:
BigDecimal b6 = b2.divide(b1);//除法
System.out.println(b5); //0.0200000000000000022204460492503131424770215
System.out.println(0.1*0.2); //0.020000000000000004
2.5 Date类
2.5.1 作用:表示特定的时刻,精度为毫秒
2.5.2 常用方法
- Date():不传参,传入当前日期
- getTime:获取当前毫秒数
- setTime:设置当前毫秒数
2.5 DateFormat类
2.5.1 作用
- 格式化日期字符串
2.5.2 常用方法
//将日期对象转换成字符串
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = s.format(new Date());
System.out.println(time);
//将字符串转换成日期对象
Date date = s.parse("2021-10-1 20:11:33");
System.out.println(date);
面试题:求一个人年龄或给定年龄求哪一年出生的
//求一个人的年龄
System.out.println((new Date().
getTime()-date.getTime())/1000/60/60/24);//date为变量
//求哪一年出生的
int age=18;
System.out.println(new Date().getTime()/1000/60/60/24-age);
2.6 Calendar类
2.6.1 作用
- 传入年月日等时间对象,比Date类更具国际化
2.6.2 常用方法
//实例化
Calendar c=Calendar.getInstance();
//获取值
//原理:通过int类型field[]数组存储全局常量,YEAR=1,MONTH=2,WEEK=3
//这些数字就是数组的下标,通过全局常量对应的下标对数据进行操作
//年份
System.out.println(c.get(Calendar.YEAR));
//月份 1-12月对应0-11 获取正确的月份需+1
System.out.println(c.get(Calendar.MONTH)+1);
//第几周
System.out.println(c.get(Calendar.WEEK_OF_YEAR));
//几号
System.out.println(c.get(Calendar.DAY_OF_MONTH));
//周几 周日对应1
System.out.println(c.get(Calendar.DAY_OF_WEEK)-1);
//一年第几天
System.out.println(c.get(Calendar.DAY_OF_YEAR));
//增减值
c.add(Calendar.YEAR,-1);
//获取日期对象
Date time = c.getTime();
//获取最大值
c.set(Calendar.MONTH, 1);
System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));//2月最大天数
2.7 String类
2.7.1 定义
- 字符串是不变的,值在创建后无法更改。
2.7.2 原理
- 通过char[]数组存储,长度确定
2.7.3 拼接
- 用加号(+)
- 分析:在方法区中生成新的字符串,GC不能回收,生成较多内存垃圾
- 用实现类(可变字符序列)
- StringBuilder:线程不安全,效率高
- StringBuffer:线程安全,效率低
- 原理:通过构造方法构造一个字符串缓冲区,其中无字符,初始容量为16个字符,存满自动扩容,通过append方法进行拼接
2.7.4 常用方法
/**
* 1. 练习 1:StringBuffer 中的 reverse()
*/
public static void reverse() {
String str = "I love China";
System.out.println(new StringBuffer(str).reverse().toString());
}
/**
* 2. 练习 2:使用 String 的方法按照空格间隔每部分数据,然后再根据等号切割
*/
public static void spilt() {
//实例化学生类对象
Student s=new Student();
//要分割的数据
String info = "name=王五 age=18 classNum=1101";
//分割后的数据
String str[] = info.split(" |=");
welcome~the interesting soul

浙公网安备 33010602011771号