Java日常的String、Date、计算问题-LMLPHP

一、String相关类

三者执行速度:StringBuilder > StringBuffer > String

1.1、String

每次对 String 类型改变的时,都会生成一个新的 String 对象,指针指向新的 String 对象。
适用于字符串不常变的,少量的数据场景中,例如常量的声明、少量的变量运算...等。

1.2、StringBuilder

对象可以直接进行修改,不会生成新的对象。
适用于单线程频繁进行字符串运算(如拼接、替换、和删除等),如SQL语句的拼装、JSON封装...等。

1.3、StringBuffer

每次都对对象本身进行操作,不是生成新的对象。对方法加了同步锁(synchronized)或对调用的方法加了同步锁,线程安全。
适用于多线程频繁进行字符串运算(如拼接、替换、和删除等),如XML解析、HTTP参数解析和封装...等。

二、Java8新增的日期类

2.1、Clock

用于获取指定时区的当前日期、时间。该类可以取代System类的currentTimeMillis()方法。

//获取当前Clock
Clock clock = Clock.systemUTC();
//获取clock对应的毫秒数
//等于System.currentTimeMillis()
System.out.println(clock.millis());
System.out.println(System.currentTimeMillis());

2.2、Duration

持续时间

Duration d = Duration.ofSeconds(600); 
System.out.println("600秒="+d.toMinutes()+"分"); 
System.out.println("600秒="+d.toHours()+"时"); 
System.out.println("600秒="+d.toDays()+"天"); 

2.3、Instant:

一个具体的时刻,可以精确到纳秒。
1)now():获取当前时刻。
2)now(Clock clock):获取clock对应的时刻。
3)minusXxx():在当前时刻基础上减去一段时间。
4)plusXxx():在当前时刻基础上加上一段时间。

//获取当前时间
Instant instant = Instant.now();
System.out.println(instant);
//instant增加600秒
Instant instant2 = instant.plusSeconds(600);

2.4、LocalDate

代表不带时区的日期,如:2019-02-24。
1)now():获取当前日期。
2)now(Clock clock):获取clock对应的日期。
3)minusXxx():在当前年份基础上减去几年、几月、几周或几日等。
4)plusXxx():在当前年份基础上加上几年、几月、几周或几日等。

2.5、LocalTime

代表不带时区的时间,如:10:20:09。
1)now():获取当前时间。
2)now(Clock clock):获取clock对应的时间。
3)minusXxx():在当前年份基础上减去几小时、几分、几秒等。
4)plusXxx():在当前年份基础上加上几小时、几分、几秒等。

2.6、LocalDateTime

代表不带时区的日期、时间,如:2019-02-24T10:20:09。
1)now():获取当前日期、时间。
2)now(Clock clock):获取clock对应的日期、时间。
3)minusXxx():在当前年份基础上减去几年、几月、几周或几日、几小时、几分、几秒等。
4)plusXxx():在当前年份基础上加上几年、几月、几周或几日、几小时、几分、几秒等。

2.7、MonthDay

仅代表月日,如:--09-20。
1)now():获取当前月日。
2)now(Clock clock):获取clock对应的月日。

2.8、Year

仅代表年,如:2019。
1)now():获取当前年份。
2)now(Clock clock):获取clock对应的年份。
3)minusXxx():在当前年份基础上减去几年。
4)plusXxx():在当前年份基础上加上几年。

2.9、YearMonth

仅代表年月,如:2019-02。
1)now():获取当前年月。
2)now(Clock clock):获取clock对应的年月。
3)minusXxx():在当前年份基础上减去几年、几月。
4)plusXxx():在当前年份基础上加上几年、几月。

ZonedDateTime:有时区的日期时间。
ZonedId:代表一个时区。
DayOfWeek:枚举类,定义了周一到周日的枚举值。
Month:、枚举类,定义了一月到十二月的枚举值。

三、计算问题和引用

3.1、BigDecimal 

金钱应采用java.math.BigDecimal存储;
BigDecimal入库时,选decimal类型,注意默写成0.00,不要用默认的NULL。
使用BigDecimal(String val) 创建对象,如BigDecimal numA=new BigDecimal("0.6");,
不要用参数为float、double 创建对象,如BigDecimal numA=new BigDecimal(0.6);
用参数为float、double 创建对象会丢失精度。

3.2、SoftReference 软引用 

static SoftReference<List<String>> cacheList = new SoftReference<List<String>>(Arrays.asList("AAA","BBB","CCC"));

public static void main(String[] args) {
    List<String> myList = cacheList.get();
    for (String str : myList) {
        System.out.println(str);
    }
}
08-20 02:36