API,SPI,时间,String
JAVA(API,时间,String)
JAVA值传递
Java的值传递和所谓的引用传递
本质上Java只有值传递,所有的赋值传参都是一次值的拷贝
引用数据类型其实拷贝的就是引用地址(虚地址)
基本数据类型拷贝的是值,不会传入实例对象本身
public class Test1 {
private String name;
public Test1(String name){
this.name=name;
}
public static void change(Test1 person){
person=new Test1("Jerry");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
public static void main(String[] args) {
Test1 person=new Test1("Tom");
change(person);
System.out.println(person);//Tom
}
}
常用API
System.currentTimeMillis()获取毫秒
Date date=new Date();获取日期
date.compareTo(date2)返回负数,小于参数;返回0,等于参数;返回正数,大于参数
CalendarCalendar是一个抽象类,能new不能创建对象
- JDK1.1版本开始,在处理时间和日期时,系统推荐使用Calendar类
- Calendar要比Date强大的多
Calender calendar=new Calendar.getInstance();
calendar.get(Calendar.Year);
calendar.get(Calendar.DAY_OF_YEAR);
calendar.get(Calendar.HOUR_OF_DAY);
calendar.get(Calendar.HOUR);
获取当前虚拟机时间
TimeZone.getDefault();
Zoneld
获取某一时区的id
ZoneId zoneId = ZoneId.of("America/New_York");
System.out.println(TimeZone.getTimeZone(zoneId));
日期格式化
SimpleDateFormat
- format:格式化Date类型,把Date类型转成String类型
- 我们要展示数据到客户端
- parse:把String类型的时间,转成Date类型
- 从客户端传过来的时间,一般都是String类型,存入数据库。
- yyyy代表年,yy代表年的后两位
- MM代表月
- dd代表日
- HH代表小时(24小时制) hh代表小时(12小时制)
- mm代表分
- ss代表秒
- SSS代表毫秒
获取持续时间
Instant instant=Instant.now();
Instant plus=instant.plus(Duation.ofDays(5));
获取当前的日期 LocalDate
LoclDate.now();
now.getMonth();
now.getDayOfWeek();
LoclDate of=LoclDate.of(2022,9,6);
//判断闰年
now.isLeapYear();
本地时间
LoclTime now=LoclTime.now();
LoclDateTime.now();
处理日期的格式化问题 DateTimeFormatter
LocalDate now = LocalDate.now();
DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy年MM月dd日");
把Instant转成Date
Date date=Date.from(instant);
把Date转成Instant
Instant toInstant=date.toInstant();
把Instant转成LocalDateTime
LocalDateTime localDateTime=LocalDateTime.ofInstant(instant.ZoneId.systemDefault);
把LocalDateTime转成Instant
Instant in=LocalDateTime.now().toInstant(ZoneOffset.UTC);
把Date转成LocalDateTime
Date date=new Date();
Instant in=date.toInstant();
LocalDateTime.ofInstant(in,ZoneId.systemDefault());
把LocalDateTime转成Date
LocalDateTime now = LocalDateTime.now();
Instant in=now.atZone(ZoneId.systemDefault()).toInstant;
Date date=Date.form(in);
SPI
SPI 即 Service Provider Interface ,字面意思就是:“服务提供者的接口”,我的理解是:专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。
SPI 将服务接口和具体的服务实现分离开来,将服务调用方和服务实现者解耦,能够提升程序的扩展性、可维护性。修改或者替换服务实现并不需要修改调用方。
很多框架都使用了 Java 的 SPI 机制,比如:Spring 框架、数据库加载驱动、日志接口、以及 Dubbo 的扩展实现等等。
SPI 与 API 的区别

一般模块之间都是通过通过接口进行通讯,那我们在服务调用方和服务实现方(也称服务提供者)之间引入一个“接口”。
当实现方提供了接口和实现,我们可以通过调用实现方的接口从而拥有实现方给我们提供的能力,这就是 API ,这种接口和实现都是放在实现方的。
当接口存在于调用方这边时,就是 SPI ,由接口调用方确定接口规则,然后由不同的厂商去根绝这个规则对这个接口进行实现,从而提供服务。
一般模块之间都是通过通过接口进行通讯,那我们在服务调用方和服务实现方(也称服务提供者)之间引入一个“接口”。
当实现方提供了接口和实现,我们可以通过调用实现方的接口从而拥有实现方给我们提供的能力,这就是 API ,这种接口和实现都是放在实现方的。
当接口存在于调用方这边时,就是 SPI ,由接口调用方确定接口规则,然后由不同的厂商去根绝这个规则对这个接口进行实现,从而提供服务。
SPI 缺点
- 需要遍历加载所有的实现类,不能做到按需加载,这样效率还是相对较低的。
- 当多个
ServiceLoader同时load时,会有并发问题
Math类
- 随机数 random() double
- 向上取整 ceil() double
- 向下取整 floor()double
- 四舍五入 round()long
随机类 Random
BigDecimal统计类
BigDecimal big1=new BigDecimal("0.3");
StringBuffer和StringBuilder——可变的字符序列
和String是有本质区别的
StringBuffer不能直接用等号赋值
String StringBuffer StringBuilder区别及其使用场景
String 是被final 修饰的,所以是不可变的,每一次的操作都会生成一个新的String对象,频繁的使用会占用内存大
StringBuffer和StringBuilder是对原有对象基础上操作,不会产生新的对象,占用内存小
StringBuffer是线程安全的 StringBuilder是不安全的

浙公网安备 33010602011771号