JDK 9 의 새로운 기능 의 String 압축 과 문자 인 코딩 실현 방법

간단 한 소개
String 의 바 텀 저장 소 는 무엇 입 니까?대부분의 사람들 이 배열 이 라 고 할 거 라 고 믿 습 니 다.한 마디 만 더 물 어보 면 어떤 배열 로 저장 되 나 요?사람마다 다른 답 이 있다 고 믿는다.
JDK 9 이전에 String 의 바 텀 저장 구 조 는 char[]이 었 고 하나의 char 는 두 바이트 의 저장 단 위 를 차지 해 야 했다.
JDK 개발 자 들 은 수천 개의 애플 리 케 이 션 의 힙 덤 프 정 보 를 조사 한 결과 대부분의 String 은 Latin-1 문자 인 코딩 으로 표시 되 는데 한 바이트 만 저장 하면 되 고 두 바이트 가 완전히 낭비 된다 는 결론 을 내 렸 다 고 한다.
빅 데이터+인공지능 을 사용 해 내 린 결론 은 우리 가 믿 지 않 을 수 없다 고 한다.
그래서 JDK 9 이후 문자열 의 바 텀 저장 소 는 by te[]로 바 뀌 었 다.
밑바닥 실현
자바 9 이전의 String 이 어떻게 이 루어 졌 는 지 먼저 살 펴 보 겠 습 니 다.

public final class String
 implements java.io.Serializable, Comparable<String>, CharSequence {
 
 //The value is used for character storage.
 private final char value[];
}
자바 9 에서 String 의 실현 과 중요 한 변 수 를 살 펴 보 겠 습 니 다.

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;
 }
코드 에서 우 리 는 밑바닥 의 저장 소 가 이미 byte[]로 변 한 것 을 볼 수 있다.
coder 변 수 를 다시 한 번 보 세 요.coder 는 인 코딩 형식 을 대표 합 니 다.현재 String 은 두 가지 인 코딩 형식 인 LATIN 1 과 UTF 16 을 지원 합 니 다.
LATIN 1 은 하나의 바이트 로 저장 해 야 합 니 다.UTF 16 은 2 개의 바이트 나 4 개의 바이트 로 저장 해 야 한다.
그리고 COMPACTSTRING S 는 String 을 켤 지 여 부 를 제어 하 는 compact 기능 입 니 다.기본적으로 COMPACTSTRING S 기능 이 켜 져 있 습 니 다.
우리 가 COMPACT 를 닫 고 싶다 면STRING S 기능 은-XX:-CompactStrings 인 자 를 사용 할 수 있 습 니 다.
ps:jdk 8 날짜 포맷 인 스 턴 스 코드 를 보 겠 습 니 다.

package time;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
/***
 *   : 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
     *    calendar month: canlendar :[]
     * 1. LocalDate            ;
     * 2. date.getMonthValue()   c.get(Calendar.MONTH)    : c:0  1 
     */
    Calendar c = Calendar.getInstance(); //     :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.     :      
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    LocalDate dt1 = LocalDate.of(2019, 3, 8);
    LocalDate dt2 = LocalDate.of(2019, 3, 8);
    // #4.     : equals
    // true:        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.        [HH:mm:ss.SSS]
    System.out.println("=-==-==-==-==-==-==-==-==-==-==");
    LocalTime time = LocalTime.now();
    System.out.println(time);
    // #7.      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.      
    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      ,     ,      
    System.out.println(btPeriod2.getDays()); 
    // #10.    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.       LocalDateTime
     * @.2. LocalDateTime      
     */
    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("=-==-==-==-==-==-==-==-==-==-==");
  }
}
총결산
본 고 는 새로운 String 실현 과 COMPACT 를 설명 하 였 다.STRING S 모드 의 닫 는 방법.
JDK 9 의 새로운 기능 인 String 압축 과 문자 인 코딩 의 실현 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 JDK 9 의 새로운 기능 에 관 한 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기