JDK15中,源码已经改变,为:
private int newCapacity(int minCapacity) { int oldLength = value.length; int newLength = minCapacity << coder; int growth = newLength - oldLength; int length = ArraysSupport.newLength(oldLength, growth, oldLength + (2 << coder)); if (length == Integer.MAX_VALUE) { throw new OutOfMemoryError("Required length exceeds implementation limit"); } return length >> coder; }ArraysSupport.newLength这里就是比较growth和oldLength + (2 << coder)谁大,大者加上oldLength(这样就成了2倍+2)。这里coder原始值为0,我只看了append相关源码,coder值并没有变,其他源码没有看,注意可能发生改变。
JDK1.8中是直接进行移位操作+2的,现版本已更新。
StringBuffer常用方法
StringBuilder的API与之相同,只是线程不安全,没有保证同步。
java.lang.System中的static long currentTimeMillis() 返回当前时间与1970年1月1日00:00:00之间的时间差(以毫秒为单位)。适用于计算时间差。(时间戳)
计算世界时间的主要标准有:UTC, GMT, CST
java.util.Datejava.sql中也有一个Date类,是java.util.Date的子类
表示特定的时间,精确到毫秒
两个构造器的使用:
构造器一: 创建一个当前时间的Date对象
Date date = new Date(); System.out.println(date);//sout自带.toString,输出:Mon Apr 26 01:16:00 CST 2021 System.out.println(date.getTime());//返回当前date对象对应的时间戳 //Date中的无参构造源码 public Date() { this(System.currentTimeMillis()); }构造器二: 创建了一个指定时间的Date对象
Date date1 = new Date(1619371381884L); //随便找了个时间戳 System.out.println(date1);构造器的其余方法均已过时,不建议使用。
java.sql.Date对应的是数据库中的日期时间类,一般在数据库交互时使用
java.sql.Date date2 = new java.sql.Date(1619371381884L); //2021-04-26 System.out.println(date2);该类没有无参构造。输出形式不同。
两种Date互转:
Date date3 = (Date)date2; //子类转父类 System.out.println(date3); java.sql.Date date4 = new java.sql.Date(new Date().getTime()); //父类转子类,不能强制类型转换 java.text.SimpleDateFormat允许进行格式化:日期-->文本,解析:文本-->日期
格式化:
解析:
Date parse(String text, ParsePosition pos) 从字符串中解析文本以产生一个 Date 。
pattern举例如下图:
demo1默认模式:
SimpleDateFormat sdf = new SimpleDateFormat(); Date date = new Date(); String format = sdf.format(date); System.out.println(date); //Mon Apr 26 02:38:11 CST 2021 System.out.println(format); //2021/4/26 上午2:38 //解析过程 String str = "2021/4/16 上午12:38"; //格式有要求 Date date1 = sdf.parse(str); System.out.println(date1); //Fri Apr 16 00:38:00 CST 2021使用指定模式:
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy,MM,dd HH:mm:ss aaa"); String str2 = sdf1.format(date); System.out.println(str2); //2021,04,26 02:47:22 上午 //解析的话也需要按这种模式进行,正常模式通常为”yyyy-MM-dd hh:mm:ss“ String str3 ="2021,04,26 02:47:22 上午"; Date date2 = sdf1.parse(str3); System.out.println(date2); //Mon Apr 26 02:47:22 CST 2021 CalendarCalendar是一个抽象类,主要用于完成日期字段之间的相互操作。
Calendar提供了一种类方法getInstance ,用于获取此类型的一般有用的对象。 Calendar的getInstance方法返回一个Calendar对象,其日历字段已使用当前日期和时间进行初始化:
Calendar rightNow = Calendar.getInstance();调用了它的子类GregorianCalendar的构造器
Calendar calendar = Calendar.getInstance(); System.out.println(calendar.getClass());//class java.util.GregorianCalendarCalendar对象可以产生实现特定语言和日历风格的日期时间格式化所需的所有日历字段值(例如日语 - 公历,日语 - 繁体)。 Calendar定义某些日历字段返回的值的范围及其含义。 例如,日历系统第一个月的值为MONTH == JANUARY为所有日历。 其他值由具体的子类定义,如ERA 。 有关详细信息,请参阅各个实体文档和子类文档。
常用方法:
void set(int field, int value) 将给定的日历字段设置为给定的值。
void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。
final Date getTime() 返回一个 Date表示此物体 Calendar的时间值
void setTime(Date date) 使用给定的 Date设置此日历的时间