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 의 새로운 기능 에 관 한 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!