Java SE基礎(chǔ)部分

Java核心語法

書籍:《Java核心技術(shù)卷一》《Java核心技術(shù)卷二》

java包結(jié)構(gòu):核心包寓搬,Java1一同出現(xiàn)

 applet:一種網(wǎng)頁動態(tài)效果技術(shù)
 awt:用于創(chuàng)建用戶界面和繪制圖形圖像,使用本地方法离例,顯示效果平臺不統(tǒng)一佩谣,swing以此為基礎(chǔ)
 beans:Javabeans就是符合某種特定的規(guī)范的Java類
 io:io流操作绽昏,字符流和字節(jié)流
 lang:提供基礎(chǔ)類协屡,例如基本數(shù)據(jù)類型和一些接口,Object類是重點(diǎn)
 math:支持大數(shù)字的類
 net:scoket以及一些協(xié)議的支持類
 nio:新增的緩存流
 rmi:支持遠(yuǎn)程方法
 security:加密框架
 sql:數(shù)據(jù)庫相關(guān)類全谤,主要是驅(qū)動類肤晓、連接類、結(jié)果集類等
 text:格式化處理
 time:時間日期认然、時區(qū)等
 util:日期(Data)類补憾、日歷 (Calendar)類、隨機(jī)數(shù)(Random)類卷员、一些集合類盈匾、異常類

javax包結(jié)構(gòu):擴(kuò)展包,后期特性和改進(jìn)

 accessibility  
 annotation  
 imageio  
 lang/ model  
 management  
 naming  
 print  
 rmi  
 script  
 security  
 sound  
 sql  
 swing  
 tools  
 xml

org包結(jié)構(gòu):組織提供包毕骡,特殊處理類

 ietf/ jgss  
 omg  
 w3c/ dom:網(wǎng)頁解析器
 xml/ sax:xml解析器

一.基本數(shù)據(jù)類型

六種數(shù)字類型(四個整數(shù)型削饵,兩個浮點(diǎn)型):byte,short,int,long,float,doutle

一種字符類型:char

一種布爾型:boolean

常量修飾符:final double PI = 3.1415927;

強(qiáng)制類型轉(zhuǎn)化:int i1 = 123; byte b = (byte)i1;//強(qiáng)制類型轉(zhuǎn)換為byte

二.變量類型

類變量:獨(dú)立于方法之外的變量,用 static 修飾未巫。靜態(tài)變量儲存在靜態(tài)存儲區(qū)窿撬。靜態(tài)變量在第一次被訪問時創(chuàng)建,在程序結(jié)束時銷毀橱赠。類變量具有默認(rèn)值尤仍。

實(shí)例變量:獨(dú)立于方法之外的變量,不過沒有 static 修飾狭姨。實(shí)例變量具有默認(rèn)值宰啦。

局部變量:類的方法中的變量。局部變量是在棧上分配的饼拍。局部變量沒有默認(rèn)值赡模,所以局部變量被聲明后,必須經(jīng)過初始化师抄,才可以使用漓柑。

public class Variable{
    static int allClicks=0;    // 類變量
    String str="hello world";  // 實(shí)例變量
    public void method(){
        int i =0;  // 局部變量
    }
}

三.運(yùn)算符

  • 算術(shù)運(yùn)算符
  • 關(guān)系運(yùn)算符
  • 位運(yùn)算符
  • 邏輯運(yùn)算符(&&、||叨吮、!)
  • 賦值運(yùn)算符
  • 其他運(yùn)算符
// 條件運(yùn)算符
variable x = (expression) ? value if true : value if false
// 如果 a 等于 1 成立辆布,則設(shè)置 b 為 20,否則為 30
b = (a == 1) ? 20 : 30;

// 類型檢查運(yùn)算符
( Object reference variable ) instanceof  (class/interface type)
String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 類型茶鉴,所以返回真

四.流程控制

循環(huán)

while( 布爾表達(dá)式 ) {
  //循環(huán)內(nèi)容
}

do {
       //代碼語句
}while(布爾表達(dá)式);

for(初始化; 布爾表達(dá)式; 更新) {
    //代碼語句
}

for(聲明語句 : 表達(dá)式){
   //代碼句子
}

break;continue;

條件

if(布爾表達(dá)式){
   //如果布爾表達(dá)式的值為true
}else{
   //如果布爾表達(dá)式的值為false
}

if(布爾表達(dá)式 1){
   //如果布爾表達(dá)式 1的值為true執(zhí)行代碼
}else if(布爾表達(dá)式 2){
   //如果布爾表達(dá)式 2的值為true執(zhí)行代碼
}else if(布爾表達(dá)式 3){
   //如果布爾表達(dá)式 3的值為true執(zhí)行代碼
}else {
   //如果以上布爾表達(dá)式都不為true執(zhí)行代碼
}

switch語句

switch(expression){
    case value :
       //語句
       break; //可選
    case value :
       //語句
       break; //可選
    //你可以有任意數(shù)量的case語句
    default : //可選
       //語句
}

五.string類型(不可變)

創(chuàng)建字符串:String greeting = "spring";

字符串長度:int len = site.length();

連接字符串1:"我的名字是 ".concat("Runoob");

連接字符串2:"Hello," + " runoob" + "!"

按字典順序比較兩個字符串:int compareTo(String anotherString)

測試此字符串是否以指定的前綴開始:boolean startsWith(String prefix)

測試此字符串是否以指定的后綴結(jié)束:boolean endsWith(String suffix)

返回字符在此字符串中第一次索引:int indexOf(int ch)

返回子字符串最后一次的索引锋玲,從指定的索引開始反向搜索:int lastIndexOf(String str, int fromIndex)

返回子字符串第一次的索引:int indexOf(String str)

替換字符串中字符:String replace(char oldChar, char newChar)

替換正則表達(dá)式的子字符串:String replaceAll(String regex, String replacement)

正則表達(dá)式拆分此字符串String[\] split(String regex)根據(jù)給定正則表達(dá)式的匹配拆分此字符串

六.stringBuffer(可變)

創(chuàng)建:StringBuffer sBuffer = new StringBuffer("菜鳥教程官網(wǎng):");

追加字符串:public StringBuffer append(String s)

字符串反轉(zhuǎn):public StringBuffer reverse()

移除字符:public delete(int start, int end)

插入字符:public insert(int offset, int i)

字符串替換:replace(int start, int end, String str)

其余函數(shù)同string類型

七.數(shù)組

聲明數(shù)組:dataType[] arrayRefVar;

創(chuàng)建數(shù)組:arrayRefVar = new dataType[arraySize];

作為參數(shù):public static void printArray(int[] array)

Array類方法:

二分查找算法在給定數(shù)組中搜索給定值的對象:public static int binarySearch(Object[] a, Object key)

指定的 int 值分配給指定數(shù)組指定范圍中每個元素,同樣適用于所有的其他基本數(shù)據(jù)類型:public static void fill(int[] a, int val)

指定對象數(shù)組根據(jù)其元素的自然順序進(jìn)行升序排列public static void sort(Object[] a)

八.面向?qū)ο笾绢?/h3>

常類(不可繼承涵叮、方法不可修改):final class SingleDog

靜態(tài)變量(類共享變量):public static String name = "Spring";

靜態(tài)方法(類共享方法):public static void sleep()

Object類:toString()惭蹂、equals()、hashCode()

繼承類

構(gòu)造順序割粮、在子類中構(gòu)造父類盾碗、在子類中使用父類函數(shù)

public class Show {
    public static void main(String[] args){
        //構(gòu)造B時,發(fā)現(xiàn)A先被構(gòu)造
        B testB = new B();
        //使用super調(diào)用父類方法
        testB = new B("test");
    }
}

class A{
    public A(){
        System.out.println("classA");
    }
}

class B extends A{
    public B(String in){
        //父類構(gòu)造函數(shù)必須放在第一行
        super(in+"A");
        System.out.println(in+"B");
        super.printA();
    }
}

九.面向?qū)ο笾鄳B(tài)

接口:接口是隱式抽象的舀瓢,接口中每一個方法也是隱式抽象的廷雅,接口中的方法都是公有的。

抽象類abstract class:不能實(shí)例化對象之外京髓,類的其它功能依然存在航缀。一個類只能繼承一個抽象類,而一個類卻可以實(shí)現(xiàn)多個接口朵锣。

父類引用指向子類對象谬盐,但只能使用父類出現(xiàn)過的方法。

十.面向?qū)ο笾畠?nèi)部類

參考:java提高篇(八)----詳解內(nèi)部類

接口只是解決了部分問題诚些,而內(nèi)部類使得多重繼承的解決方案變得更加完整

成員內(nèi)部類

不能有任何static類和方法飞傀,只有靜態(tài)內(nèi)部類才能定義。靜態(tài)內(nèi)部類與靜態(tài)類大致相同诬烹,但是能用外部類數(shù)據(jù)

public class InnerTest {
    public static void main(String[] args){
        Outer outer = new Outer();
        Outer.Inter inter = outer.new Inter();
        //內(nèi)部類訪問外部類數(shù)據(jù)
        inter.show();
    }
}

class Outer{
    public Outer(){}

    private int value = 11;
    public int getValue() {
        return value;
    }

    class Inter{
        public Inter(){}
        public void show(){
            System.out.println(getValue());
        }
    }
}

局部內(nèi)部類

定義在方法內(nèi)或作用域

public class Parcel5 {
    public Destionation destionation(String str){
        //局部內(nèi)部類
        class PDestionation implements Destionation{
            private String label;
            private PDestionation(String whereTo){
                label = whereTo;
            }
            public String readLabel(){
                return label;
            }
        }
        //結(jié)束定義
        return new PDestionation(str);
    }
    
    public static void main(String[] args) {
        Parcel5 parcel5 = new Parcel5();
        Destionation d = parcel5.destionation("chenssy");
    }
}

匿名內(nèi)部類

用于實(shí)現(xiàn)接口

button.addActionListener(  
                new ActionListener(){  
                    public void actionPerformed(ActionEvent e) {  
                        System.out.println("你按了按鈕");  
                    }  
                });

十一.包裝類

基本數(shù)據(jù)類型 對應(yīng)的包裝類
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
boolean Boolean

裝箱:int m = 500; Integer iobj = new Integer(m);

拆箱:Integer x = 5;double d = x.doubleValue();

字符串轉(zhuǎn)指定類型:int m = Integer.parseInt("123");

指定類型轉(zhuǎn)字符串:int m = 500;String s = Integer.toString(m);

自動裝箱和拆箱:Integer obj = m; int n = obj;

獲取類型信息:Integer.MIN_VALUE;Integer.MAX_VALUE;

十二.時間日期DATE

類庫:java.util.Date

創(chuàng)建對象:

以當(dāng)前時間創(chuàng)建:new Date()

指定毫秒數(shù)創(chuàng)建:new Date(long millisec)

比較時間先后:

boolean after(Date date)

boolean before(Date date)

int compareTo(Date date)

設(shè)置和獲取毫秒:

long getTime( )

void setTime(long time)

輸出:String toString( )

十三.數(shù)學(xué)計(jì)算

Math類:類中僅有靜態(tài)變量和靜態(tài)方法

Math.PI:π

算數(shù)運(yùn)算:

兩數(shù)最小值:T min(T,T)

兩數(shù)最大值:T max(T,T)

絕對值:T abs(T)

冪次方運(yùn)算a^b:Math.pow(a, b)

進(jìn)位:

向上取整:double Math.ceil(float/double)

向下取整:double Math.floor(float/double)

返回最接近的整數(shù)值:double Math.rint(double d)

四舍五入:long round(double d);int round(float f)

隨機(jī)數(shù)[0, 1)范圍:double Math.random()

十四.格式化

抽象父類

父抽象類:java.text.Format

將對象格式化為字符串:format(Object obj, StringBuffer toAppendTo, FieldPosition pos)

將字符串反格式為對象:parseObject(String source, ParsePosition pos)

時間日期

抽象類:java.text.DateFormat

提供工廠方法以使用:

1.getDateInstance()輸出樣式:2015-12-10

2.getDateTimeInstance()輸出樣式:2015-12-10 10:21:41

3.getTimeInstance()輸出樣式:10:21:41

4.getInstance()輸出樣式:15-12-10 上午10:21

Date date = new Date();
DateFormat df1 = DateFormat.getInstance();
System.out.println(df1.format(date));
具體類java.text.SimpleDateFormat
字母 日期或時間元素 表示 示例
G Era 標(biāo)志符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周數(shù) Number 27
W 月份中的周數(shù) Number 2
D 年中的天數(shù) Number 189
d 月份中的天數(shù) Number 10
F 月份中的星期 Number 2
E 星期中的天數(shù) Text Tuesday; Tue
a Am/pm Text PM
H 一天中的小時數(shù)(0-23) Number 0
k 一天中的小時數(shù)(1-24) Number 24
K am/pm 中的小時數(shù)(0-11) Number 0
h am/pm 中的小時數(shù)(1-12) Number 12
m 小時中的分鐘數(shù) Number 30
s 分鐘中的秒數(shù) Number 55
S 毫秒數(shù) Number 978
z 時區(qū) General time zone Pacific Standard Time; PST; GMT-08:00
Z 時區(qū) RFC 822 time zone -0800
Date d = new Date();
/* h 1-12輸出格式: 2017-04-16 01:01:22 */
DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(format1.format(d));

數(shù)值格式化

抽象父類:java.text.NumberFormat

同樣使用工廠方法構(gòu)建對象:

1.getCurrencyInstance()方法砸烦,根據(jù)當(dāng)前語言環(huán)境獲取貨幣數(shù)值格式。傳遞Locale對象可以獲取指定語言環(huán)境下的貨幣數(shù)值格式绞吁。

2.getInstance()getNumberInstance()方法都會獲取到常規(guī)數(shù)值格式

3.getIntegerInstance()方法獲取常規(guī)整數(shù)值格式幢痘,如果需要格式化的數(shù)值為小數(shù),則會將數(shù)值四舍五入為最接近的整數(shù)

4.getPercentInstance()方法獲取百分比的數(shù)值格式

具體子類:java.text.DecimalFormat

可在創(chuàng)建對象時指定格式

DecimalFormat format2 = new DecimalFormat("##.##");

符號 含義
0 表示一個數(shù)字家破,被格式化數(shù)值不夠的位數(shù)會補(bǔ)0
# 表示一個數(shù)字颜说,被格式化數(shù)值不夠的位數(shù)會忽略
. 小數(shù)點(diǎn)分隔符的占位符
, 分組分隔符的占位符
- 缺省負(fù)數(shù)前綴
% 將數(shù)值乘以100并顯示為百分?jǐn)?shù)
\u2030 將數(shù)值乘以1000并顯示為千分?jǐn)?shù)

也可創(chuàng)建對象后使用函數(shù)進(jìn)行設(shè)置

setMaximumFractionDigits(int newValue)方法购岗,設(shè)置小數(shù)部分中允許的最大數(shù)字位數(shù)

setMinimumFractionDigits(int newValue)方法,設(shè)置小數(shù)部分中允許的最小數(shù)字位數(shù)门粪,如果原數(shù)小數(shù)

位數(shù)不夠的話喊积,會補(bǔ)零。

對于數(shù)值的整數(shù)部分玄妈,默認(rèn)3個數(shù)字為一組進(jìn)行顯示砰逻,同樣對此我們也可以自定義谆棱,使用setGroupingSize(int i)方法追他,設(shè)置分組中一組的位數(shù)震捣。

setGroupingUsed(boolean value)方法設(shè)置是否使用分組,true表示使用酝锅,false表示取消分組

setMaximumIntegerDigits(int newValue)方法設(shè)置整數(shù)部分允許的最大數(shù)字位數(shù)

setMinimumIntegerDigits(int newValue)方法設(shè)置整數(shù)部分允許的最小數(shù)字位數(shù)

DecimalFormat format3 = new DecimalFormat("0000.00");
System.out.println(format3.format(12.345));//輸出0012.35
具體子類:java.text.ChoiceFormat

實(shí)例:數(shù)字與字符串?dāng)?shù)組對應(yīng)诡必,類似枚舉

double[] limits = { 3, 4, 5, 6, 7, 8, 9 };
String[] formats = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
ChoiceFormat format = new ChoiceFormat(limits, formats);
System.out.println(format.format(2.5));//將會輸出"星期一"
/**3.6介于3和4之間,所以會匹配3屈张,又由于3在limits數(shù)組中的索引是0擒权,所以會在formats數(shù)組徐照索引0的值,即輸出"星期一"
*/
System.out.println(format.format(3.6));

常用函數(shù):主要為區(qū)間函數(shù)

1.nextDouble(double d)靜態(tài)方法查找大于d的最小double值阁谆,用在limits數(shù)組中碳抄,從而使limits數(shù)組形成一個右開區(qū)間數(shù)組,例如 limits = {0,1,ChoiceFormat.nextDouble(1)}

2.nextDouble(double d, boolean positive)靜態(tài)方法场绿,如果positive參數(shù)為true剖效,表示查找大于d的最小double值;如果positive參數(shù)為false焰盗,表示查找小于d的最大double值璧尸,這樣就可以使limits形成一個左開區(qū)間數(shù)組。

3.previousDouble(double d)靜態(tài)方法熬拒,查找小于d的最大double值

同樣可以在創(chuàng)建時指定格式:

ChoiceFormat cf = new ChoiceFormat("1#is 1 | 1<is more than 1");
System.out.println(cf.format(1));//輸出"is 1"
System.out.println(cf.format(2));//輸出"is more than 1"
System.out.println(cf.format(0));//輸出"is 1"

消息格式化

具體類:java.text.MessageFormat

功能:將字符串按照指定格式拼接

條件:格式化字符串+對象數(shù)組

直接使用:String value = MessageFormat.format("oh, {0} is 'a' pig", "Spring");

兩個單引號才表示一個單引號:String value = MessageFormat.format("oh, {0} is ''a'' pig", "Spring");

單引號會使其后面的占位符均失效:MessageFormat.format("'{0}{1}", 1, 2); // 結(jié)果{0}{1}

無論是有引號字符串還是無引號字符串爷光,左花括號都是不支持的,應(yīng)使用單引號包圍:'{'

創(chuàng)建對象后使用:

MessageFormat temp = new MessageFormat(pattern);

temp.format(arrays);

十五.格式化字符串

參考資料:Java魔法堂:String.format詳解

重載方法:

使用當(dāng)前本地區(qū)域?qū)ο筮M(jìn)行格式化:String String.format(String fmt, Object... args);

自定義本地區(qū)域?qū)ο蟾袷交址?code>String String.format(Locale locale, String fmt, Object... args);

編寫格式:%[argument_index$][flags][width][.precision]conversion

argument_index指定參數(shù)列表位置:`String.format("%2s and %1$s", "A", "B");//B and A`

flag 輸出格式字符:String.format("%,09d", -3872);//-0003,872

width 最小寬度:十進(jìn)制整數(shù)

.precision 限制字符數(shù)(精度):十進(jìn)制整數(shù)

conversion 轉(zhuǎn)化類型:%s,%d,%f

特殊轉(zhuǎn)換符:

b(布爾類型)澎粟、n(換行)蛀序、%(百分號)

字符、字符串

格式化:%[index$][標(biāo)識][最小寬度]轉(zhuǎn)換符

轉(zhuǎn)換符:字符串s活烙、字符c

標(biāo)識符:左對齊徐裸,右邊以空格補(bǔ)充 -

例子:String.format("%-7s", "hmc")

整數(shù)

格式化:%[index$][標(biāo)識]*[最小寬度]轉(zhuǎn)換符

轉(zhuǎn)換符:d(十進(jìn)制整數(shù))、x(十六進(jìn)制整數(shù))啸盏、o(八進(jìn)制整數(shù))

標(biāo)識:

-(在最小寬度內(nèi)左對齊,不可以與0標(biāo)識一起使用)重贺、0(若內(nèi)容長度不足最小寬度,則在左邊用0來填充)

,對8進(jìn)制和16進(jìn)制气笙,8進(jìn)制前添加一個0,16進(jìn)制前添加0x次企。

+(結(jié)果總包含一個+或-號)、空格(正數(shù)前加空格健民,負(fù)數(shù)前加-號)
,抒巢,只用與十進(jìn)制贫贝,每3位數(shù)字間用,分隔秉犹。
(,若結(jié)果為負(fù)數(shù)稚晚,則用括號括住崇堵,且不顯示符號。

例子:String.format("%(,d",-1000)//(1,000)

浮點(diǎn)數(shù)

格式化:%[index$][標(biāo)識]*[最小寬度][.精度]轉(zhuǎn)換符

轉(zhuǎn)換符:

f客燕,(十進(jìn)制浮點(diǎn)數(shù)鸳劳,顯示9位有效數(shù)字,且會進(jìn)行四舍五入也搓。)
a赏廓,浮點(diǎn)數(shù)型(十六進(jìn)制)。
e傍妒,指數(shù)類型幔摸。如9.38e+5。
g颤练,浮點(diǎn)數(shù)型(比%f既忆,%a長度短些,顯示6位有效數(shù)字嗦玖,且會進(jìn)行四舍五入)

標(biāo)識符同整數(shù)

時間日期

格式化:%[index$]t轉(zhuǎn)換符

時間轉(zhuǎn)化符:

H, 24小時制的小時(不足兩位補(bǔ)零)
k, 24小時制的小時(不足兩位不補(bǔ)零)
I, 12小時制的小時(不足兩位補(bǔ)零)
i, 12小時制的小時(不足兩位不補(bǔ)零)
M, 分鐘(不足兩位補(bǔ)零)
S, 秒(不足兩位補(bǔ)零)
L, 毫秒(不足三位補(bǔ)零)
N, 毫秒(不足9位補(bǔ)零)
p, 小寫字母的上午或下午標(biāo)記患雇,如中文為“下午”,英文為pm
z, 相對于GMT的時區(qū)偏移量宇挫,如+0800
Z, 時區(qū)縮寫苛吱,如CST
s, 自1970-1-1 00:00:00起經(jīng)過的秒數(shù)
Q, 自1970-1-1 00:00:00起經(jīng)過的豪秒

日期轉(zhuǎn)化符:

c,星期六 十月 27 14:21:20 CST 2007
F器瘪,2007-10-27
D翠储,10/27/07
r,02:25:51 下午
T娱局,14:28:16
R彰亥,14:28
b, 月份簡稱
B, 月份全稱
a, 星期簡稱
A, 星期全稱
C, 年前兩位(不足兩位補(bǔ)零)
y, 年后兩位(不足兩位補(bǔ)零)
j, 當(dāng)年的第幾天
m, 月份(不足兩位補(bǔ)零)
d, 日期(不足兩位補(bǔ)零)
e, 日期(不足兩位不補(bǔ)零)

十六.集合

類結(jié)構(gòu)

Collection(接口)/
    set(接口)/
        HashSet(具體類)
        LinkedHashSet(具體類)
        SortedSet(接口)/
            TreeSet(具體類)
    List(接口)/
        ArrayList(具體類)
        Vector(具體類)
        LinkedList(具體類)①
    Queue(接口)/
        LinkedList(具體類)①
        PriorityQueue(具體類)
Map(接口)/
    HashTable(具體類)
    LinkedHashMap(具體類)
    HashMap(具體類)
    SortedMap(接口)/
        TreeMap(具體類)

集合工具類

Collection

方法 描述
copy 列表間復(fù)制
max、mix 最大衰齐、最小元素
sort 排序

Arrays

方法 描述
binarySearch 二分查找
copyOf 復(fù)制
copyOfRange 指定范圍復(fù)制
sort 排序
asList 參數(shù)轉(zhuǎn)列表

視圖

定義:具有限制的集合對象

Test[] tests = new Test[10];
List<Test> testList = Arrays.asList(tests);

具有訪問數(shù)組元素set任斋,get的方法。但是如果調(diào)用改變數(shù)組的方法就會拋出異常。所以可以說視圖對象可以說是具有限制的集合對象废酷。

十七.異常

類結(jié)構(gòu)

Throwable/
    Error(錯誤瘟檩,無法再程序中處理)
    Exception(意外)/
        IOException/
            EOFException
            FileNotFoundException
            MalformedURLException
            UnknownHostException
        ClassNotFoundException
        CloneNotSupportedException
        RuntimeException/
            ArithmeticException
            ClassCastException
            IllegalArgumentException
            IllegalStateException
            IndexOutOfBoundsException
            NoSuchElementException
            NullPointerException

異常的操作

異常處理 自定義異常類 主動拋出異常 finaly語句
catch語句 繼承于Exception類 本函數(shù)不處理異常,拋出異常給外層函數(shù) 覆蓋返回語句
依次匹配處理 實(shí)現(xiàn)方法:getMessage(); 直接拋出異常:throw 對象

十八.IO流管理

類結(jié)構(gòu)圖

[圖片上傳失敗...(image-335ddc-1556974885379)]

分類說明

File類 RandomAccessFile PrintStream 緩沖讀與Scanner 序列化
提供文件相關(guān)信息澈蟆,文件名屬性 隨機(jī)訪問文件位置 包含System.in墨辛、System.out、System.err Scanner不需要顯式的處理錯誤趴俘,而緩沖流需要 implements Serializable
查詢操作睹簇、目錄操作 重定向:①新建一個對象 ②setIn、setOut寥闪、setErr函數(shù) 不是繼承關(guān)系 不需要實(shí)現(xiàn)函數(shù)

文件類函數(shù)

復(fù)制太惠、移動和刪除 獲取文件信息 文件加鎖機(jī)制
Files.copy(fromPath,toPath) exists FileLock lock()
Files.move(fromPath,toPath) isHidden FileLock tryLock()
Files.delete(path) isReadable、isWritable... void close():釋放鎖

迭代目錄中的文件:

try(DirectoryStream<Path> entries = Files.newDirectoryStream(dir)){
    for(Path entry:entries)
        Process entries
}

十九.反射

參考: Java基礎(chǔ)之—反射(非常重要)

前提:擁有字節(jié)碼(.class)

定義:在運(yùn)行過程中獲取和使用類疲憋,例如構(gòu)造出一個類凿渊、提取類成員變量、運(yùn)行成員函數(shù)缚柳。

Java中實(shí)現(xiàn)反射的類:

java.lang.Class;                
java.lang.reflect.Constructor;  
java.lang.reflect.Field;        
java.lang.reflect.Method;
java.lang.reflect.Modifier;

獲取class對象

①Object.getClass()  
②對象.class //屬性
③class.forName()

構(gòu)造方法

// 獲取批量的方法:
public Constructor[] getConstructors()
所有"公有的"構(gòu)造方法
public Constructor[] getDeclaredConstructors()
獲取所有的構(gòu)造方法(包括私有埃脏、受保護(hù)、默認(rèn)秋忙、公有)

//獲取單個的方法:
public Constructor getConstructor(Class... parameterTypes
獲取單個的"公有的"構(gòu)造方法:
public Constructor getDeclaredConstructor(Class... parameterTypes)
獲取"某個構(gòu)造方法"可以是私有的彩掐,或受保護(hù)、默認(rèn)翰绊、公有

//調(diào)用構(gòu)造方法:
Constructor-->newInstance(Object... initargs)

獲取類成員變量

// 批量的
Field[] getFields()
獲取所有的"公有字段"
Field[] getDeclaredFields()
獲取所有字段佩谷,包括:私有、受保護(hù)监嗜、默認(rèn)谐檀、公有;

// 獲取單個的:
public Field getField(String fieldName)
獲取某個"公有的"字段裁奇;
public Field getDeclaredField(String fieldName)
獲取某個字段(可以是私有的)

// 設(shè)置字段的值:
Field --> public void set(Object obj,Object value):
// 參數(shù)說明:
// 1.obj:要設(shè)置的字段所在的對象桐猬;
// 2.value:要為字段設(shè)置的值;
// 3.本身是要修改的成員變量

成員方法

// 批量的:
public Method[] getMethods()
獲取所有"公有方法"刽肠;(包含了父類的方法也包含Object類)
public Method[] getDeclaredMethods()
獲取所有的成員方法溃肪,包括私有的(不包括繼承的)
// 獲取單個的:
public Method getMethod(String name,Class<?>... parameterTypes)
// 參數(shù):
// name : 方法名;
// Class ... : 形參的Class類型對象

public Method getDeclaredMethod(String name,Class<?>... parameterTypes)

// 調(diào)用方法:
Method --> public Object invoke(Object obj,Object... args)
// 參數(shù)說明:
// obj : 要調(diào)用方法的對象音五;
// args:調(diào)用方式時所傳遞的實(shí)參惫撰;

二十.枚舉

本質(zhì)

class MyEnum {
    public static final int 變量名 = 0;
    public static final int 變量名 = 1;
    ......
    初始化所有對象,并加入列表
}

使用枚舉組織接口

public interface Food {  
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
}  

二十一.泛型

參考: Java 泛型躺涝,你了解類型擦除嗎厨钻?

泛型類

public class MultiType <E,T>{
    E value1;
    T value2;

    public E getValue1(){
        return value1;
    }

    public T getValue2(){
        return value2;
    }
}

MultiType<int,String> hmc = new MultiType<>();

泛型方法

public class Test1<T>{

    public  void testMethod(T t){
        System.out.println(t.getClass().getName());
    }
    public  <E> E testMethod1(E e){
        return e;
    }
}

// 測試方法
Test1<String> t = new Test1();
t.testMethod("generic");
Integer i = t.testMethod1(new Integer(1));

泛型接口

同“類”
public interface Iterable<T> {
}

通配符

<?>無限定通配符

只能調(diào)用 Collection 中與類型無關(guān)的方法

<?> 提供了只讀的功能,也就是它刪減了增加具體類型元素的能力,只保留與具體類型無關(guān)的功能夯膀。它不管裝載在這個容器內(nèi)的元素是什么類型诗充,它只關(guān)心元素的數(shù)量、容器是否為空
<? extends T>有上限的通配符
public void testSub(Collection<? extends Base> para){
}

// 以下不通過
para.add(new Sub());
para.add(new Base());

① 接受Base和其子類
② 依舊只讀
③ 明確了范圍

<? super T>有下限的通配符
public void testSuper(Collection<? super Sub> para){
}
1
2
// <? super T> 神奇的地方在于诱建,它擁有一定程度的寫操作的能力蝴蜓。

public void testSuper(Collection<? super Sub> para){
    para.add(new Sub());//編譯通過
    para.add(new Base());//編譯不通過
}

類型擦除

定義:泛型信息只存在于代碼編譯階段,在進(jìn)入 JVM 之前俺猿,與泛型相關(guān)的信息會被擦除掉茎匠,專業(yè)術(shù)語叫做類型擦除

① 一般情況下,泛型在jvm中被轉(zhuǎn)換為Object辜荠。
② 在使用<? extends xxx>的情況下汽抚,轉(zhuǎn)換成xxx。

與反射結(jié)合

無法通過編譯的操作

List<Integer> ls = new ArrayList<>();
ls.add(23);
ls.add("text");     //錯誤

顯然list被指定為int,無法添加字符串伯病。

但是,通過類型擦除否过,能在運(yùn)行階段添加到Object中午笛。

public class ToolTest {


    public static void main(String[] args) {
        List<Integer> ls = new ArrayList<>();
        ls.add(23);
//      ls.add("text");
        try {
            Method method = ls.getClass().getDeclaredMethod("add",Object.class);

            // 通過反射,強(qiáng)行添加
            method.invoke(ls,"test");
            method.invoke(ls,42.9f);
        } catch Exception e{
        }
    }
}

二十二.線程

參考:Java多線程學(xué)習(xí)(吐血超詳細(xì)總結(jié))

實(shí)現(xiàn) 同步 阻塞隊(duì)列 線程安全集合
繼承Thread 鎖:Rentrantluh類+synchronized關(guān)鍵字 BlockingQueue 包:java.util.concurrent
Runnable接口 監(jiān)視器
volatliet域

二十三.網(wǎng)絡(luò)編程

Socket客戶端

import java.net.*;
import java.io.*;
public class GreetingClient{
    public static void main(String [] args){
        String serverName = args[0];
        int port = Integer.parseInt(args[1]);
        try{
            System.out.println("連接到主機(jī):" + serverName + " 苗桂,端口號:" + port);
            Socket client = new Socket(serverName, port);
            System.out.println("遠(yuǎn)程主機(jī)地址:" + client.getRemoteSocketAddress());
            OutputStream outToServer = client.getOutputStream();
            DataOutputStream out = new DataOutputStream(outToServer);
            out.writeUTF("Hello from " + client.getLocalSocketAddress());
            InputStream inFromServer = client.getInputStream();
            DataInputStream in = new DataInputStream(inFromServer);
            System.out.println("服務(wù)器響應(yīng): " + in.readUTF());
            client.close();
        }
        catch(IOException e){
                e.printStackTrace();
        }
    }
}

Socket服務(wù)器

import java.net.*;
import java.io.*;
public class GreetingServer extends Thread {
    private ServerSocket serverSocket;
    public GreetingServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        serverSocket.setSoTimeout(10000);
    }
    public void run() {
        while(true) {
            try {
                System.out.println("等待遠(yuǎn)程連接药磺,端口號為:" + serverSocket.getLocalPort() + "...");
                Socket server = serverSocket.accept();
                System.out.println("遠(yuǎn)程主機(jī)地址:" + server.getRemoteSocketAddress());
                DataInputStream in = new DataInputStream(server.getInputStream());
                System.out.println(in.readUTF());
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                out.writeUTF("謝謝連接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
                server.close();
            }catch(SocketTimeoutException s) {
                System.out.println("Socket timed out!");
                break;
            }catch(IOException e) {
                e.printStackTrace();
                break;
            }
        }
    }
    public static void main(String [] args) {
        int port = Integer.parseInt(args[0]);
        try {
            Thread t = new GreetingServer(port);
            t.run();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

連接特征

多連接 半關(guān)閉 獲取Web資源
多線程技術(shù)vo void shutdownOutput() URL類:web信息
原始線程一直接收請求 void shuwdownInput() URLConnection類,獲取網(wǎng)頁資源
不斷新建線程處理請求 boolean isOutputShutdown() //另有對應(yīng)的

URL類例子

import java.net.*;
import java.io.*;
public class URLDemo{
    public static void main(String [] args){
        try{
            URL url = new URL("http://www.runoob.com/index.html?language=cn#j2se");
            System.out.println("URL 為:" + url.toString());
            System.out.println("協(xié)議為:" + url.getProtocol());
            System.out.println("驗(yàn)證信息:" + url.getAuthority());
            System.out.println("文件名及請求參數(shù):" + url.getFile());
            System.out.println("主機(jī)名:" + url.getHost());
            System.out.println("路徑:" + url.getPath());
            System.out.println("端口:" + url.getPort());
            System.out.println("默認(rèn)端口:" + url.getDefaultPort());
            System.out.println("請求參數(shù):" + url.getQuery());
            System.out.println("定位位置:" + url.getRef());
        }catch(IOException e){
                e.printStackTrace();
            }
        }
    }

發(fā)送表單和發(fā)送E-Mail

發(fā)送表單

發(fā)送郵件

二十四.數(shù)據(jù)庫編程

一個簡單應(yīng)用

import java.sql.*;
 
public class MySQLDemo {
 
    // JDBC 驅(qū)動名及數(shù)據(jù)庫 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
 
    // 數(shù)據(jù)庫的用戶名與密碼,需要根據(jù)自己的設(shè)置
    static final String USER = "root";
    static final String PASS = "123456";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            // 注冊 JDBC 驅(qū)動
            Class.forName("com.mysql.jdbc.Driver");
        
            // 打開鏈接
            System.out.println("連接數(shù)據(jù)庫...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 執(zhí)行查詢
            System.out.println(" 實(shí)例化Statement對象...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, name, url FROM websites";
            ResultSet rs = stmt.executeQuery(sql);
        
            // 展開結(jié)果集數(shù)據(jù)庫
            while(rs.next()){
                // 通過字段檢索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("url");
    
                // 輸出數(shù)據(jù)
                System.out.print("ID: " + id);
                System.out.print(", 站點(diǎn)名稱: " + name);
                System.out.print(", 站點(diǎn) URL: " + url);
                System.out.print("\n");
            }
            // 完成后關(guān)閉
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 處理 JDBC 錯誤
            se.printStackTrace();
        }catch(Exception e){
            // 處理 Class.forName 錯誤
            e.printStackTrace();
        }finally{
            // 關(guān)閉資源
            try{
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
            }// 什么都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}

JDBC特性

預(yù)備語句(語句拼接) 讀寫大對象 轉(zhuǎn)義功能
String sql=“...”,中間變量以煤伟?號表示 二進(jìn)制大對象:BLOB癌佩、字符型:CLOB 時間日期:d/t/ts
PreparedStatement stat = conn.prepareStatement(sql); 獲取:getBlob/Clob 標(biāo)量函數(shù):{fn user()}
stat.setString(1,publisher) //1表示第幾個位置,publisher為變量 生成新對象再寫入:connection.createBlob/Clob like子句中‘_’需要使用‘!_’轉(zhuǎn)義

結(jié)果集

多結(jié)果集 可滾動和可更新
使用stat.execute(command)查詢 Statement stat = conn.createStatement(type,concurrency)
getResultSet(),獲取第一個結(jié)果集 TYPE值:TYPE_SCROLL_INSENSITIVE(可滾動不敏感)便锨、去掉IN即敏感
重復(fù)調(diào)用getMoreResults(),isResult判斷條件 Concurrentcy值:CONCUR_UPDATABLE,結(jié)果集用于更新數(shù)據(jù)庫

行集和元數(shù)據(jù)(數(shù)據(jù)庫結(jié)構(gòu))

行集
行集分類 新建和填充crs crs操作
CachedRowset:緩存行集 新建:RowSetFactory factory = RowSetProvider.newFactory();CachedRowSet crs = factory.createCachedRowSet(); 設(shè)置大形д蕖:crs.setPageSize(int);
WebRowset:可以移動到Web應(yīng)用的其它層中 從結(jié)果集填充:crs.populate(result); 下一頁:crs.nextPage()
JdbcRowset:一個瘦包裝器,能將結(jié)果轉(zhuǎn)化為bean 自動查詢:crs.set數(shù)據(jù)庫信息和查詢語句,crs.execute()查詢 寫回?cái)?shù)據(jù)庫:crs.acceptChanges(conn);
元數(shù)據(jù)
數(shù)據(jù)庫結(jié)構(gòu) 結(jié)果集結(jié)構(gòu)
ResultSet getTables():獲取所有表信息 ResultSetMetaDate getMetaDate():獲取結(jié)果集信息

事務(wù)

將一組語句組成一個事物,便于保護(hù)數(shù)據(jù)完整性

簡單事務(wù)
conn.setAutoCommit(false);      //取消一句一提交
Statement stat = conn.createStatement();
stat.executeUpdate(command1);
...
stat.executeUpdate(commandn);
conn.commit();      
conn.rollback();        //出現(xiàn)錯誤則自動撤銷
保存點(diǎn)(不撤銷到事務(wù)開頭)
Savepoint svpt = conn.setSavepoint();   //新建中斷點(diǎn)
conn.releaseSavepoint(svpt);            //釋放中斷點(diǎn)
批量更新
Statment stat = conn.createStatement();
String command = "xxx";
stat.addBatch(command);                 //添加命令
int[] counts = stat.executeBatch();     //批量提交

二十五.函數(shù)接口(lambda)

要求:

函數(shù)式接口放案,接口里抽象方法只能有一個姚建。

匿名類:
new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("Before Java8, too much code for too little to do");
    }
}).start();
使用lambda:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();

二十六.代理類

參考: 代理模式及JDK動態(tài)代理(InvocationHandler)的簡單實(shí)現(xiàn)與分析

結(jié)構(gòu)圖:

[圖片上傳失敗...(image-5a0326-1556974885379)]

原理:Interface InvocationHandler (阻礙器)

該接口中僅定義了一個方法:
public Object invoke(Object obj, Method method, Object[] args),在使用時吱殉,第一個參數(shù)obj一般是指代理類掸冤,method是被代理的方法,args為該方法的參數(shù)數(shù)組友雳。這個抽象方法在代理類中動態(tài)實(shí)現(xiàn)稿湿。

Proxy
該類即為動態(tài)代理類
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h),返回代理類的一個實(shí)例押赊,返回后的代理類可以當(dāng)作被代理類使用饺藤。

二十七.日志(輸出控制)

參考:Java日志 (zhuan)

最簡單的等級控制

public class Test {
    public static void main(String[] args) {
        // 獲取對象
        Logger logger = Logger.getLogger("logger");
        // 發(fā)送消息
        logger.info("hello world");
        // 設(shè)置日志輸出等級
        logger.setLevel(Level.INFO);
        // 測試兩個等級
        logger.log(Level.WARNING, "hello world1");
        logger.log(Level.FINE,"hello world2");
        // 再次發(fā)送消息
        logger.info("hello world3");
    }
}

輸出對象控制

Handle

Handler handler = new Handler() {
    @Override
    public void publish(LogRecord record) {
    }
    @Override
    public void flush() {
    }
    @Override
    public void close() throws SecurityException {
    }
}

控制輸出格式

setFormatter

handler.setFormatter(new Formatter() {
    @Override
    public String format(LogRecord record) {
        return null;
    }
});

二十八.本地化

語系管理

//構(gòu)造一個系統(tǒng)默認(rèn)的Locale
Locale defaultLocale = Locale.getDefault();

//獲取當(dāng)前Java虛擬機(jī)線程默認(rèn)的國家和語言信息
String country = defaultLocale.getCountry();//返回國家地區(qū)代碼
String language = defaultLocale.getLanguage();//返回國家的語言
String displayCountry = defaultLocale.getDisplayCountry();//返回適合向用戶顯示的國家信息
String displayLanaguage = defaultLocale.getDisplayLanaguage();//返回適合向用戶展示的語言信息
String displayName = defaultLocale.getDisplayName();//返回適合向用戶展示的語言環(huán)境名

//根據(jù)國家地區(qū)和語言構(gòu)造一個Locale(語言環(huán)境)
Locale currentLocale = new Locale(“zh”, ”CN”);

數(shù)字格式

Locale loc = new Locale("de","DE");
NumberFormat currFmt = NumberFormat.getCurrencyInstance(loc);
double amt = 123456.78;
String result = currFmt.format(amt);

日期和時間

 3 import java.text.DateFormat;
 4 import java.text.ParseException;
 5 import java.text.SimpleDateFormat;
 6 import java.util.Date;
 7 import java.util.Locale;
 8 
 9 public class TestSimpleDateFormat {
10     public static void main(String args[]) throws ParseException {
11         TestSimpleDateFormat test = new TestSimpleDateFormat();
12         test.testDateFormat();
13 
14     } 
15     
16     public void testDateFormat() throws ParseException {
17         //創(chuàng)建日期
18         Date date = new Date();
19         //創(chuàng)建不同的日期格式
20         DateFormat df1 = DateFormat.getInstance();
21         DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE");
22         DateFormat df3 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);     //產(chǎn)生一個指定國家指定長度的日期格式,長度不同,顯示的日期完整性也不同
23         DateFormat df4 = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒 EE", Locale.CHINA);
24         DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEEEE", Locale.US);
25         DateFormat df6 = new SimpleDateFormat("yyyy-MM-dd");
26         DateFormat df7 = new SimpleDateFormat("yyyy年MM月dd日");
27 
28         //將日期按照不同格式進(jìn)行輸出
29         System.out.println("-------將日期按照不同格式進(jìn)行輸出------");
30         System.out.println("按照J(rèn)ava默認(rèn)的日期格式策精,默認(rèn)的區(qū)域                      : " + df1.format(date));
31         System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE 舰始,系統(tǒng)默認(rèn)區(qū)域      :" + df2.format(date));
32         System.out.println("按照日期的FULL模式,區(qū)域設(shè)置為中文                      : " + df3.format(date));
33         System.out.println("按照指定格式 yyyy年MM月dd日 hh時mm分ss秒 EE 咽袜,區(qū)域?yàn)橹形?: " + df4.format(date));
34         System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE 丸卷,區(qū)域?yàn)槊绹?       : " + df5.format(date));
35         System.out.println("按照指定格式 yyyy-MM-dd ,系統(tǒng)默認(rèn)區(qū)域                  : " + df6.format(date));
36 
37         //將符合該格式的字符串轉(zhuǎn)換為日期询刹,若格式不相配谜嫉,則會出錯
38         Date date1 = df1.parse("07-11-30 下午2:32");
39         Date date2 = df2.parse("2007-11-30 02:51:07 星期五");
40         Date date3 = df3.parse("2007年11月30日 星期五");
41         Date date4 = df4.parse("2007年11月30日 02時51分18秒 星期五");
42         Date date5 = df5.parse("2007-11-30 02:51:18 Friday");
43         Date date6 = df6.parse("2007-11-30");
44 
45         System.out.println("-------輸出將字符串轉(zhuǎn)換為日期的結(jié)果------");
46         System.out.println(date1);
47         System.out.println(date2);
48         System.out.println(date3);
49         System.out.println(date4);
50         System.out.println(date5);
51         System.out.println(date6);
52     } 
53 }

資源包

ResourceBundle currentResources = ResourceBundle.getBundle(bundleName,currentLocale);

屬性文件(MyProgramStrings.properties):

computeButton=Rechnen

ResourceBundle bundle = ResourceBundle.getBundle("MyProgramStrings",locale);
String computeButtonLabel = bundle.getString("computeButton");

二十九.java虛擬機(jī)原理

[圖片上傳失敗...(image-a0be3b-1556974885379)]

棧和堆的對比
  1. 棧解決程序的運(yùn)行問題,即程序如何運(yùn)行凹联。
  2. 堆解決的是數(shù)據(jù)存儲問題沐兰,即數(shù)據(jù)怎么放。
  3. 堆中存的是對象的成員變量值蔽挠,棧中存的是基本數(shù)據(jù)類型和堆中對象的引用住闯。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市澳淑,隨后出現(xiàn)的幾起案子比原,更是在濱河造成了極大的恐慌,老刑警劉巖杠巡,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量窘,死亡現(xiàn)場離奇詭異,居然都是意外死亡氢拥,警方通過查閱死者的電腦和手機(jī)蚌铜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫩海,“玉大人冬殃,你說我怎么就攤上這事〕龈铮” “怎么了造壮?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骂束。 經(jīng)常有香客問我耳璧,道長,這世上最難降的妖魔是什么展箱? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任旨枯,我火速辦了婚禮,結(jié)果婚禮上混驰,老公的妹妹穿的比我還像新娘攀隔。我一直安慰自己皂贩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布昆汹。 她就那樣靜靜地躺著明刷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪满粗。 梳的紋絲不亂的頭發(fā)上辈末,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音映皆,去河邊找鬼挤聘。 笑死,一個胖子當(dāng)著我的面吹牛捅彻,可吹牛的內(nèi)容都是我干的组去。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼步淹,長吁一口氣:“原來是場噩夢啊……” “哼从隆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贤旷,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤广料,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幼驶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡韧衣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年盅藻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畅铭。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡氏淑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硕噩,到底是詐尸還是另有隱情假残,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布炉擅,位于F島的核電站辉懒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谍失。R本人自食惡果不足惜眶俩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望快鱼。 院中可真熱鬧颠印,春花似錦纲岭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钞楼,卻和暖如春喇闸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窿凤。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工仅偎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雳殊。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓橘沥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夯秃。 傳聞我的和親對象是個殘疾皇子座咆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

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