精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 Groovy 和 Java 中創建并初始化映射的不同

開發
我最近在探索 Java 與 Groovy 在 創建并初始化列表List 和 在運行時構建列表List 方面的一些差異。我觀察到,就實現這些功能而言,Groovy 的簡潔和 Java 的繁復形成了鮮明對比。

Java 和 Groovy 中的映射map都是非常通用的,它允許關鍵字key和值value為任意類型,只要繼承了 Object 類即可。

我最近在探索 Java 與 Groovy 在 創建并??初始化列表List?? 和 在??運行時構建列表List?? 方面的一些差異。我觀察到,就實現這些功能而言,Groovy 的簡潔和 Java 的繁復形成了鮮明對比。

在這篇文章中,我將實現在 Java 和 Groovy 中創建并初始化映射Map。映射為開發支持根據 關鍵字key 檢索的結構提供了可能,如果找到了這樣一個關鍵字,它就會返回對應的 值value。今天,很多編程語言都實現了映射,其中包括 Java 和 Groovy,也包括了 Python(它將映射稱為 字典dict)、Perl、awk 以及許多其他語言。另一個經常被用來描述映射的術語是 關聯數組associative array,你可以在 這篇維基百科文章 中了解更多。Java 和 Groovy 中的映射都是非常通用的,它允許關鍵字和值為任意類型,只要繼承了 Object 類即可。

安裝 Java 和 Groovy

Groovy 基于 Java,因此你需要先安裝 Java。你的 Linux 發行版的倉庫中可能有最近的比較好的 Java 和 Groovy 版本。或者,你也可以在根據上面鏈接中的指示來安裝 Groovy。對于 Linux 用戶來說,SDKMan 是一個不錯的代替選項,你可以使用它來獲取多個 Java 和 Groovy 版本,以及許多其他的相關工具。在這篇文章中,我使用的 SDK 發行版是:

  • Java: version 11.0.12-open of OpenJDK 11;
  • Groovy: version 3.0.8.

言歸正傳

Java 提供了非常多的方式來實例化和初始化映射,并且從 Java 9 之后,添加了一些新的方式。其中最明顯的方式就是使用 java.util.Map.of() 這個靜態方法,下面介紹如何使用它:

    var m1 = Map.of(
"AF", "Afghanistan",
"AX", "?land Islands",
"AL", "Albania",
"DZ", "Algeria",
"AS", "American Samoa",
"AD", "Andorra",
"AO", "Angola",
"AI", "Anguilla",
"AQ", "Antarctica");
System.out.println("m1 = " + m1);
System.out.println("m1 is an instance of " + m1.getClass());

事實證明,在此種情況下,Map.of() 有兩個重要的限制。其一,這樣創建出來的映射實例是不可變的immutable。其二,你最多只能提供 20 個參數,用來表示 10 個鍵值對key-value pair。

你可以嘗試著添加第 10 對和第 11 對,比方說 "AG", "Antigua and Barbuda" 和 "AR", "Argentina",然后觀察會發生什么。你將發現 Java 編譯器嘗試尋找一個支持 11 個鍵值對的 Map.of() 方法而遭遇失敗。

快速查看 java.util.Map 類的文檔,你就會找到上述第二個限制的原因,以及解決這個難題的一種方式:

    var m2 = Map.ofEntries(
Map.entry("AF", "Afghanistan"),
Map.entry("AX", "?land Islands"),
Map.entry("AL", "Albania"),
Map.entry("DZ", "Algeria"),
Map.entry("AS", "American Samoa"),
Map.entry("AD", "Andorra"),
Map.entry("AO", "Angola"),
Map.entry("AI", "Anguilla"),
Map.entry("AQ", "Antarctica"),
Map.entry("AG", "Antigua and Barbuda"),
Map.entry("AR", "Argentina"),
Map.entry("AM", "Armenia"),
Map.entry("AW", "Aruba"),
Map.entry("AU", "Australia"),
Map.entry("AT", "Austria"),
Map.entry("AZ", "Azerbaijan"),
Map.entry("BS", "Bahamas"),
Map.entry("BH", "Bahrain"),
Map.entry("BD", "Bangladesh"),
Map.entry("BB", "Barbados")
);

System.out.println("m2 = " + m2);
System.out.println("m2 is an instance of " + m2.getClass());

這就是一個比較好的解決方式,前提是我不在隨后的代碼里改變使用 Map.ofEntries() 創建并初始化的映射內容。注意,我在上面使用了 Map.ofEntries() 來代替 Map.of()。

然而,假設我想要創建并初始化一個非空的映射,隨后往這個映射中添加數據,我需要這樣做:

var m3 = new HashMap<String,String>(Map.ofEntries(
Map.entry("AF", "Afghanistan"),
Map.entry("AX", "?land Islands"),
Map.entry("AL", "Albania"),
Map.entry("DZ", "Algeria"),
Map.entry("AS", "American Samoa"),
Map.entry("AD", "Andorra"),
Map.entry("AO", "Angola"),
Map.entry("AI", "Anguilla"),
Map.entry("AQ", "Antarctica"),
Map.entry("AG", "Antigua and Barbuda"),
Map.entry("AR", "Argentina"),
Map.entry("AM", "Armenia"),
Map.entry("AW", "Aruba"),
Map.entry("AU", "Australia"),
Map.entry("AT", "Austria"),
Map.entry("AZ", "Azerbaijan"),
Map.entry("BS", "Bahamas"),
Map.entry("BH", "Bahrain"),
Map.entry("BD", "Bangladesh"),
Map.entry("BB", "Barbados")
));
System.out.println("m3 = " + m3);
System.out.println("m3 is an instance of " + m3.getClass());
m3.put("BY", "Belarus");
System.out.println("BY: " + m3.get("BY"));

這里,我把使用 Map.ofEntries() 創建出來的不可變映射作為 HashMap 的一個構造參數,以此創建了該映射的一個可變副本mutable copy,之后我就可以修改它 —— 比如使用 put() 方法。

讓我們來看看上述過程如何用 Groovy 來實現:

    def m1 = [
"AF": "Afghanistan",
"AX": "?land Islands",
"AL": "Albania",
"DZ": "Algeria",
"AS": "American Samoa",
"AD": "Andorra",
"AO": "Angola",
"AI": "Anguilla",
"AQ": "Antarctica",
"AG": "Antigua and Barbuda",
"AR": "Argentina",
"AM": "Armenia",
"AW": "Aruba",
"AU": "Australia",
"AT": "Austria",
"AZ": "Azerbaijan",
"BS": "Bahamas",
"BH": "Bahrain",
"BD": "Bangladesh",
"BB": "Barbados"]
println "m1 = $m1"
println "m1 is an instance of ${m1.getClass()}"
m1["BY"] = "Belarus"
println "m1 = $m1"

只看一眼,你就會發現 Groovy 使用了 def 關鍵字而不是 var —— 盡管在最近模型late-model的 Groovy(version 3+)中,使用 var 關鍵字也是可行的。

你還會發現,你是通過在括號里添加了一個鍵值對列表來創建一個映射的。不僅如此,這樣創建的列表對象還非常有用,這里有幾個原因。其一,它是可變的;其二,它是一個 LinkedHashMap 的實例,內部維持了數據的插入順序。所以,當你運行 Java 版本的代碼并打印出變量 m3,你會看到:

    m3 = {BB=Barbados, BD=Bangladesh, AD=Andorra, AF=Afghanistan, AG=Antigua and Barbuda, BH=Bahrain, AI=Anguilla, AL=Albania, AM=Armenia, AO=Angola, AQ=Antarctica, BS=Bahamas, AR=Argentina, AS=American Samoa, AT=Austria, AU=Australia, DZ=Algeria, AW=Aruba, AX=?land Islands, AZ=Azerbaijan}

而當你運行 Groovy 版本的代碼,你會看到:

    m1 = [AF:Afghanistan, AX:?land Islands, AL:Albania, DZ:Algeria, AS:American Samoa, AD:Andorra, AO:Angola, AI:Anguilla, AQ:Antarctica, AG:Antigua and Barbuda, AR:Argentina, AM:Armenia, AW:Aruba, AU:Australia, AT:Austria, AZ:Azerbaijan, BS:Bahamas, BH:Bahrain, BD:Bangladesh, BB:Barbados]

再一次,你將看到 Groovy 是如何簡化事情的。這樣的語法非常直觀,有點像 Python 里的字典,并且,即使你有一個超過 10 個鍵值對的初始列表,你也不需要去記住各種必要的別扭方式。注意我們使用的表達式:

m1[“BY”] = “Belarus”

而在 Java 中,你需要這樣做:

m1.put(“BY”, “Belarus”)

還有,這個映射默認是可變的,這么做的利弊很難評判,還是得取決于你的需求是什么。我個人覺得,Java 在這種情況下的 “默認不可變” 機制,最讓我困擾的地方是,它沒有一個類似于 Map.mutableOfMutableEntries() 的方法。這迫使一些剛學會如何聲明和初始化一個映射的程序員,不得不轉念去思考該如何把他們手中不可變的映射,轉換為可變的。同時我也想問,創建一個不可變的對象然后再舍棄它,這樣真的好嗎?

另一個值得考慮的事情是,Groovy 使用方括號代替 Java 中的 put() 和 get() 方法來進行關鍵字查找。因此你可以這樣寫:

m1[“ZZ”] = m1[“BY”]

而不需要這樣寫:

m1.put(“ZZ”,m1.get(“BY”))

有時候,就像使用某個類的實例變量一樣來使用映射中的關鍵字和值是一個好辦法。設想你現在有一堆想要設置的屬性,在 Groovy 中,它們看起來就像下面這樣:

    def properties = [
verbose: true,
debug: false,
logging: false]

然后,你可以改變其中的某個屬性,就像下面這樣:

properties.verbose = false

之所以這樣能工作,是因為,只要關鍵字符合特定的規則,你就可以省略引號,然后直接用點操作符來代替方括號。盡管這個功能非常有用,也非常好用,它也同時也意味著,如果你要把一個變量作為一個映射的關鍵字來使用,你就必須把這個變量包裹在圓括號里,就像下面這樣:

def myMap = [(k1): v1, (k2): v2]

是時候告訴勤奮的讀者 Groovy 是一門為編寫腳本而量身定制的語言了。映射通常是腳本中的關鍵元素,它為腳本提供了查找表lookup table,并且通常起到了作為內存數據庫的作用。我在這里使用的例子是 ISO 3166 規定的兩個字母的國家代碼和國家名稱。對在世界上各個國家的互聯網使用者來說,這些代碼是很熟悉的。此外,假設我們要編寫一個從日志文件中查找互聯網主機名,并借此來了解用戶的地理位置分布的腳本工具,那么這些代碼會是十分有用的部分。

Groovy 相關資源

Apache Groovy 網站 上有非常多的文檔。另一個很棒的 Groovy 資源是 ??Mr. Haki??。??Baeldung ??網站 提供了大量 Java 和 Groovy 的有用教程。學習 Groovy 還有一個很棒的原因,那就是可以接著學習 ???Grails??,后者是一個優秀的、高效率的全棧 Web 框架。它基于許多優秀組件構建而成,比如有 Hibernate、Spring Boot 和 Micronaut 等。

責任編輯:未麗燕 來源: Linux中國
相關推薦

2022-03-30 08:19:12

JavaGroovy

2009-06-11 13:26:16

Java數組聲明創建

2019-11-04 13:50:36

Java數組編程語言

2011-07-22 17:46:43

java

2011-06-17 15:29:44

C#對象初始化器集合初始化器

2012-02-28 10:04:09

Java

2023-07-13 09:13:18

Docker容器

2010-06-21 10:25:09

Linux APM

2011-06-09 14:13:06

C++JAVA缺省初始化

2023-12-18 09:26:12

C++switchif

2012-03-13 13:38:42

Java

2010-03-11 19:25:35

Python環境

2012-05-23 12:46:53

JavaJava類

2023-10-06 20:57:52

C++聚合成員

2023-11-12 23:08:17

C++初始化

2012-04-09 13:43:12

Java

2013-03-04 11:10:03

JavaJVM

2016-11-11 00:33:25

雙重檢查鎖定延遲初始化線程

2015-08-14 14:31:57

Java初始化面試題

2009-07-03 16:21:33

Java的聲明和初始化Java
點贊
收藏

51CTO技術棧公眾號

91欧美在线视频| 国产嫩bbwbbw高潮| 成人h动漫免费观看网站| 亚洲一区自拍偷拍| 女女同性女同一区二区三区91| 中文字幕免费高清在线观看| 亚洲私拍自拍| 亚洲人精品午夜在线观看| 91高清国产视频| h片在线观看| 欧美国产欧美综合| av资源站久久亚洲| 中日精品一色哟哟| aⅴ色国产欧美| xxxxx91麻豆| 欧美性xxxx图片| 精品午夜视频| 在线观看精品一区| 成年人午夜免费视频| 免费的黄网站在线观看| 久久综合九色综合97婷婷| 亚洲一区二区三区sesese| 人人草在线观看| 在线观看一区| 欧美老肥婆性猛交视频| jizz日本在线播放| 偷窥自拍亚洲色图精选| 欧美成人bangbros| 91 视频免费观看| 懂色aⅴ精品一区二区三区| 亚洲国产人成综合网站| 五月天综合婷婷| 77导航福利在线| 国产欧美一区二区三区在线看蜜臀 | 国产丝袜视频在线播放| 国产精品国产三级国产aⅴ原创| 久久精品成人一区二区三区蜜臀| 精品国精品国产自在久不卡| 日韩av不卡一区二区| 88xx成人精品| 日韩乱码在线观看| 亚洲无毛电影| 欧美极品在线视频| 国产免费无码一区二区视频| 午夜精品久久久久久久四虎美女版| 国产一区av在线| 中字幕一区二区三区乱码| 亚洲动漫精品| 亚洲女人被黑人巨大进入al| 老鸭窝一区二区| 久久丝袜视频| 亚洲欧美中文日韩v在线观看| 日本三级日本三级日本三级极| 亚洲成人黄色| 日韩精品在线看片z| 久久久久亚洲av片无码v| 曰本一区二区| 欧美一区二区黄| 91精品国产高清91久久久久久| 秋霞一区二区| 欧美精品一区二区三区很污很色的| 中文字幕亚洲日本| 亚洲欧美日本国产| 亚洲国产日韩欧美在线动漫| 国产精品无码一区二区三区免费| 亚州av一区| 亚洲一级一级97网| 污污视频网站在线免费观看| 99久久www免费| 免费不卡欧美自拍视频| 国产一级一片免费播放放a| 亚洲第一网站| 国产大片精品免费永久看nba| 中日精品一色哟哟| 国产麻豆欧美日韩一区| 国产精品永久入口久久久| 先锋av资源站| 欧美激情一二三区| 喜爱夜蒲2在线| aa级大片免费在线观看| 一本色道久久综合亚洲91| 中文字幕一区二区三区四区在线视频| 97久久中文字幕| 精品国内二区三区| av黄色在线免费观看| 国产在视频线精品视频www666| 日韩在线精品一区| 久久精品视频日本| 久久久成人网| 亚洲综合日韩中文字幕v在线| 黄色片一区二区| 国产精品无人区| 国产美女永久无遮挡| av高清一区| 欧美变态tickle挠乳网站| 熟女俱乐部一区二区视频在线| 国产精品成久久久久| 久久久久中文字幕| 亚洲视频一区在线播放| 成人国产精品免费观看视频| 婷婷精品国产一区二区三区日韩| 婷婷av在线| 在线国产亚洲欧美| 男人添女人荫蒂国产| 狠狠做六月爱婷婷综合aⅴ | 日韩精品极品视频在线观看免费| a毛片在线看免费观看| 色女孩综合影院| 91人人澡人人爽| 色999国产精品| 2020欧美日韩在线视频| 99热这里只有精| 亚洲国产精品成人综合| 成人黄色av片| 日本精品在线播放 | 欧美日韩在线看片| 欧美日韩加勒比精品一区| 91小视频在线播放| 国产亚洲一区二区三区不卡| 国外视频精品毛片| 国产精品国产精品国产专区| 久久午夜国产精品| 僵尸世界大战2 在线播放| 996久久国产精品线观看| 国产亚洲视频在线观看| 亚洲黄色小说图片| 丁香激情综合五月| a级网站在线观看| 99久久婷婷国产综合精品首页 | 在线中文字幕-区二区三区四区| 色嗨嗨av一区二区三区| 一区二区免费在线观看视频| 欧美va亚洲va日韩∨a综合色| 国产精品爽黄69天堂a| 久久电影中文字幕| 欧美午夜视频一区二区| 精品久久久久一区二区| 午夜日韩激情| www.久久久| 伊人福利在线| 日韩美女天天操| 久久高清内射无套| 国产精品资源在线| 天天爱天天做天天操| 伊人久久一区| 欧美精品在线观看| www.黄色小说.com| 一个色妞综合视频在线观看| 精品国产aⅴ一区二区三区东京热| 久久精品影视| 亚洲v日韩v综合v精品v| 26uuu亚洲电影在线观看| 日韩欧美色综合网站| 欧美日韩在线国产| 成人综合在线视频| 三上悠亚久久精品| 天天躁日日躁成人字幕aⅴ| 欧美专区日韩视频| 国产中文字幕在线| 欧美日韩dvd在线观看| 国产91在线播放九色| 国产在线视视频有精品| 亚洲精品国产suv一区88| 成人台湾亚洲精品一区二区| 久久91超碰青草是什么| 色网站免费观看| 91精品1区2区| 天天色影综合网| 国产成人一级电影| 噜噜噜久久亚洲精品国产品麻豆| 猛男gaygay欧美视频| 国产精品中文在线| 欧美性猛片xxxxx免费中国| 亚洲风情亚aⅴ在线发布| 免费的毛片视频| 国产精品家庭影院| 国产香蕉精品视频| 久久久久.com| 中国一级黄色录像| 久久香蕉精品香蕉| 国产精品十八以下禁看| 美女尤物在线视频| 亚洲色图国产精品| 99热精品在线播放| 色哟哟亚洲精品| 老熟妇高潮一区二区三区| 不卡一二三区首页| 国产精品视频黄色| 尤物网精品视频| 亚洲精品中文字幕在线| 91久久偷偷做嫩草影院电| 人人做人人澡人人爽欧美| 欧美被日视频| 日韩av在线网址| 国产乱码久久久| 欧美性色xo影院| 美女福利视频在线观看| 国产三级欧美三级| 亚洲少妇一区二区| 男人操女人的视频在线观看欧美| 99久久免费观看| 成人影院在线| 福利网在线观看| 日日天天久久| 91中文在线视频| 免费观看成人性生生活片 | 日本三级韩国三级欧美三级| 亚洲男人天堂九九视频| www.久久久久久| 欧美色大人视频| 全部毛片永久免费看| 综合久久给合久久狠狠狠97色| 免费无码一区二区三区| 国产精品影视天天线| 一区二区三区视频在线观看免费| 日韩一级精品| 韩国无码av片在线观看网站| 日韩a一区二区| 日韩精品伦理第一区| 牛牛影视久久网| 国产成人看片| 视频一区国产| 成人中心免费视频| 国产一区高清| 国产精品jizz在线观看麻豆| 蜜桃av.网站在线观看| 久久久久久美女| 最新国产在线拍揄自揄视频| 久久成年人视频| 香蕉视频在线播放| 中文字幕亚洲专区| 福利在线午夜| 国产一区二区免费| 国产精品无码2021在线观看| 亚洲欧美国产精品va在线观看| 欧美一级视频免费| 精品播放一区二区| 亚洲精品久久久久久无码色欲四季| 制服丝袜亚洲播放| 亚洲性生活大片| 欧美日韩亚州综合| 一级片一区二区三区| 欧美午夜精品理论片a级按摩| 波多野结衣小视频| 欧美手机在线视频| 中文字幕av影视| 欧美久久久久久久久| 国产精品久久777777换脸| 欧美高清精品3d| 国内精品久久久久久久久久久 | 视频国产一区二区三区| 精品999在线播放| 香蕉视频黄色片| 亚洲色图15p| 中文字幕在线播放| 久久综合电影一区| 日韩三级免费| 性欧美激情精品| 忘忧草在线影院两性视频| 琪琪第一精品导航| www.成人在线视频| 成人午夜黄色影院| 国产精东传媒成人av电影| 黄色国产精品一区二区三区| 性欧美lx╳lx╳| 亚洲.欧美.日本.国产综合在线| 欧美成人精品一区二区三区在线看| 久久av秘一区二区三区| 国产精品国码视频| 能在线观看的av| 久久精品国产精品亚洲精品| 俄罗斯女人裸体性做爰| 99国产精品一区| 久久久久久成人网| 一区二区三区精密机械公司| 天堂中文字幕在线观看| 欧美日韩三级一区| 亚洲高清精品视频| 国产午夜精品全部视频在线播放| 免费黄色网址在线观看| 色综合91久久精品中文字幕| 涩涩在线视频| 91久久精品美女高潮| 极品国产人妖chinesets亚洲人妖| 日韩福利视频| 国产精品扒开腿做爽爽爽软件| 超碰97人人射妻| 国产一区二区h| 中文字幕国产专区| 亚洲三级免费观看| 免费看一级视频| 日韩精品一区二区在线观看| 国产在线一二| 欧美极品欧美精品欧美视频| 日韩精品专区| 国产精品伊人日日| 1024精品久久久久久久久| 国产亚洲精品网站| 国产乱码精品一区二区三 | 手机看片一区二区三区| 色老头一区二区三区| 国产精品vvv| 亚洲japanese制服美女| 深爱激情久久| 欧美狂野激情性xxxx在线观| 久久99热这里只有精品| 亚洲天堂久久新| 亚洲不卡av一区二区三区| 亚洲一区中文字幕永久在线| 精品视频中文字幕| 国产又色又爽又黄刺激在线视频| 国产色综合天天综合网| 亚洲免费成人av在线| 日本一本中文字幕| 国产做a爰片久久毛片| 免费看污片的网站| 精品美女国产在线| 国产99999| 久久久久www| 久久青草视频| 日韩国产在线一区| 久久欧美肥婆一二区| 在线视频 日韩| 午夜精品福利一区二区蜜股av| 国产黄频在线观看| 欧美日本啪啪无遮挡网站| 免费一级欧美在线大片 | 国产欧美二区| 中文字幕99页| 亚洲国产成人va在线观看天堂| 国产美女自慰在线观看| www.欧美精品一二三区| 777午夜精品电影免费看| 欧洲亚洲一区| 丝袜诱惑亚洲看片| 三级电影在线看| 精品久久久久久久久久久久久久| 欧洲成人一区二区三区| 欧美激情视频一区| 盗摄牛牛av影视一区二区| 欧美久久久久久久久久久久久久| 国产精品自拍毛片| 九九精品在线观看视频| 欧美精品一区二区高清在线观看| 美足av综合网| 欧美不卡在线一区二区三区| 男人的天堂亚洲在线| 亚洲精品乱码久久久久久久久久久久| 色一情一伦一子一伦一区| 成人亚洲性情网站www在线观看| 国产999在线观看| 色婷婷亚洲mv天堂mv在影片| 一区二区三区四区毛片| 艳妇臀荡乳欲伦亚洲一区| 农村少妇久久久久久久| 午夜精品一区二区三区在线播放| 里番精品3d一二三区| 国产真实乱子伦| 国产清纯白嫩初高生在线观看91| 中文字幕视频一区二区| 久久视频在线直播| 4438全国亚洲精品观看视频| 久无码久无码av无码| 久久婷婷成人综合色| 在线视频你懂得| 久久久久久国产免费| 亚洲成aⅴ人片久久青草影院| 欧美综合在线观看视频| 国产精品久久影院| 性欧美8khd高清极品| 欧美在线不卡区| 欧美成免费一区二区视频| 国产成人精品综合久久久久99| 性做久久久久久免费观看| 国产午夜视频在线观看| 亚洲影视九九影院在线观看| 野花国产精品入口| 国产又粗又硬视频| 日韩视频免费直播| 一区二区三区短视频| 日本免费在线视频观看| 99热99精品| 91超薄丝袜肉丝一区二区| 久久免费视频观看| av中字幕久久| 苍井空张开腿实干12次| 欧美在线不卡视频| 欧美1—12sexvideos| 日本精品免费| 国产91精品一区二区麻豆网站| 特级毛片www| 久久天天躁夜夜躁狠狠躁2022| 日本韩国欧美超级黄在线观看| www.色欧美| 一本久久a久久精品亚洲| 在线观看男女av免费网址| 日韩精品一区二区三区丰满| 国产成人av影院| 亚洲自拍偷拍另类| 欧美专区中文字幕|