最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDK9的新特性之String壓縮和字符編碼的實(shí)現(xiàn)方法

 更新時(shí)間:2020年05月21日 09:52:25   作者:flydean  
這篇文章主要介紹了JDK9的新特性之String壓縮和字符編碼的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

簡(jiǎn)介

String的底層存儲(chǔ)是什么?相信大部分人都會(huì)說(shuō)是數(shù)組。如果要是再問(wèn)一句,那么是以什么數(shù)組來(lái)存儲(chǔ)呢?相信不同的人有不同的答案。

在JDK9之前,String的底層存儲(chǔ)結(jié)構(gòu)是char[],一個(gè)char需要占用兩個(gè)字節(jié)的存儲(chǔ)單位。

據(jù)說(shuō)是JDK的開發(fā)人員經(jīng)過(guò)調(diào)研了成千上萬(wàn)的應(yīng)用程序的heap dump信息,然后得出了一個(gè)結(jié)論:大部分的String都是以Latin-1字符編碼來(lái)表示的,只需要一個(gè)字節(jié)存儲(chǔ)就夠了,兩個(gè)字節(jié)完全是浪費(fèi)。

據(jù)說(shuō)他們用了大數(shù)據(jù)+人工智能,得出的結(jié)論由不得我們不信。

于是在JDK9之后,字符串的底層存儲(chǔ)變成了byte[]。

底層實(shí)現(xiàn)

先看下java9之前的String是怎么實(shí)現(xiàn)的:

public final class String
 implements java.io.Serializable, Comparable<String>, CharSequence {
 
 //The value is used for character storage.
 private final char value[];
}

再看下java9中String的實(shí)現(xiàn)和一些關(guān)鍵的變量:

public final class String
 implements java.io.Serializable, Comparable<String>, CharSequence {
 
 /** The value is used for character storage. */
 @Stable
 private final byte[] value;

 private final byte coder;

 @Native static final byte LATIN1 = 0;
 @Native static final byte UTF16 = 1;

 static final boolean COMPACT_STRINGS;

 static {
  COMPACT_STRINGS = true;
 }

從代碼我們可以看到底層的存儲(chǔ)已經(jīng)變成了byte[]。

再看一下coder變量,coder代表編碼的格式,目前String支持兩種編碼格式LATIN1和UTF16。

LATIN1需要用一個(gè)字節(jié)來(lái)存儲(chǔ)。而UTF16需要使用2個(gè)字節(jié)或者4個(gè)字節(jié)來(lái)存儲(chǔ)。

而COMPACT_STRINGS則是用來(lái)控制是否開啟String的compact功能。默認(rèn)情況下COMPACT_STRINGS功能是開啟的。

如果我們想關(guān)閉COMPACT_STRINGS功能則可以使用-XX:-CompactStrings參數(shù)。

ps:下面看下jdk8日期格式化的實(shí)例代碼

package time;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
/***
 * 總結(jié): java.util.Date和 SimpleDateFormat 都是非線程安全的
 * 1. LocalDate
 * 2. LocalTime
 * 3. LocalDateTime
 * 4. DateTimeFormatter
 * 5. ChronoUnit
 */
public class Java8Date {
  public static void main(String[] args) {
    /** #0. Calendar
     * 區(qū)別于calendar的month: canlendar中:[]
     * 1. LocalDate的年月日直接是日期中的值;
     * 2. date.getMonthValue() 和 c.get(Calendar.MONTH) 有區(qū)別: c:0表示1月
     */
    Calendar c = Calendar.getInstance(); // 測(cè)試日期:2019-04-02
    System.out.println(c.get(Calendar.YEAR)); // 2019
    System.out.println(c.get(Calendar.MONTH)); // 3(0=1月)
    System.out.println(c.get(Calendar.DAY_OF_MONTH)); //2
    // #1. LocalDate 2019-04-02 : 今日日期: LocalDate.now()
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    LocalDate date = LocalDate.now();
    System.out.println(date); // 2019-04-02
    // #2. year month day: 年月日獲取
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    int year = date.getYear(); // 2019
    int month = date.getMonthValue();// 4
    int day = date.getDayOfMonth(); // 2
    System.out.println(year + "-" + month + "-" + day); // 2019-4-2
    // #3. 構(gòu)造日期: 給定年月日
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    LocalDate dt1 = LocalDate.of(2019, 3, 8);
    LocalDate dt2 = LocalDate.of(2019, 3, 8);
    // #4. 日期比較: equals
    // true: 內(nèi)部是比較的 year-year month-month day-day
    System.out.println(dt2.equals(dt1)); 
    // #5. 周期性日期, 比如: 判斷用戶的生日
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    // 生日:0308
    MonthDay uBirth = MonthDay.of(3, 8);
    MonthDay dtMD = MonthDay.from(dt1);
    // dt1 是不是 用戶u的生日:true
    System.out.println("dt1==用戶u的生日:" + dtMD.equals(uBirth));
    // #6. 獲取當(dāng)前時(shí)間 [HH:mm:ss.SSS]
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    LocalTime time = LocalTime.now();
    System.out.println(time);
    // #7. 增減時(shí)間 plus/minus
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    // dt1=2019-03-08
    LocalDate dt1Plus2d = dt1.plusDays(2); 
    LocalDate dt1Plus2y = dt1.plusYears(2); 
    LocalDate dt1Plus2m = dt1.plusMonths(2);
    System.out.println(dt1Plus2d); // 2019-03-10
    System.out.println(dt1Plus2y); // 2021-03-08
    System.out.println(dt1Plus2m); // 2019-05-08
    // dt1=2019-03-08
    LocalDate plus1w = dt1.plus(1, ChronoUnit.WEEKS);
    LocalDate plus1d = dt1.plus(1, ChronoUnit.DAYS);
    LocalDate plus18y = dt1.plus(18, ChronoUnit.YEARS);
    LocalDate minus1y = dt1.minus(1, ChronoUnit.YEARS);
    System.out.println(plus1w); // 2019-03-15
    System.out.println(plus1d); // 2019-03-09
    System.out.println(plus18y); // 2037-03-08
    System.out.println(minus1y); // 2018-03-08
    // #8. 日期dt1 早于/晚于 minus1y
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    // dt1=2019-03-08 minus1y=2018-03-08
    System.out.println(dt1.isAfter(minus1y)); // true
    System.out.println(dt1.isBefore(minus1y)); // false
    // #9. 計(jì)算日期差
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    // dt1=2019-03-08 dt20190402
    LocalDate dt20190402 = LocalDate.of(2019, 4, 2);
    Period btPeriod = Period.between(dt1, dt20190402);
    Period btPeriod2 = Period.between(dt1, dt20190402);
    System.out.println(btPeriod); // P25D
    System.out.println(btPeriod.getMonths()); // 0
    System.out.println(btPeriod.getDays()); // 25
    // 25 可見是標(biāo)量, 不是矢量, 只計(jì)算差數(shù)
    System.out.println(btPeriod2.getDays()); 
    // #10. 時(shí)間戳Instant->java.util.Date[getTime()==toEpochMilli()]
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    Instant now = Instant.now(); // 2019-04-02T08:48:46.755Z
    Date dtNow = Date.from(now); // Tue Apr 02 16:48:46 CST 2019
    long millisInstant = now.toEpochMilli();
    long millisDate = dtNow.getTime();
    System.out.println(millisInstant); // 1554195038598
    System.out.println(millisDate); // 1554195038598
    // #11# ** 日期格式化
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    DateTimeFormatter pattern1 = DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss,SSS");
    DateTimeFormatter pattern2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    /**
     * 命題:--> 將 "20190215-22:10:30,333" 日期
     * 格式化為 "yyyyMMdd-HH mm:ss.SSS" 字符串
     * @.1. 字符串轉(zhuǎn)對(duì)象LocalDateTime
     * @.2. LocalDateTime對(duì)象轉(zhuǎn)字符串
     */
    String strDt = "20190215-22:10:30,333"; // @.1.
    LocalDateTime dateTime = LocalDateTime.parse(strDt, pattern1); 
    String fmtDtString = dateTime.format(pattern2); // @.2.
    System.out.println(dateTime); // 2019-02-15T22:10:30.333
    System.out.println(fmtDtString); // 2019-02-15 22:10:30
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
  }
}

總結(jié)

本文講解了新的String實(shí)現(xiàn)和COMPACT_STRINGS模式的關(guān)閉方法。

到此這篇關(guān)于JDK9的新特性之String壓縮和字符編碼的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)JDK9 新特性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(47)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(47)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-08-08
  • SpringCloud配置中心Config過(guò)程解析

    SpringCloud配置中心Config過(guò)程解析

    這篇文章主要介紹了SpringCloud配置中心Config過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 去掉 IDEA 中 mybatis配置文件的局部背景顏色(圖解)

    去掉 IDEA 中 mybatis配置文件的局部背景顏色(圖解)

    這篇文章通過(guò)圖文并茂的形式給大家介紹了去掉IntelliJ IDEA 中 mybatis配置文件的局部背景顏色及mybatis 對(duì)應(yīng)的 xml 文件警告的方法圖解,需要的朋友可以參考下
    2018-09-09
  • SpringBoot自定義加載yml實(shí)現(xiàn)方式,附源碼解讀

    SpringBoot自定義加載yml實(shí)現(xiàn)方式,附源碼解讀

    這篇文章主要介紹了SpringBoot自定義加載yml實(shí)現(xiàn)方式附源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • ssm 使用token校驗(yàn)登錄的實(shí)現(xiàn)

    ssm 使用token校驗(yàn)登錄的實(shí)現(xiàn)

    這篇文章主要介紹了ssm 使用token校驗(yàn)登錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot詳細(xì)介紹SPI機(jī)制示例

    SpringBoot詳細(xì)介紹SPI機(jī)制示例

    這篇文章主要介紹了深入解析Spring Boot的SPI機(jī)制詳情,SPI是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,可以用來(lái)啟用框架擴(kuò)展和替換組件,主要用于框架中開發(fā),更多相關(guān)介紹,感興趣的小伙伴可以參考一下下面文章內(nèi)容
    2022-08-08
  • java.io.File的renameTo方法移動(dòng)文件失敗的解決方案

    java.io.File的renameTo方法移動(dòng)文件失敗的解決方案

    這篇文章主要介紹了java.io.File的renameTo方法移動(dòng)文件失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹的原理及實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹的原理及實(shí)現(xiàn)

    紅黑樹是一種特殊的二叉查找樹,每個(gè)結(jié)點(diǎn)都要儲(chǔ)存位表示結(jié)點(diǎn)的顏色,或紅或黑。本文將通過(guò)示例為大家詳細(xì)講講紅黑樹的原理及Java實(shí)現(xiàn),感興趣的可以了解一下
    2022-09-09
  • Java中StringBuilder常用構(gòu)造方法解析

    Java中StringBuilder常用構(gòu)造方法解析

    這篇文章主要介紹了Java中StringBuilder常用構(gòu)造方法解析,StringBuilder是一個(gè)可標(biāo)的字符串類,我們可以吧它看成是一個(gè)容器這里的可變指的是StringBuilder對(duì)象中的內(nèi)容是可變的,需要的朋友可以參考下
    2024-01-01
  • SpringEvents與異步事件驅(qū)動(dòng)案例詳解

    SpringEvents與異步事件驅(qū)動(dòng)案例詳解

    本文深入探討了SpringBoot中的事件驅(qū)動(dòng)架構(gòu),特別是通過(guò)Spring事件機(jī)制實(shí)現(xiàn)組件解耦和系統(tǒng)擴(kuò)展性增強(qiáng),介紹了事件的發(fā)布者、事件本身、事件監(jiān)聽器和事件處理器的概念,感興趣的朋友跟隨小編一起看看吧
    2024-09-09

最新評(píng)論

栖霞市| 临武县| 淮南市| 射洪县| 观塘区| 常熟市| 靖江市| 扎鲁特旗| 邓州市| 内江市| 蓬莱市| 峨眉山市| 邓州市| 嘉峪关市| 修文县| 扎鲁特旗| 永平县| 郁南县| 介休市| 陆河县| 大庆市| 西充县| 财经| 邢台市| 宾阳县| 赤水市| 普兰县| 阜新市| 桑植县| 囊谦县| 涿鹿县| 漳州市| 徐汇区| 安陆市| 玉环县| 涞源县| 楚雄市| 防城港市| 申扎县| 融水| 宁陕县|