重拾Java(01) - 第二十年

概述

在過(guò)去的20年里笆搓,如果要選一個(gè)最成功的編程語(yǔ)言那一定非Java莫屬辽狈。根據(jù)TIOBE Index發(fā)布的編程語(yǔ)言排行榜抱慌,自2001年以來(lái)Java語(yǔ)言在這個(gè)排行榜上最差的名次是第二名。在20年的發(fā)展歷程中郑象,Java已經(jīng)不僅僅是一門(mén)編程語(yǔ)言铝量,它更是一個(gè)平臺(tái)倘屹,是一系列的計(jì)算機(jī)軟件和規(guī)范形成的技術(shù)體系,從嵌入式系統(tǒng)慢叨、移動(dòng)終端到個(gè)人計(jì)算機(jī)唐瀑、服務(wù)器等領(lǐng)域,Java都占據(jù)著舉足輕重的位置插爹。按照官方網(wǎng)站在2016年提供的數(shù)據(jù)哄辣,全球有900萬(wàn)Java開(kāi)發(fā)人員并有約60億臺(tái)設(shè)備都在運(yùn)行Java程序,這些數(shù)字都是非常震撼的赠尾。

術(shù)語(yǔ)

想了解Java力穗,有三個(gè)術(shù)語(yǔ)必須要知道:

JDK:Java開(kāi)發(fā)者工具 - Java Developer's Kit
JRE:Java運(yùn)行時(shí)環(huán)境 - Java Runtime Environment
JVM:Java虛擬機(jī) - Java Virtual Machine

歷史

關(guān)于Java這20年的故事,不是一兩句話(huà)能說(shuō)清楚的气嫁,下面用編年史的方式做一個(gè)簡(jiǎn)要的介紹当窗。

  • 1991年4月,James Gosling(計(jì)算機(jī)界的全能奇才寸宵,被稱(chēng)為“Java之父”)領(lǐng)導(dǎo)的Green Project啟動(dòng)崖面,雖然項(xiàng)目項(xiàng)目并不成功,但是在項(xiàng)目中誕生的Oak語(yǔ)言伴隨著互聯(lián)網(wǎng)潮流的興起梯影,迅速找到了適合自己發(fā)展的市場(chǎng)定位并最終蛻變?yōu)镴ava語(yǔ)言巫员。
  • 1995年5月23日,Java誕生甲棍。
  • 1996年1月23日简识,JDK 1.0正式發(fā)布。
  • 1996年5月,第一屆JavaOne大會(huì)在舊金山舉行七扰。
  • 1997年2月19日奢赂, SUN公司發(fā)布JDK 1.1,代表性的技術(shù)包括:JAR文件格式颈走、JDBC膳灶、JavaBeans、RMI立由、內(nèi)部類(lèi)和反射等袖瞻。
  • 1998年12月4日,JDK迎來(lái)了里程碑式的版本JDK 1.2拆吆,SUN公司將Java技術(shù)拆分為3個(gè)方向,分別是面向桌面應(yīng)用開(kāi)發(fā)的J2SE脂矫、面向企業(yè)級(jí)開(kāi)發(fā)的J2EE和面向移動(dòng)終端開(kāi)發(fā)的J2ME枣耀。該版本首次在Java虛擬機(jī)中內(nèi)置了JIT編譯器。
  • 2000年5月8日庭再,JDK 1.3發(fā)布捞奕,代號(hào)Kestrel,改進(jìn)了數(shù)學(xué)運(yùn)算拄轻、時(shí)間以及Java 2D等API颅围,新增了和聲音處理相關(guān)的類(lèi)庫(kù)。此后恨搓,SUN公司基本每個(gè)兩年發(fā)布一個(gè)JDK的主版本院促,產(chǎn)品代號(hào)都以動(dòng)物命名。
  • 2002年2月13日斧抱,JDK 1.4發(fā)布常拓,代號(hào)Merlin,Java開(kāi)始走向成熟并逐漸達(dá)到巔峰辉浦,今天很多主流框架仍然可以在JDK 1.4上直接運(yùn)行弄抬。該版本中引入了正則表達(dá)式、異常鏈宪郊、NIO掂恕、日志類(lèi)、XML解析器等弛槐。
  • 2004年9月30日懊亡,JDK 1.5發(fā)布,代號(hào)Tiger乎串,該版本在Java語(yǔ)法的易用性上做出了很大的改進(jìn)斋配,引入了自動(dòng)裝箱、泛型、注解艰争、枚舉坏瞄、可變參數(shù)列表、for-each循環(huán)等特性甩卓,同時(shí)在這個(gè)版本中還對(duì)Java內(nèi)存模型進(jìn)行了改進(jìn)鸠匀,同時(shí)引入了更優(yōu)質(zhì)的用于多線(xiàn)程編程的java.util.concurrent包。
  • 2006年12月11日逾柿,JDK 1.6發(fā)布缀棍,代號(hào)Mustang,在這個(gè)版本中机错,J2SE爬范、J2EE和J2ME被更名為Java SE、Java EE和Java ME弱匪,提供了對(duì)腳本語(yǔ)言的支持以及編譯器API和微型HTTP服務(wù)器API等內(nèi)容青瀑。此外,該版本還對(duì)Java虛擬機(jī)內(nèi)部進(jìn)行了大量的優(yōu)化萧诫,包括垃圾回收斥难、類(lèi)加載、鎖機(jī)制等帘饶。同年哑诊,SUN公司開(kāi)始逐漸陷入困境。
  • 2009年2月19日及刻,JDK 1.7發(fā)布镀裤,代號(hào)Dolphin,JDK 1.7最初計(jì)劃引入很多開(kāi)發(fā)者翹首以盼的功能缴饭,包括Lambda表達(dá)式淹禾,Jigsaw項(xiàng)目、動(dòng)態(tài)語(yǔ)言支持茴扁、G1收集器和Coin項(xiàng)目铃岔,但是如前所述,由于SUN公司已經(jīng)陷入困境峭火,無(wú)力推動(dòng)研發(fā)工作按正常計(jì)劃進(jìn)行毁习,在4月20日Oracle公司宣布以74億美元收購(gòu)SUN公司,Java商標(biāo)從此歸Oracle所有卖丸,此后Oracle公司執(zhí)行了所謂的“B計(jì)劃”纺且,大幅裁剪了JDK 1.7的預(yù)定目標(biāo),把諸多內(nèi)容推遲到了JDK 1.8中稍浆,隨后又宣布Jigsaw在JDK 1.8中依然無(wú)法完成载碌。
  • 2014年3月18日猜嘱,在漫長(zhǎng)的等待后,“跳票王”O(jiān)racle公司終于推出了JDK 1.8嫁艇,沒(méi)有產(chǎn)品代號(hào)朗伶,這一次真可以說(shuō)得上是“千呼萬(wàn)喚始出來(lái)”。

特點(diǎn)

自Java誕生以來(lái)步咪,你可能聽(tīng)過(guò)很多關(guān)于Java有多么牛逼的描述论皆,但是其中很多內(nèi)容都是過(guò)去時(shí),當(dāng)下的Java最吸引人的地方應(yīng)該在于以下幾個(gè)方面猾漫。

  • 對(duì)函數(shù)式編程的支持:面向?qū)ο蟮木幊趟枷胱寫(xiě)?yīng)用程序的開(kāi)發(fā)變得簡(jiǎn)單輕松点晴,通過(guò)給對(duì)象發(fā)送消息很多問(wèn)題就可以得到解決;而函數(shù)式編程的思想則源于λ 演算悯周,強(qiáng)調(diào)使用表達(dá)式而不是語(yǔ)句粒督,通過(guò)不改變狀態(tài)的操作讓代碼沒(méi)有副作用,這些都迎合了很多領(lǐng)域的開(kāi)發(fā)者的需求禽翼,當(dāng)下很多高級(jí)編程語(yǔ)言都提供了對(duì)函數(shù)式編程的支持屠橄,Java終于在JDK 1.8中引入了Lambda表達(dá)式、函數(shù)式接口捐康、方法引用等高級(jí)語(yǔ)法來(lái)支持函數(shù)式編程,且看一小段代碼庸蔼。
import java.util.List;
import java.util.Arrays;
class Hello {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "grape", "pitaya");
        list.forEach(System.out::println);
    }
}
  • 始終如一的平臺(tái)可移植性:平臺(tái)可移植性從來(lái)都是Java最大的賣(mài)點(diǎn)解总,通過(guò)在不同的平臺(tái)下安裝對(duì)應(yīng)的JVM來(lái)加載類(lèi)文件執(zhí)行,雖然在一定程度上犧牲了執(zhí)行效率姐仅,但獲得的是完美的平臺(tái)可移植性花枫。
  • 支持多種編程語(yǔ)言混編:目前的JVM已經(jīng)能夠支持諸如Groovy、Scala掏膏、Clojure這樣的語(yǔ)言進(jìn)行開(kāi)發(fā)劳翰。使用非Java語(yǔ)言主要是出于這些考慮:首先使用領(lǐng)域特定語(yǔ)言可以方便構(gòu)建、持續(xù)集成馒疹、業(yè)務(wù)規(guī)則建模等操作佳簸;其次也可以利用一些動(dòng)態(tài)語(yǔ)言的特性來(lái)彌補(bǔ)Java本身的不足,滿(mǎn)足快速Web開(kāi)發(fā)颖变、腳本編程和測(cè)試等方面的需求生均。今天有很多軟件和系統(tǒng)的開(kāi)發(fā)都是通過(guò)多語(yǔ)言混編實(shí)現(xiàn)的。
  • 對(duì)多核并發(fā)編程的支持:Java語(yǔ)言?xún)?nèi)置的對(duì)多線(xiàn)程編程的支持是Java早期的一大賣(mài)點(diǎn)腥刹,但在今天看來(lái)已經(jīng)不是什么了不起的事情马胧。隨著CPU進(jìn)入多核時(shí)代,Java在并發(fā)編程上也做出了與時(shí)俱進(jìn)的升級(jí)衔峰,從JDK 1.5的java.util.concurrent包佩脊,到JDK 1.7引入Fork/Join模式蛙粘,Java程序已經(jīng)能夠輕松的利用多個(gè)CPU核心提供的計(jì)算能力來(lái)協(xié)作完成更復(fù)雜的任務(wù)。

探秘

想要深入學(xué)習(xí)和了解Java威彰,可以對(duì)JVM進(jìn)行一次探秘出牧。

JVM中的內(nèi)存

  • 程序計(jì)數(shù)器(Program Counter Register)
    程序計(jì)數(shù)器可以視為當(dāng)前線(xiàn)程所執(zhí)行的字節(jié)碼的行號(hào)指示器,字節(jié)碼解釋器工作時(shí)就是通過(guò)改變程序計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令抱冷。對(duì)于多線(xiàn)程的應(yīng)用程序崔列,每個(gè)線(xiàn)程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,線(xiàn)程之間互不影響旺遮,因此程序計(jì)數(shù)器是線(xiàn)程私有的內(nèi)存赵讯。
  • 虛擬機(jī)棧(VM Stack)
    Java虛擬機(jī)棧也是線(xiàn)程私有的,它描述了Java方法執(zhí)行的內(nèi)存模型耿眉,即每個(gè)方法在執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表(存放了編譯期可知的基本數(shù)據(jù)類(lèi)型边翼,包括:byte、short鸣剪、int组底、long、float筐骇、double债鸡、char、boolean铛纬,對(duì)象的引用以及返回地址)厌均、操作數(shù)棧、動(dòng)態(tài)鏈接告唆、方法出口等信息棺弊。在JVM規(guī)范中,對(duì)這個(gè)區(qū)域規(guī)定了兩種異常狀況:如果線(xiàn)程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度擒悬,將引發(fā)StackOverflowError模她;如果虛擬機(jī)棧需要擴(kuò)展空間但無(wú)法申請(qǐng)到足夠的內(nèi)存,將引發(fā)OutOfMemoryError懂牧。
  • 本地方法棧(Native Method Stack)
    本地方法棧顧名思義是調(diào)用本地方法(用C/C++編寫(xiě)的方法)時(shí)使用的棧侈净。
  • 堆(Heap)
    堆是JVM所管理的內(nèi)存中最大的一塊,它是被所有線(xiàn)程共享的內(nèi)存區(qū)域僧凤,在JVM啟動(dòng)時(shí)創(chuàng)建用狱,用于存放對(duì)象實(shí)例。在JVM規(guī)范中明確指出:The heap is the runtime data area from which memory for all class instances and arrays is allocated. 但是隨著JIT編譯器的發(fā)展與逃逸分析技術(shù)的逐漸成熟拼弃,對(duì)象實(shí)例的棧上分配夏伊、標(biāo)量替換優(yōu)化將使得“對(duì)象一定在堆上”這個(gè)說(shuō)法變得不那么絕對(duì)了。堆是Java垃圾收集器管理的主要區(qū)域吻氧,現(xiàn)在的垃圾收集器都基于分代收集算法溺忧,堆通常分為新生代和老生代咏连,新生代具體又可細(xì)分為Eden、From Survivor和To Survivor鲁森。在啟動(dòng)JVM時(shí)可以通過(guò)-Xmx和-Xms來(lái)控制堆的大小祟滴,還可以通過(guò)-Xmn和-XX:NewRatio來(lái)控制新生代的大小以及新生代和老生代的比例,如果想了解垃圾收集器的工作細(xì)節(jié)歌溉,可以使用-XX:+PrintGCDetails來(lái)做到垄懂。


  • 方法區(qū)(Method Area)
    方法區(qū)也是線(xiàn)程共享的內(nèi)存區(qū)域,用于存儲(chǔ)已被JVM加載的類(lèi)的信息痛垛、常量草慧、靜態(tài)變量、JIT編譯后的代碼等數(shù)據(jù)匙头。方法區(qū)中比較重要的一塊是運(yùn)行時(shí)常量池(Constant Pool)漫谷,它允許運(yùn)行期間將新的常量放入池中,String類(lèi)的intern()方法就是一個(gè)例子蹂析。當(dāng)常量池?zé)o法再申請(qǐng)到內(nèi)存時(shí)也會(huì)引發(fā)OutOfMemoryError舔示。
  • 直接內(nèi)存
    JDK1.4中引入了NIO(非阻塞式I/O),它可以使用本地方法分配堆以外的內(nèi)存,然后通過(guò)ByteBuffer/CharBuffer對(duì)象來(lái)操作這些內(nèi)存电抚,從而實(shí)現(xiàn)提升性能的目標(biāo)惕稻。

說(shuō)明:Java虛擬機(jī)是非常復(fù)雜的,如果想要真正理解它的工作原理蝙叛,可以嘗試自己寫(xiě)一個(gè)Java虛擬機(jī)俺祠。不要覺(jué)得這件事情遙不可及,有一本名為《自己動(dòng)手寫(xiě)Java虛擬機(jī)》的書(shū)就用Go語(yǔ)言實(shí)現(xiàn)了一個(gè)自己的JVM甥温。

JVM中的對(duì)象

  • 對(duì)象的創(chuàng)建
    虛擬機(jī)遇到一條new指令時(shí)锻煌,首先將檢查這個(gè)指令對(duì)應(yīng)的參數(shù)是不是能在常量池中定位到的一個(gè)類(lèi)的符號(hào)引用妓布,然后還要檢查這個(gè)對(duì)應(yīng)的類(lèi)是否已經(jīng)被加載姻蚓、解析和初始化過(guò),如果沒(méi)有就要執(zhí)行類(lèi)加載(具體的細(xì)節(jié)將在后續(xù)的文章中探討)匣沼。接下來(lái)需要為對(duì)象分配內(nèi)存空間狰挡,而且內(nèi)存空間除對(duì)象頭外都要被初始化為0值,這就保證了對(duì)象的屬性在不賦初始值的情況下就能直接使用释涛。再下來(lái)加叁,JVM要對(duì)對(duì)象進(jìn)行必要的設(shè)置,主要是對(duì)象頭的設(shè)置以及對(duì)象的初始化工作(按照程序員的意愿為屬性設(shè)定對(duì)應(yīng)的值)唇撬,到此一個(gè)對(duì)象就真正的完成了創(chuàng)建過(guò)程它匕。
  • 對(duì)象的內(nèi)存布局
    對(duì)于HotSpot虛擬機(jī)而言,對(duì)象在內(nèi)存中的布局可以為分3塊區(qū)域:對(duì)象頭窖认、實(shí)力數(shù)據(jù)和對(duì)齊填充豫柬。對(duì)象頭包含兩部分信息告希,第一部分用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),如哈希碼烧给、GC分代年齡燕偶、鎖狀態(tài)標(biāo)識(shí)等;另一部分是類(lèi)型指針础嫡,也就是對(duì)象指向它的類(lèi)元數(shù)據(jù)的指針指么,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類(lèi)的實(shí)例。
  • 對(duì)象的訪(fǎng)問(wèn)定位
    訪(fǎng)問(wèn)一個(gè)對(duì)象基本上有兩種策略:一種是通過(guò)句柄訪(fǎng)問(wèn)榴鼎,引用中存儲(chǔ)的是句柄地址伯诬,這種方式首先需要在Java堆中劃分一塊內(nèi)存作為句柄池,當(dāng)對(duì)象指針發(fā)生改變(比如對(duì)象被移動(dòng))檬贰,這個(gè)時(shí)候引用本身的值不需要改變姑廉,改變的只是句柄的值;另一種是直接指針訪(fǎng)問(wèn)翁涤,引用直接指向內(nèi)存堆空間中對(duì)象的地址桥言。由于對(duì)象訪(fǎng)問(wèn)在JVM中非常的頻繁,所以第一種方法會(huì)造成較大的開(kāi)銷(xiāo)葵礼,因此HotSpot虛擬機(jī)采用了第二種方式号阿。

開(kāi)發(fā)

如果只想運(yùn)行Java程序,那么有JRE就足夠了鸳粉,因?yàn)樗诉\(yùn)行Java程序所需的虛擬機(jī)還有就是支撐程序運(yùn)行的上下文環(huán)境扔涧;如果想要用Java開(kāi)發(fā)應(yīng)用程序那么就得有JDK,因?yàn)镴DK中包含了Java開(kāi)發(fā)的必要工具届谈。當(dāng)然枯夜,在開(kāi)發(fā)過(guò)程中使用IDE(集成開(kāi)發(fā)環(huán)境)可以大大提升開(kāi)發(fā)效率。對(duì)于Java開(kāi)發(fā)而言艰山,可以選擇的IDE主要有三個(gè):

  • Eclipse:國(guó)內(nèi)有很多程序員都在使用Eclipse湖雹,因?yàn)樗?jiǎn)單、免費(fèi)曙搬、還有很多提升開(kāi)發(fā)效率的特性摔吏。
  • IntelliJ:集成的插件和功能較多,代碼提示和修復(fù)能力強(qiáng)大纵装,可以根據(jù)需求對(duì)IDE進(jìn)行定制征讲,有免費(fèi)和付費(fèi)兩種版本,后者支持的功能更多更強(qiáng)大橡娄。
  • NetBeans:我自己使用這個(gè)IDE的次數(shù)非常少诗箍,因此也只能說(shuō)這是官方提供的開(kāi)發(fā)工具。

書(shū)籍

  • 入門(mén)讀物:Core Java(中文名:《Java核心技術(shù)》挽唉,目前最新的版本是第10版滤祖,非常棒的入門(mén)書(shū)2疟堋)
  • 進(jìn)階讀物:Thinking in Java(中文名:《Java編程思想》)、Effective Java(提升Java水平必讀書(shū)籍)氨距、Refactor(中文名《重構(gòu):改善既有代碼設(shè)計(jì)》桑逝,編程大師Martin Fowler神作)、《Java與模式》(美籍華人閻宏博士力作)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俏让,一起剝皮案震驚了整個(gè)濱河市楞遏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌首昔,老刑警劉巖寡喝,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勒奇,居然都是意外死亡预鬓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)赊颠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)格二,“玉大人,你說(shuō)我怎么就攤上這事竣蹦《ゲ拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵痘括,是天一觀的道長(zhǎng)长窄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)纲菌,這世上最難降的妖魔是什么挠日? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮翰舌,結(jié)果婚禮上嚣潜,老公的妹妹穿的比我還像新娘。我一直安慰自己灶芝,他們只是感情好郑原,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布唉韭。 她就那樣靜靜地躺著夜涕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪属愤。 梳的紋絲不亂的頭發(fā)上女器,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音住诸,去河邊找鬼驾胆。 笑死涣澡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丧诺。 我是一名探鬼主播入桂,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驳阎!你這毒婦竟也來(lái)了抗愁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呵晚,失蹤者是張志新(化名)和其女友劉穎蜘腌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體饵隙,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撮珠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蛮放,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了消略。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片樊破。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袭景,死狀恐怖佃迄,靈堂內(nèi)的尸體忽然破棺而出哈街,到底是詐尸還是另有隱情夺饲,我是刑警寧澤装盯,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布废睦,位于F島的核電站伺绽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗜湃。R本人自食惡果不足惜奈应,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望购披。 院中可真熱鬧杖挣,春花似錦、人聲如沸刚陡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筐乳。三九已至歌殃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝙云,已是汗流浹背氓皱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人波材。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓股淡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親廷区。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唯灵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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