国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
01、引入 Jackson 依賴
02、使用 ObjectMapper
03、更高級(jí)的配置
04、處理日期格式
05、字段過濾
06、自定義序列化和反序列化
07、結(jié)語
首頁 Java Java基礎(chǔ) 自認(rèn)為最牛掰的 Java JSON 解析器:Jackson

自認(rèn)為最牛掰的 Java JSON 解析器:Jackson

Dec 16, 2020 am 09:48 AM
java 后端

java基礎(chǔ)教程欄目介紹Java JSON的解析器

自認(rèn)為最牛掰的 Java JSON 解析器:Jackson

推薦(免費(fèi)):java基礎(chǔ)教程

在當(dāng)今的編程世界里,JSON 已經(jīng)成為將信息從客戶端傳輸?shù)椒?wù)器端的首選協(xié)議,可以好不夸張的說,XML 就是那個(gè)被拍死在沙灘上的前浪。

很不幸的是,JDK 沒有 JSON 庫,不知道為什么不搞一下。Log4j 的時(shí)候,為了競(jìng)爭(zhēng),還推出了 java.util.logging,雖然最后也沒多少人用。

Java 之所以牛逼,很大的功勞在于它的生態(tài)非常完備,JDK 沒有 JSON 庫,第三方類庫有啊,還挺不錯(cuò),比如說本篇的豬腳——Jackson,GitHub 上標(biāo)星 6.1k,Spring Boot 的默認(rèn) JSON 解析器。

怎么證明這一點(diǎn)呢?

當(dāng)我們通過 starter 新建一個(gè) Spring Boot 的 Web 項(xiàng)目后,就可以在 Maven 的依賴項(xiàng)中看到 Jackson 的身影。

2c902ad22d3bbfa4398dc781b8e3647.png

Jackson 有很多優(yōu)點(diǎn):

  • 解析大文件的速度比較快;
  • 運(yùn)行時(shí)占用的內(nèi)存比較少,性能更佳;
  • API 很靈活,容易進(jìn)行擴(kuò)展和定制。

Jackson 的核心模塊由三部分組成:

  • jackson-core,核心包,提供基于“流模式”解析的相關(guān) API,包括 JsonPaser 和 JsonGenerator。
  • jackson-annotations,注解包,提供標(biāo)準(zhǔn)的注解功能;
  • jackson-databind ,數(shù)據(jù)綁定包,提供基于“對(duì)象綁定”解析的相關(guān) API ( ObjectMapper ) 和基于“樹模型”解析的相關(guān) API (JsonNode)。

01、引入 Jackson 依賴

要想使用 Jackson,需要在 pom.xml 文件中添加 Jackson 的依賴。

<dependency>
????<groupId>com.fasterxml.jackson.core</groupId>
????<artifactId>jackson-databind</artifactId>
????<version>2.10.1</version>
</dependency>

jackson-databind 依賴于 jackson-core 和 jackson-annotations,所以添加完 jackson-databind 之后,Maven 會(huì)自動(dòng)將 jackson-core 和 jackson-annotations 引入到項(xiàng)目當(dāng)中。

b2ab4c30e35e095214eb1e5caeecb1f.png

Maven 之所以討人喜歡的一點(diǎn)就在這,能偷偷摸摸地幫我們把該做的做了。

02、使用 ObjectMapper

Jackson 最常用的 API 就是基于”對(duì)象綁定” 的 ObjectMapper,它通過 writeValue 的系列方法將 Java 對(duì)象序列化為 JSON,并且可以存儲(chǔ)成不同的格式。

  • writeValueAsString(Object value) 方法,將對(duì)象存儲(chǔ)成字符串
  • writeValueAsBytes(Object value) 方法,將對(duì)象存儲(chǔ)成字節(jié)數(shù)組
  • writeValue(File resultFile, Object value) 方法,將對(duì)象存儲(chǔ)成文件

來看一下存儲(chǔ)成字符串的代碼示例:

import?com.fasterxml.jackson.core.JsonProcessingException;
import?com.fasterxml.jackson.databind.ObjectMapper;

/**
?*?微信搜索「沉默王二」,回復(fù)?Java
?*
?*?@author?沉默王二
?*?@date?2020/11/26
?*/
public?class?Demo?{
????public?static?void?main(String[]?args)?throws?JsonProcessingException?{
????????Writer?wanger?=?new?Writer("沉默王二",?18);
????????ObjectMapper?mapper?=?new?ObjectMapper();
????????String?jsonString?=?mapper.writerWithDefaultPrettyPrinter()
????????????????.writeValueAsString(wanger);
????????System.out.println(jsonString);
????}
}

class?Writer?{
????private?String?name;
????private?int?age;

????public?Writer(String?name,?int?age)?{
????????this.name?=?name;
????????this.age?=?age;
????}

????public?String?getName()?{
????????return?name;
????}

????public?void?setName(String?name)?{
????????this.name?=?name;
????}

????public?int?getAge()?{
????????return?age;
????}

????public?void?setAge(int?age)?{
????????this.age?=?age;
????}
}

程序輸出結(jié)果如下所示:

{
??"name"?:?"沉默王二",
??"age"?:?18
}

不是所有的字段都支持序列化和反序列化,需要符合以下規(guī)則:

  • 如果字段的修飾符是 public,則該字段可序列化和反序列化(不是標(biāo)準(zhǔn)寫法)。
  • 如果字段的修飾符不是 public,但是它的 getter 方法和 setter 方法是 public,則該字段可序列化和反序列化。getter 方法用于序列化,setter 方法用于反序列化。
  • 如果字段只有 public 的 setter 方法,而無 public 的 getter 方 法,則該字段只能用于反序列化。

如果想更改默認(rèn)的序列化和反序列化規(guī)則,需要調(diào)用 ObjectMapper 的 setVisibility() 方法。否則將會(huì)拋出 InvalidDefinitionException 異常。

ObjectMapper 通過 readValue 的系列方法從不同的數(shù)據(jù)源將 JSON 反序列化為 Java 對(duì)象。

  • readValue(String content, Class<T> valueType) 方法,將字符串反序列化為 Java 對(duì)象
  • readValue(byte[] src, Class<T> valueType) 方法,將字節(jié)數(shù)組反序列化為 Java 對(duì)象
  • readValue(File src, Class<T> valueType) 方法,將文件反序列化為 Java 對(duì)象

來看一下將字符串反序列化為 Java 對(duì)象的代碼示例:

import?com.fasterxml.jackson.core.JsonProcessingException;
import?com.fasterxml.jackson.databind.ObjectMapper;

/**
?*?微信搜索「沉默王二」,回復(fù)?Java
?*
?*?@author?沉默王二
?*?@date?2020/11/26
?*/
public?class?Demo?{
????public?static?void?main(String[]?args)?throws?JsonProcessingException?{
????????ObjectMapper?mapper?=?new?ObjectMapper();
????????String?jsonString?=?"{\n"?+
????????????????"??\"name\"?:?\"沉默王二\",\n"?+
????????????????"??\"age\"?:?18\n"?+
????????????????"}";
????????Writer?deserializedWriter?=?mapper.readValue(jsonString,?Writer.class);
????????System.out.println(deserializedWriter);
????}
}

class?Writer{
????private?String?name;
????private?int?age;

????//?getter/setter

????@Override
????public?String?toString()?{
????????return?"Writer{"?+
????????????????"name='"?+?name?+?'\''?+
????????????????",?age="?+?age?+
????????????????'}';
????}
}

程序輸出結(jié)果如下所示:

Writer{name='沉默王二',?age=18}

PS:如果反序列化的對(duì)象有帶參的構(gòu)造方法,它必須有一個(gè)空的默認(rèn)構(gòu)造方法,否則將會(huì)拋出 InvalidDefinitionException 一行。

Exception?in?thread?"main"?com.fasterxml.jackson.databind.exc.InvalidDefinitionException:?Cannot?construct?instance?of?`com.itwanger.jackson.Writer`?(no?Creators,?like?default?construct,?exist):?cannot?deserialize?from?Object?value?(no?delegate-?or?property-based?Creator)
?at?[Source:?(String)"{
??"name"?:?"沉默王二",
??"age"?:?18
}";?line:?2,?column:?3]
????at?com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
????at?com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589)
????at?com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055)
????at?com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297)
????at?com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
????at?com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
????at?com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
????at?com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)
????at?com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)
????at?com.itwanger.jackson.Demo.main(Demo.java:19)

Jackson 最常用的 API 就是基于”對(duì)象綁定” 的 ObjectMapper,

ObjectMapper 也可以將 JSON 解析為基于“樹模型”的 JsonNode 對(duì)象,來看下面的示例。

import?com.fasterxml.jackson.core.JsonProcessingException;
import?com.fasterxml.jackson.databind.JsonNode;
import?com.fasterxml.jackson.databind.ObjectMapper;

/**
?*?微信搜索「沉默王二」,回復(fù)?Java
?*
?*?@author?沉默王二
?*?@date?2020/11/26
?*/
public?class?JsonNodeDemo?{
????public?static?void?main(String[]?args)?throws?JsonProcessingException?{
????????ObjectMapper?mapper?=?new?ObjectMapper();
????????String?json?=?"{?\"name\"?:?\"沉默王二\",?\"age\"?:?18?}";
????????JsonNode?jsonNode?=?mapper.readTree(json);
????????String?name?=?jsonNode.get("name").asText();
????????System.out.println(name);?//?沉默王二
????}
}

借助 TypeReference 可以將 JSON 字符串?dāng)?shù)組轉(zhuǎn)成泛型 List,來看下面的示例:

import?com.fasterxml.jackson.core.JsonProcessingException;
import?com.fasterxml.jackson.core.type.TypeReference;
import?com.fasterxml.jackson.databind.ObjectMapper;

import?java.util.List;

/**
?*?微信搜索「沉默王二」,回復(fù)?Java
?*
?*?@author?沉默王二
?*?@date?2020/11/26
?*/
public?class?TypeReferenceDemo?{
????public?static?void?main(String[]?args)?throws?JsonProcessingException?{
????????ObjectMapper?mapper?=?new?ObjectMapper();
????????String?json?=?"[{?\"name\"?:?\"沉默王三\",?\"age\"?:?18?},?{?\"name\"?:?\"沉默王二\",?\"age\"?:?19?}]";
????????List<Author>?listAuthor?=?mapper.readValue(json,?new?TypeReference<List<Author>>(){});
????????System.out.println(listAuthor);
????}
}
class?Author{
????private?String?name;
????private?int?age;

????//?getter/setter

????//?toString
}

03、更高級(jí)的配置

Jackson 之所以牛掰的一個(gè)很重要的因素是可以實(shí)現(xiàn)高度靈活的自定義配置。

在實(shí)際的應(yīng)用場(chǎng)景中,JSON 中常常會(huì)有一些 Java 對(duì)象中沒有的字段,這時(shí)候,如果直接解析的話,會(huì)拋出 UnrecognizedPropertyException 異常。

下面是一串 JSON 字符串:

String?jsonString?=?"{\n"?+
????????????????"??\"name\"?:?\"沉默王二\",\n"?+
????????????????"??\"age\"?:?18\n"?+
????????????????"??\"sex\"?:?\"男\(zhòng)",\n"?+
????????????????"}";

但 Java 對(duì)象 Writer 中沒有定義 sex 字段:

class?Writer{
????private?String?name;
????private?int?age;

????//?getter/setter
}

我們來嘗試解析一下:

ObjectMapper?mapper?=?new?ObjectMapper();
Writer?deserializedWriter?=?mapper.readValue(jsonString,?Writer.class);

不出意外,拋出異常了,sex 無法識(shí)別。

Exception?in?thread?"main"?com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:?Unrecognized?field?"sex"?(class?com.itwanger.jackson.Writer),?not?marked?as?ignorable?(2?known?properties:?"name",?"age"])
?at?[Source:?(String)"{
??"name"?:?"沉默王二",
??"age"?:?18,
??"sex"?:?"男"
}";?line:?4,?column:?12]?(through?reference?chain:?com.itwanger.jackson.Writer["sex"])

怎么辦呢?可以通過 configure() 方法忽略掉這些“無法識(shí)別”的字段。

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,?false);

除此之外,還有其他一些有用的配置信息,來了解一下:

//?在序列化時(shí)忽略值為?null?的屬性
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//?忽略值為默認(rèn)值的屬性
mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT);

04、處理日期格式

對(duì)于日期類型的字段,比如說 java.util.Date,如果不指定格式,序列化后將顯示為 long 類型的數(shù)據(jù),這種默認(rèn)格式的可讀性很差。

{
??"age"?:?18,
??"birthday"?:?1606358621209
}

怎么辦呢?

第一種方案,在 getter 上使用 @JsonFormat 注解。

private?Date?birthday;

//?GMT+8?是指格林尼治的標(biāo)準(zhǔn)時(shí)間,在加上八個(gè)小時(shí)表示你現(xiàn)在所在時(shí)區(qū)的時(shí)間
@JsonFormat(timezone?=?"GMT+8",?pattern?=?"yyyy-MM-dd?HH:mm:ss")
public?Date?getBirthday()?{
????return?birthday;
}

public?void?setBirthday(Date?birthday)?{
????this.birthday?=?birthday;
}

再來看一下結(jié)果:

{
??"age"?:?18,
??"birthday"?:?"2020-11-26?03:02:30"
}

具體代碼如下所示:

ObjectMapper?mapper?=?new?ObjectMapper();
Writer?wanger?=?new?Writer("沉默王二",?18);
wanger.setBirthday(new?Date());
String?jsonString?=?mapper.writerWithDefaultPrettyPrinter()
????????????????.writeValueAsString(wanger);
System.out.println(jsonString);

第二種方案,調(diào)用 ObjectMapper 的 setDateFormat() 方法。

ObjectMapper?mapper?=?new?ObjectMapper();
mapper.setDateFormat(StdDateFormat.getDateTimeInstance());
Writer?wanger?=?new?Writer("沉默王二",?18);
wanger.setBirthday(new?Date());
String?jsonString?=?mapper.writerWithDefaultPrettyPrinter()
????????????????.writeValueAsString(wanger);
System.out.println(jsonString);

輸出結(jié)果如下所示:

{
??"name"?:?"沉默王二",
??"age"?:?18,
??"birthday"?:?"2020年11月26日?上午11:09:51"
}

05、字段過濾

在將 Java 對(duì)象序列化為 JSON 時(shí),可能有些字段需要過濾,不顯示在 JSON 中,Jackson 有一種比較簡(jiǎn)單的實(shí)現(xiàn)方式。

@JsonIgnore 用于過濾單個(gè)字段。

@JsonIgnore
public?String?getName()?{
????return?name;
}

@JsonIgnoreProperties 用于過濾多個(gè)字段。

@JsonIgnoreProperties(value?=?{?"age","birthday"?})
class?Writer{
????private?String?name;
????private?int?age;
????private?Date?birthday;
}

06、自定義序列化和反序列化

當(dāng) Jackson 默認(rèn)序列化和反序列化不能滿足實(shí)際的開發(fā)需要時(shí),可以自定義新的序列化和反序列化類。

自定義的序列化類需要繼承 StdSerializer,同時(shí)重寫 serialize() 方法,利用 JsonGenerator 生成 JSON,示例如下:

/**
?*?微信搜索「沉默王二」,回復(fù)?Java
?*
?*?@author?沉默王二
?*?@date?2020/11/26
?*/
public?class?CustomSerializer?extends?StdSerializer<Man>?{
????protected?CustomSerializer(Class<Man>?t)?{
????????super(t);
????}

????public?CustomSerializer()?{
????????this(null);
????}

????@Override
????public?void?serialize(Man?value,?JsonGenerator?gen,?SerializerProvider?provider)?throws?IOException?{
????????gen.writeStartObject();
????????gen.writeStringField("name",?value.getName());
????????gen.writeEndObject();
????}
}

class?Man{
????private?int?age;
????private?String?name;

????public?Man(int?age,?String?name)?{
????????this.age?=?age;
????????this.name?=?name;
????}

????public?int?getAge()?{
????????return?age;
????}

????public?void?setAge(int?age)?{
????????this.age?=?age;
????}

????public?String?getName()?{
????????return?name;
????}

????public?void?setName(String?name)?{
????????this.name?=?name;
????}
}

定義好自定義序列化類后,要想在程序中調(diào)用它們,需要將其注冊(cè)到 ObjectMapper 的 Module 中,示例如下所示:

ObjectMapper?mapper?=?new?ObjectMapper();
SimpleModule?module?=
????????new?SimpleModule("CustomSerializer",?new?Version(1,?0,?0,?null,?null,?null));
module.addSerializer(Man.class,?new?CustomSerializer());
mapper.registerModule(module);
Man?man?=?new?Man(?18,"沉默王二");
String?json?=?mapper.writeValueAsString(man);
System.out.println(json);

程序輸出結(jié)果如下所示:

{"name":"沉默王二"}

自定義序列化類 CustomSerializer 中沒有添加 age 字段,所以只輸出了 name 字段。

再來看一下自定義的反序列化類,繼承 StdDeserializer,同時(shí)重寫 deserialize() 方法,利用 JsonGenerator 讀取 JSON,示例如下:

public?class?CustomDeserializer?extends?StdDeserializer<Woman>?{
????protected?CustomDeserializer(Class<?>?vc)?{
????????super(vc);
????}

????public?CustomDeserializer()?{
????????this(null);
????}

????@Override
????public?Woman?deserialize(JsonParser?p,?DeserializationContext?ctxt)?throws?IOException,?JsonProcessingException?{
????????JsonNode?node?=?p.getCodec().readTree(p);
????????Woman?woman?=?new?Woman();
????????int?age?=?(Integer)?((IntNode)?node.get("age")).numberValue();
????????String?name?=?node.get("name").asText();
????????woman.setAge(age);
????????woman.setName(name);
????????return?woman;
????}
}
class?Woman{
????private?int?age;
????private?String?name;

????public?Woman()?{
????}

????//?getter/setter

????@Override
????public?String?toString()?{
????????return?"Woman{"?+
????????????????"age="?+?age?+
????????????????",?name='"?+?name?+?'\''?+
????????????????'}';
????}
}

通過 JsonNode 把 JSON 讀取到一個(gè)樹形結(jié)構(gòu)中,然后通過 JsonNode 的 get 方法將對(duì)應(yīng)字段讀取出來,然后生成新的 Java 對(duì)象,并返回。

定義好自定義反序列化類后,要想在程序中調(diào)用它們,同樣需要將其注冊(cè)到 ObjectMapper 的 Module 中,示例如下所示:

ObjectMapper?mapper?=?new?ObjectMapper();
SimpleModule?module?=
????????new?SimpleModule("CustomDeserializer",?new?Version(1,?0,?0,?null,?null,?null));
module.addDeserializer(Woman.class,?new?CustomDeserializer());
mapper.registerModule(module);
String?json?=?"{?\"name\"?:?\"三妹\",?\"age\"?:?18?}";
Woman?woman?=?mapper.readValue(json,?Woman.class);
System.out.println(woman);

程序輸出結(jié)果如下所示:

Woman{age=18,?name='三妹'}

07、結(jié)語

哎呀,好像不錯(cuò)哦,Jackson 絕對(duì)配得上“最牛掰”這三個(gè)字,雖然有點(diǎn)虛。如果只想簡(jiǎn)單的序列化和反序列化,使用 ObjectMapper 的 write 和 read 方法即可。

如果還想更進(jìn)一步的話,就需要對(duì) ObjectMapper 進(jìn)行一些自定義配置,或者加一些注解,以及直接自定義序列化和反序列化類,更貼近一些 Java 對(duì)象。

需要注意的是,對(duì)日期格式的字段要多加小心,盡量不要使用默認(rèn)配置,可讀性很差。

好了,通過這篇文章的系統(tǒng)化介紹,相信你已經(jīng)完全摸透 Jackson 了,我們下篇文章見。

PS:如果你恰好需要一份 Java 精進(jìn)路線的話,我這里有一份,我差不多花了 3 天的時(shí)間整理的,還挺受歡迎的,已經(jīng) 2000 多贊了,每個(gè)階段都很詳細(xì)。

相關(guān)免費(fèi)學(xué)習(xí)推薦:php編程(視頻)

以上是自認(rèn)為最牛掰的 Java JSON 解析器:Jackson的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最后根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常并關(guān)閉連接,避免連接泄漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,并保持事務(wù)盡可能短以提升性能。

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日歷? 如何使用Java的日歷? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡(luò)端口和防火墻 了解網(wǎng)絡(luò)端口和防火墻 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動(dòng)管理內(nèi)存的機(jī)制,通過回收不可達(dá)對(duì)象釋放堆內(nèi)存,減少內(nèi)存泄漏風(fēng)險(xiǎn)。1.GC從根對(duì)象(如棧變量、活動(dòng)線程、靜態(tài)字段等)出發(fā)判斷對(duì)象可達(dá)性,無法到達(dá)的對(duì)象被標(biāo)記為垃圾。2.基于標(biāo)記-清除算法,標(biāo)記所有可達(dá)對(duì)象,清除未標(biāo)記對(duì)象。3.采用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時(shí)較長(zhǎng)的MajorGC;Metaspace存儲(chǔ)類元數(shù)據(jù)。4.JVM提供多種GC器:SerialGC適用于小型應(yīng)用;ParallelGC提升吞吐量;CMS降

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用于在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時(shí)立即求值,函數(shù)按后進(jìn)先出(LIFO)順序執(zhí)行;1.多個(gè)defer按聲明逆序執(zhí)行;2.常用于文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會(huì)執(zhí)行,適合用于recover;5.避免在循環(huán)中濫用defer,防止資源泄漏;正確使用可提升代碼安全性和可讀性。

See all articles