Java全棧工程師淺談Java框架(一)

一、集合框架圖

簡(jiǎn)化圖:

說(shuō)明:對(duì)于以上的框架圖有如下幾點(diǎn)說(shuō)明

1.所有集合類都位于java.util包下风题。Java的集合類主要由兩個(gè)接口派生而出:CollectionMap,Collection和Map是Java集合框架的根接口,這兩個(gè)接口又包含了一些子接口或?qū)崿F(xiàn)類锚扎。

2. 集合接口:6個(gè)接口(短虛線表示)攀甚,表示不同集合類型箩朴,是集合框架的基礎(chǔ)。

3. 抽象類:5個(gè)抽象類(長(zhǎng)虛線表示)秋度,對(duì)集合接口的部分實(shí)現(xiàn)炸庞。可擴(kuò)展為自定義集合類荚斯。

4. 實(shí)現(xiàn)類:8個(gè)實(shí)現(xiàn)類(實(shí)線表示)埠居,對(duì)接口的具體實(shí)現(xiàn)。

5. Collection 接口是一組允許重復(fù)的對(duì)象事期。

6. Set 接口繼承 Collection滥壕,集合元素不重復(fù)。

7. List 接口繼承 Collection兽泣,允許重復(fù)绎橘,維護(hù)元素插入順序。

8. Map接口是鍵-值對(duì)象唠倦,與Collection接口沒有什么關(guān)系称鳞。

9.Set、List和Map可以看做集合的三大類:

List集合是有序集合稠鼻,集合中的元素可以重復(fù)冈止,訪問(wèn)集合中的元素可以根據(jù)元素的索引來(lái)訪問(wèn)。

Set集合是無(wú)序集合枷餐,集合中的元素不可以重復(fù)靶瘸,訪問(wèn)集合中的元素只能根據(jù)元素本身來(lái)訪問(wèn)(也是集合里元素不允許重復(fù)的原因)苫亦。

Map集合中保存Key-value對(duì)形式的元素毛肋,訪問(wèn)時(shí)只能根據(jù)每項(xiàng)元素的key來(lái)訪問(wèn)其value。

二屋剑、總體分析

大致說(shuō)明:

看上面的框架圖润匙,先抓住它的主干,即Collection和Map唉匾。

1孕讳、Collection是一個(gè)接口,是高度抽象出來(lái)的集合巍膘,它包含了集合的基本操作和屬性厂财。Collection包含了List和Set兩大分支。

(1)List是一個(gè)有序的隊(duì)列峡懈,每一個(gè)元素都有它的索引璃饱。第一個(gè)元素的索引值是0。List的實(shí)現(xiàn)類有LinkedList, ArrayList, Vector, Stack肪康。

(2)Set是一個(gè)不允許有重復(fù)元素的集合荚恶。Set的實(shí)現(xiàn)類有HastSet和TreeSet撩穿。HashSet依賴于HashMap,它實(shí)際上是通過(guò)HashMap實(shí)現(xiàn)的谒撼;TreeSet依賴于TreeMap食寡,它實(shí)際上是通過(guò)TreeMap實(shí)現(xiàn)的。

2廓潜、Map是一個(gè)映射接口抵皱,即key-value鍵值對(duì)。Map中的每一個(gè)元素包含“一個(gè)key”和“key對(duì)應(yīng)的value”茉帅。AbstractMap是個(gè)抽象類叨叙,它實(shí)現(xiàn)了Map接口中的大部分API。而HashMap堪澎,TreeMap擂错,WeakHashMap都是繼承于AbstractMap。Hashtable雖然繼承于Dictionary樱蛤,但它實(shí)現(xiàn)了Map接口钮呀。

3、接下來(lái)昨凡,再看Iterator爽醋。它是遍歷集合的工具,即我們通常通過(guò)Iterator迭代器來(lái)遍歷集合便脊。我們說(shuō)Collection依賴于Iterator蚂四,是因?yàn)镃ollection的實(shí)現(xiàn)類都要實(shí)現(xiàn)iterator()函數(shù),返回一個(gè)Iterator對(duì)象哪痰。ListIterator是專門為遍歷List而存在的遂赠。

4、再看Enumeration晌杰,它是JDK 1.0引入的抽象類跷睦。作用和Iterator一樣,也是遍歷集合肋演;但是Enumeration的功能要比Iterator少抑诸。在上面的框圖中,Enumeration只能在Hashtable, Vector, Stack中使用爹殊。

5蜕乡、最后,看Arrays和Collections梗夸。它們是操作數(shù)組层玲、集合的兩個(gè)工具類。

有了上面的整體框架之后,我們接下來(lái)對(duì)每個(gè)類分別進(jìn)行分析称簿。

三扣癣、Collection接口

Collection接口是處理對(duì)象集合的根接口,其中定義了很多對(duì)元素進(jìn)行操作的方法憨降。Collection接口有兩個(gè)主要的子接口ListSet父虑,注意Map不是Collection的子接口,這個(gè)要牢記授药。

Collection接口中的方法如下:

其中士嚎,有幾個(gè)比較常用的方法,比如方法add()添加一個(gè)元素到集合中悔叽,addAll()將指定集合中的所有元素添加到集合中莱衩,contains()方法檢測(cè)集合中是否包含指定的元素,toArray()方法返回一個(gè)表示集合的數(shù)組娇澎。

另外笨蚁,Collection中有一個(gè)iterator()函數(shù),它的作用是返回一個(gè)Iterator接口趟庄。通常括细,我們通過(guò)Iterator迭代器來(lái)遍歷集合。ListIterator是List接口所特有的戚啥,在List接口中奋单,通過(guò)ListIterator()返回一個(gè)ListIterator對(duì)象。

Collection接口有兩個(gè)常用的子接口猫十,下面詳細(xì)介紹览濒。

1.List接口

List集合代表一個(gè)有序集合,集合中每個(gè)元素都有其對(duì)應(yīng)的順序索引拖云。List集合允許使用重復(fù)元素贷笛,可以通過(guò)索引來(lái)訪問(wèn)指定位置的集合元素。

List接口繼承于Collection接口江兢,它可以定義一個(gè)允許重復(fù)有序集合昨忆。因?yàn)長(zhǎng)ist中的元素是有序的丁频,所以我們可以通過(guò)使用索引(元素在List中的位置杉允,類似于數(shù)組下標(biāo))來(lái)訪問(wèn)List中的元素,這類似于Java的數(shù)組席里。

List接口為Collection直接接口叔磷。List所代表的是有序的Collection,即它用某種特定的插入順序來(lái)維護(hù)元素順序奖磁。用戶可以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制改基,同時(shí)可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問(wèn)元素,并搜索列表中的元素咖为。實(shí)現(xiàn)List接口的集合主要有:ArrayList秕狰、LinkedList稠腊、Vector、Stack鸣哀。

(1)ArrayList

ArrayList是一個(gè)動(dòng)態(tài)數(shù)組架忌,也是我們最常用的集合。它允許任何符合規(guī)則的元素插入甚至包括null我衬。每一個(gè)ArrayList都有一個(gè)初始容量(10)叹放,該容量代表了數(shù)組的大小。隨著容器中的元素不斷增加挠羔,容器的大小也會(huì)隨著增加井仰。在每次向容器中增加元素的同時(shí)都會(huì)進(jìn)行容量檢查,當(dāng)快溢出時(shí)破加,就會(huì)進(jìn)行擴(kuò)容操作俱恶。所以如果我們明確所插入元素的多少,最好指定一個(gè)初始容量值范舀,避免過(guò)多的進(jìn)行擴(kuò)容操作而浪費(fèi)時(shí)間速那、效率。

size尿背、isEmpty端仰、get、set田藐、iterator 和 listIterator 操作都以固定時(shí)間運(yùn)行荔烧。add 操作以分?jǐn)偟墓潭〞r(shí)間運(yùn)行,也就是說(shuō)汽久,添加 n 個(gè)元素需要 O(n) 時(shí)間(由于要考慮到擴(kuò)容鹤竭,所以這不只是添加元素會(huì)帶來(lái)分?jǐn)偣潭〞r(shí)間開銷那樣簡(jiǎn)單)。

ArrayList擅長(zhǎng)于隨機(jī)訪問(wèn)景醇。同時(shí)ArrayList是非同步的臀稚。

(2)LinkedList

同樣實(shí)現(xiàn)List接口的LinkedList與ArrayList不同,ArrayList是一個(gè)動(dòng)態(tài)數(shù)組三痰,而LinkedList是一個(gè)雙向鏈表吧寺。所以它除了有ArrayList的基本操作方法外還額外提供了get,remove散劫,insert方法在LinkedList的首部或尾部稚机。

由于實(shí)現(xiàn)的方式不同,LinkedList不能隨機(jī)訪問(wèn)获搏,它所有的操作都是要按照雙重鏈表的需要執(zhí)行赖条。在列表中索引的操作將從開頭或結(jié)尾遍歷列表(從靠近指定索引的一端)。這樣做的好處就是可以通過(guò)較低的代價(jià)在List中進(jìn)行插入和刪除操作。

與ArrayList一樣纬乍,LinkedList也是非同步的碱茁。如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)List,則必須自己實(shí)現(xiàn)訪問(wèn)同步仿贬。一種解決方法是在創(chuàng)建List時(shí)構(gòu)造一個(gè)同步的List:

List list = Collections.synchronizedList(new LinkedList(...));

(3)Vector

與ArrayList相似早芭,但是Vector是同步的。所以說(shuō)Vector是線程安全的動(dòng)態(tài)數(shù)組诅蝶。它的操作與ArrayList幾乎一樣退个。

(4)Stack

Stack繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧调炬。Stack提供5個(gè)額外的方法使得Vector得以被當(dāng)作堆棧使用语盈。基本的push和pop 方法缰泡,還有peek方法得到棧頂?shù)脑氐痘模琫mpty方法測(cè)試堆棧是否為空,search方法檢測(cè)一個(gè)元素在堆棧中的位置棘钞。Stack剛創(chuàng)建后是空棧缠借。

2.Set接口

Set是一種不包括重復(fù)元素的Collection。它維持它自己的內(nèi)部排序宜猜,所以隨機(jī)訪問(wèn)沒有任何意義泼返。與List一樣,它同樣允許null的存在但是僅有一個(gè)姨拥。由于Set接口的特殊性绅喉,所有傳入Set集合中的元素都必須不同,同時(shí)要注意任何可變對(duì)象叫乌,如果在對(duì)集合中元素進(jìn)行操作時(shí)柴罐,導(dǎo)致e1.equals(e2)==true,則必定會(huì)產(chǎn)生某些問(wèn)題憨奸。Set接口有三個(gè)具體實(shí)現(xiàn)類革屠,分別是散列集HashSet、鏈?zhǔn)缴⒘屑疞inkedHashSet和樹形集TreeSet排宰。

Set是一種不包含重復(fù)的元素的Collection似芝,無(wú)序,即任意的兩個(gè)元素e1和e2都有e1.equals(e2)=false额各,Set最多有一個(gè)null元素国觉。需要注意的是:雖然Set中元素沒有順序吧恃,但是元素在set中的位置是由該元素的HashCode決定的虾啦,其具體位置其實(shí)是固定的。

此外需要說(shuō)明一點(diǎn),在set接口中的不重復(fù)是有特殊要求的傲醉。

舉一個(gè)例子:對(duì)象A和對(duì)象B蝇闭,本來(lái)是不同的兩個(gè)對(duì)象,正常情況下它們是能夠放入到Set里面的硬毕,但是如果對(duì)象A和B的都重寫了hashcode和equals方法呻引,并且重寫后的hashcode和equals方法是相同的話。那么A和B是不能同時(shí)放入到Set集合中去的吐咳,也就是Set集合中的去重和hashcode與equals方法直接相關(guān)逻悠。

為了更好地理解,請(qǐng)看下面的例子:

public class Test{

public static void main(String[] args) {

Set set=new HashSet();

set.add("Hello");

set.add("world");

set.add("Hello");

System.out.println("集合的尺寸為:"+set.size());

System.out.println("集合中的元素為:"+set.toString());

}

}

運(yùn)行結(jié)果:

集合的尺寸為:2

集合中的元素為:[world, Hello]

分析:由于String類中重寫了hashcode和equals方法韭脊,用來(lái)比較指向的字符串對(duì)象所存儲(chǔ)的字符串是否相等童谒。所以這里的第二個(gè)Hello是加不進(jìn)去的。

再看一個(gè)例子:

public class TestSet {

public static void main(String[] args){

Set books = new HashSet();

//添加一個(gè)字符串對(duì)象

books.add(new String("Struts2權(quán)威指南"));

//再次添加一個(gè)字符串對(duì)象沪羔,

//因?yàn)閮蓚€(gè)字符串對(duì)象通過(guò)equals方法比較相等饥伊,所以添加失敗,返回false

boolean result = books.add(new String("Struts2權(quán)威指南"));

System.out.println(result);

//下面輸出看到集合只有一個(gè)元素

System.out.println(books);

}

}

運(yùn)行結(jié)果:

false

[Struts2權(quán)威指南]

說(shuō)明:程序中蔫饰,book集合兩次添加的字符串對(duì)象明顯不是一個(gè)對(duì)象(程序通過(guò)new關(guān)鍵字來(lái)創(chuàng)建字符串對(duì)象)琅豆,當(dāng)使用==運(yùn)算符判斷返回false,使用equals方法比較返回true篓吁,所以不能添加到Set集合中茫因,最后只能輸出一個(gè)元素。

(1)HashSet

HashSet 是一個(gè)沒有重復(fù)元素的集合杖剪。它是由HashMap實(shí)現(xiàn)的节腐,不保證元素的順序(這里所說(shuō)的沒有順序是指:元素插入的順序與輸出的順序不一致),而且HashSet允許使用null 元素摘盆。HashSet是非同步的翼雀,如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)哈希set,而其中至少一個(gè)線程修改了該set孩擂,那么它必須保持外部同步狼渊。 HashSet按Hash算法來(lái)存儲(chǔ)集合的元素,因此具有很好的存取和查找性能类垦。

HashSet的實(shí)現(xiàn)方式大致如下狈邑,通過(guò)一個(gè)HashMap存儲(chǔ)元素,元素是存放在HashMap的Key中蚤认,而Value統(tǒng)一使用一個(gè)Object對(duì)象米苹。

HashSet使用和理解中容易出現(xiàn)的誤區(qū):

a.HashSet中存放null值

HashSet中是允許存入null值的,但是在HashSet中僅僅能夠存入一個(gè)null值砰琢。

b.HashSet中存儲(chǔ)元素的位置是固定的

HashSet中存儲(chǔ)的元素的是無(wú)序的蘸嘶,這個(gè)沒什么好說(shuō)的良瞧,但是由于HashSet底層是基于Hash算法實(shí)現(xiàn)的,使用了hashcode训唱,所以HashSet中相應(yīng)的元素的位置是固定的褥蚯。

c.必須小心操作可變對(duì)象(Mutable Object)。如果一個(gè)Set中的可變?cè)馗淖兞俗陨頎顟B(tài)導(dǎo)致Object.equals(Object)=true將導(dǎo)致一些問(wèn)題况增。

(2)LinkedHashSet

LinkedHashSet繼承自HashSet赞庶,其底層是基于LinkedHashMap來(lái)實(shí)現(xiàn)的,有序澳骤,非同步歧强。LinkedHashSet集合同樣是根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置,但是它同時(shí)使用鏈表維護(hù)元素的次序为肮。這樣使得元素看起來(lái)像是以插入順序保存的誊锭,也就是說(shuō),當(dāng)遍歷該集合時(shí)候弥锄,LinkedHashSet將會(huì)以元素的添加順序訪問(wèn)集合的元素丧靡。

(3)TreeSet

TreeSet是一個(gè)有序集合,其底層是基于TreeMap實(shí)現(xiàn)的籽暇,非線程安全温治。TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式戒悠,自然排序和定制排序熬荆,其中自然排序?yàn)槟J(rèn)的排序方式。當(dāng)我們構(gòu)造TreeSet時(shí)绸狐,若使用不帶參數(shù)的構(gòu)造函數(shù)卤恳,則TreeSet的使用自然比較器;若用戶需要使用自定義的比較器寒矿,則需要使用帶比較器的參數(shù)突琳。

注意:TreeSet集合不是通過(guò)hashcode和equals函數(shù)來(lái)比較元素的.它是通過(guò)compare或者comparaeTo函數(shù)來(lái)判斷元素是否相等.compare函數(shù)通過(guò)判斷兩個(gè)對(duì)象的id,相同的id判斷為重復(fù)元素符相,不會(huì)被加入到集合中拆融。

由于個(gè)人時(shí)間問(wèn)題今天的分享就先到這里,有興趣的同學(xué)可以關(guān)注我啊终,留意下節(jié)文章的發(fā)布镜豹。

每天都在分享文章,也每天都有人想要我出來(lái)給大家分享下怎么去學(xué)習(xí)Java蓝牲。大家都知道趟脂,我們是學(xué)Java全棧的,大家就肯定以為我有全套的Java系統(tǒng)教程例衍。沒錯(cuò)昔期,我是有Java全套系統(tǒng)教程已卸,進(jìn)扣裙【47】974【9726】所示,今天小編就免費(fèi)送!~

后記:對(duì)于大部分轉(zhuǎn)行的人來(lái)說(shuō)镇眷,找機(jī)會(huì)把自己的基礎(chǔ)知識(shí)補(bǔ)齊咬最,邊工作邊補(bǔ)基礎(chǔ)知識(shí)翎嫡,真心很重要欠动。

“我們相信人人都可以成為一個(gè)程序員,現(xiàn)在開始惑申,找個(gè)師兄具伍,帶你入門,學(xué)習(xí)的路上不再迷茫圈驼。這里是ja+va修真院人芽,初學(xué)者轉(zhuǎn)行到互聯(lián)網(wǎng)行業(yè)的聚集地。"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绩脆,一起剝皮案震驚了整個(gè)濱河市萤厅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌靴迫,老刑警劉巖惕味,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異玉锌,居然都是意外死亡名挥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門主守,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)禀倔,“玉大人,你說(shuō)我怎么就攤上這事参淫【群” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵涎才,是天一觀的道長(zhǎng)捎谨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)憔维,這世上最難降的妖魔是什么涛救? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮业扒,結(jié)果婚禮上检吆,老公的妹妹穿的比我還像新娘。我一直安慰自己程储,他們只是感情好蹭沛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布臂寝。 她就那樣靜靜地躺著,像睡著了一般摊灭。 火紅的嫁衣襯著肌膚如雪咆贬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天帚呼,我揣著相機(jī)與錄音掏缎,去河邊找鬼。 笑死煤杀,一個(gè)胖子當(dāng)著我的面吹牛眷蜈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沈自,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼酌儒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了枯途?” 一聲冷哼從身側(cè)響起忌怎,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酪夷,沒想到半個(gè)月后榴啸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捶索,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年插掂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腥例。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辅甥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燎竖,到底是詐尸還是另有隱情璃弄,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布构回,位于F島的核電站夏块,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纤掸。R本人自食惡果不足惜脐供,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望借跪。 院中可真熱鬧政己,春花似錦、人聲如沸掏愁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至沦泌,卻和暖如春糊昙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谢谦。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工释牺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人他宛。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓船侧,卻偏偏與公主長(zhǎng)得像欠气,于是被迫代替她去往敵國(guó)和親厅各。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 四预柒、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列队塘,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 738評(píng)論 0 2
  • 一、集合入門總結(jié) 集合框架: Java中的集合框架大類可分為Collection和Map淋袖;兩者的區(qū)別: 1鸿市、Col...
    程序員歐陽(yáng)閱讀 11,547評(píng)論 2 61
  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,922評(píng)論 0 13
  • 集合類框架的介紹: ![Java 集合類框架](https://upload-images.jianshu.io/...
    LynnGuo閱讀 753評(píng)論 0 1
  • 今天是來(lái)到老撾瑯勃拉邦的第六天,繼續(xù)深入體驗(yàn)當(dāng)?shù)氐娘L(fēng)土人情即碗。 在瑯勃拉邦這個(gè)世界文化遺產(chǎn)地焰情,曾經(jīng)的老撾古都,佛教中...
    宋如如閱讀 389評(píng)論 0 1