java高级

3.Object类

所有引用类型的父类,除了它自己以外

Object类是所有类的父类?  如果有其他明显正确的答案,不选它,如果没有就选它。

基本数据类型 byte short int long float double char boolean

引用数据类型 Object

当编写一个类的时候,如果没有写明继承哪个类,这个类就会默认继承Object类

在Object类中定义的方法都会被其他类继承

重要方法

(了解)hashCode() 方法:返回对象的hash值

每个对象在内存中都存在着一个hashcode作为编码出现

如果两个对象的hashcode不相等,这两个对象一定不是同一个对象

如果两个对象的hashcode相等,这两个对象也不一定是同一个对象

x = 0ad12

y = 032aa

z = 0ad12

x != y

y != z

x ? z

equals()方法:比较两个对象是否“相等”

Object o1 = new Object();

Object o2 = new Object();

o1 == o2  ?        false  引用类型中 == 判断的是内存地址是否一致

o1.equals(o2)  ?    false  相当于==

在Object类中 == 和 equals 方法是一回事

======================================================================

String str1 = new String("abc");

String str2 = new String("abc");

str1 == str2 ?  false  比较的是str1和str2的内存地址

toString() 方法:返回对象的字符串表达

返回对象的字符串表达


1.字符串类(重要)

String  字符串常量

String str1 = "abc";

String str2 = new String("abc");

== 比较的是字符串的内存地址

equals() 比较的是字符串的内容    参照图片理解

String str1 = new String();  //空字符串

String str2 = "";    //空字符串

String str3 = null;  //空值 null值

空字符串与null值不是一回事

空字符串表达了一个没有任何文字的字符串,它是一个对象,可以使用String类型属性和方法

null表示没有对象,它不能任何属性和方法

常用方法

int length()

          返回此字符串的长度。

String str1 = "abc";

String str2 = "";

String str3 = "哈哈";

String str4 = "abc哈哈xyz";

str1.length();  3

str2.length();  0

str3.length();  2

str4.length();  8

无论英文,数字,汉字。一个字符就是1个长度

String trim()

          返回字符串的副本,忽略前导空白和尾部空白。

String str = "  ab c  d ";

String str1 = str.trim();  ==>  ab c  d 没有前后的空格

char charAt(int index) 

返回index位置的字符。

在使用时index的值不能超过文字的index范围,

否则会报错java.lang.StringIndexOutOfBoundsException

String str = "abcdef";

char c = str.charAt(0);

boolean equalsIgnoreCase(String anotherString)

          比较两个字符串的内容,不考虑大小写。

String str1 = "abc";

String str2 = "ABC";

str1.equalsIgnoreCase(str2);  true

str1.equals(str2);            false

char[] toCharArray()

          将此字符串转换为一个新的字符数组。

String s = "abcxyz";

char[] c = s.toCharArray();

int indexOf(String str)

          返回指定参数字符串在此字符串中第一次出现的位置。

int lastIndexOf(String str)

          返回指定参数字符串在此字符串中最后一次出现的位置。

String s = "I LIKE GIRL";

int i = s.indexOf("I");  //字母I第一次出现的位置                0

int j = s.lastIndexOf("I"); //字母I最后一次出现的位置          8

int k = s.indexOf("LIKE");  //字符串LIKE第一次出现的位置        2

int m = s.lastIndexOf("LIKE");  //字符串LIKE最后一次出现的位置 2

int n = s.indexOf("HAHA");  //字符串HAHA第一次出现的位置        -1

boolean isEmpty()

          当且仅当 length()=0 时返回 true。 (判断字符串是否为空字符串)

等同于equals("")

等同于.length() == 0

String replaceAll(String regex, String replacement)

          使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

利用replacement字符串,替换原字符串中所有的regex内容

String str = "abchahasdfjsdlkfjkalsdxixiasdklfjlkasdhahah";

String nstr = str.replace("haha", "****"); //使用****替代元字符串中的haha

String[] split(String regex)

          根据给定正则表达式的匹配拆分此字符串。

根据参数来拆分原字符串,将元字符串变成一个数组

String s = "a,dx,s,xy,xaa,f,12,32,b,x";

String[] x = s.split(",");

得到{a,dx,s,xy,xaa,f,12,32,b,x}数组

String toUpperCase()

          使用默认语言环境的规则将此 String 中的所有字符都转换为大写。

String toLowerCase()

          使用默认语言环境的规则将此 String 中的所有字符都转换为小写。

String substring(int beginIndex)

截取字符串  从begin位置起,截取到字符串的结尾

String substring(int beginIndex, int endIndex)

截取字符串  从begin位置起,截取到end位置,不包括end  [begin,end)

String str = "I LIKE GIRL";

String s1 = str.substring(2);  //从下标2位置开始,截取到最后

System.out.println(s1);

String s2 = str.substring(2, 6); //[2,6)

System.out.println(s2);

------------------------------------------------------------

练习:在控制台上输入一个邮箱地址,判断邮箱地址是否合法

      1.邮箱的首字母不能是@,最后一个字符不能是.

      2.有且仅有一个@,有且仅有一个.

      3.@必须在.之前,且两者之间必须有其他字符

xxx@xx.xxx

StringBuffer  字符串变量

StringBuilder  字符串变量

字符串拼接操作时

  效率

String  <  StringBuffer < StringBuilder

StringBuffer与StringBuilder字符串拼接

append(xxx);    在字符串变量的结尾处拼接一个内容

toString();      将拼接后的字符串返回成String类型

StringBuffer sb = new StringBuffer();

for(int i = 0; i < 10; i++){

sb.append(i);

}

String str = sb.toString();

System.out.println(str);

面试题与笔试题(重点)

String与StringBuffer的区别?

  String是字符串常量,做字符串拼接时的效率很低

  StringBuffer是字符串变量,做字符串拼接时效率较高

StringBuffer与StringBuilder的区别?

  StringBuffer的方法是线程安全的,效率略低于StringBuilder

  StringBuilder的方法是线程不安全的,效率是最高的

  系统中不存在多线程的情况下,使用StringBuilder

StringBuffer和StringBuilder主要用在字符串拼接的场合

2.日期时间类(重要)

java.util.Date类

java.sql.Date类  它是java.util.Date类的子类,一般用于与数据库中的Date类型进行交互

日期与字符串的转换(常用)

SimpleDateFormat类

//练习:

Student类

学号 sno

姓名 sname

生日 birthday  java.util.Date

在控制台上提示用户依次输入sno,sname和birthday,并将用户输入的内容存入一个Student对象中

重写Student的toString

输出的格式  学号:1001,姓名:张三,生日:1999年12月12日

Calendar  日历类

提供各种日期和时间的计算,用于声明日期对象

日历类是一个抽象类,它的构造方法是protected权限,程序开发者编写的类是无法直接调用该构造方法的

//获得了一个表示系统当前时间的日历对象

Calendar cal = Calendar.getInstance();

Date getTime()

得到日历类表示时间对应的一个java.util.Date对象

将Calendar转换成表示同一时间的Date对象

void setTime(Date date)

设置日历类为某个日期

long getTimeInMillis()

得到时间的毫秒数

void setTimeInMillis(long l)

设置时间的毫秒数

int get(int field)  (重要)

根据field表示的字段,得到时间对应位置的值

Calendar cal = Calendar.getInstance();

int year  = cal.get(1);                  ==> 2018

    cal.get(Calendar.YEAR)

int month = cal.get(Calendar.MONTH)  ==>  0

field字段

Calendar.YEAR -- 年

Calendar.MONTH -- 月

Calendar.DAY_OF_MONTH  -- 日

Calendar.DAY_OF_WEEK  -- 星期

Calendar.DAY_OF_YEAR -- 年中的第几天

Calendar.HOUR

Calendar.HOUR_OF_DAY  小时

Calendar.MINUTE    分钟

Calendar.SECOND  秒

Calendar.MILLISECOND 毫秒

      void set(int field, int value) (重要)

为某个field字段 设置值

Calendar cal = Calendar.getInstance();

cal.set(Calendar.YEAR, 1998); //设置cal的年份为1998年

cal.set(Calendar.MONTH, 5); //设置cal的月份为6月

      void set(int year, int month, int date)

直接设置年月日

      void set(int year, int month, int date, int hourOfDay, int minute)

直接设置年月日小时分钟

      void set(int year, int month, int date, int hourOfDay, int minute, int second)

直接设置年月日时分秒

3.数学类

Math

E  自然对数的底数

PI  圆周率

abs(double|float|int|long a)  返回参数的绝对值

double d1 = Math.abs(8.0);  8.0

double d2 = Math.abs(-8.0);  8.0

cbrt(double a)  返回参数的立方根

double d1 = Math.cbrt(8.0);  2.0

sqrt(double a)  返回参数的平方根

double d1 = Math.sqrt(4.0);  2.0

ceil(double a)  进一法

double d1 = Math.ceil(8.1);  9

double d2 = Math.ceil(8.9);  9

floor(double a) 退一法

double d1 = Math.floor(8.1);  8

double d2 = Math.floor(8.9);  8

round(double a) 四舍五入

double d1 = Math.round(8.1);  8

double d2 = Math.round(8.9);  9

pow(double a, double b)

返回a的b次幂

double d1 = Math.pow(3,3);  27

double d2 = Math.pow(2,10);  1024

random()

返回[0,1)区间的随机浮点数

伪随机数:计算机生成的随机数都是伪随机数

有规律可循

Random

专门提供随机数生成的类

int nextInt(int n) 

随机生成[0,n)区间的随机整数

随机生成一个[3,10]区间的随机整数

[0,8)+3  => [3,10]

随机生成一个[a,b]区间的随机整数

[0,b-a+1)+a  = > [a,b]

-----------------------------------------------------------------------------

练习: 纸上写个4位不重复数字(0-9且不能出现重复)

1234   

猜: 3574      回答:1A1B    A表示猜中数字且位置正确    B表示猜中数字但位置不正确

猜: 9034      回答:2A0B

编写程序:

计算机随机生成1个4位不重复数字

循环以下内容,直到用户猜中,或者用户打出GG放弃(计算机要给出生成的数字)

控制台上提示用户输入数字

计算机根据用户输入的数字  反馈出回答

4.System类

System

System.out.println();  在控制台上输出内容,并在结尾处添加一个换行

System.out.print();  在控制台上输出内容, 结尾没有换行

System.arraycopy();  数组拷贝方法

System.currentTimeMillis();  得到当前系统时间的毫秒数

System.exit(int status); 关闭Java虚拟机,退出Java运行程序

0  -- 正常退出

-1 -- 异常退出

System.gc();  垃圾回收

Properties p = System.getProperties();

获得系统的一些属性信息

参照 API 文档

5.包装类

包装类的主要作用是体现基本数据类型在引用数据类型体系中的一种映射

某些场合只能使用引用数据类型(比如:泛型),如果程序逻辑上必须使用基本数据类型(比如:整数int)

这个时候我们需要使用int类型的包装类

byte      Byte

short      Short

int   Integer    (常用)

MAX_VALUE  int值的最大值

MIN_VALUE  int值的最小值

static int parseInt(String s)

将字符串s转换为整数,如果转换失败,则报出异常

long      Long      (常用)

float      Float

double    Double    (常用)

static double parseDouble(String s)

将字符串转换为浮点数

char   Character

boolean    Boolean

在JDK1.5版本后(含1.5)可以像使用基本数据类型一样,使用包装类

int i = 5;

Integer i = 5;

标准

  Integer i = new Integer(5);    使用包装类包装整数数值5

自动装箱(JDK1.5之后引入的概念)

  Integer i = 5;

自动拆箱(JDK1.5之后引入的概念)

  int j = 0;

  Integer i = 5;

  j = i;  //自动拆箱

类型转换

数字-字符串(掌握)

  int n = 35;

  String s = n+"";

字符串-数字(掌握)

  int i = Integer.parseInt("35");

日期-字符串(掌握)

  Date date = new Date();

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

  String str = sdf.format(date);

字符串-日期(掌握)

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

  Date birthday = null;

  try {

birthday = sdf.parse(b);

  } catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

  }

数字-日期(不常用)

  long l1 = 1234567

  Date d = new Date();

          d.setTime(l1);

日期-数字(不常用)

  Date d = new Date();

  long l1 = d.getTime();


集合(十分重要) 集合与数组的比较(为什么选择集合使用?)数组的特点:数组中的数据,类型必须统一数组是定长的,在创建数组对象时要给定长度,长度给定后不能再改。数组不能扩容(数组装满后,不能自动扩展长度,不能继续添加内容)集合的特点:集合中的数据,类型不必统一(集合中只能放引用数据类型(基本数据类型使用包装类)的数据) 一般会强制集合中的类型统一(泛型),方便集合的管理集合是变长的,一般集合在初始创建时不指名长度。 集合的长度是随着内容数量的变化而变化提供了大量的方法,处理集合内容的访问,追加,删除等基础操作真实的商业化项目中,使用频率集合 >> 数组 集合的分类线性集合:Collection接口(重要)List接口:有序(序号)可重复:可以通过下标访问元素,集合中可以出现重复的元素ArrayList实现类: 底层实现是基于数组 (日常编程中使用最多的)void add(Object o) 将元素o在集合的结尾处进行添加void add(int index, Object o) 将元素o在index位置进行添加Object get(int index) 得到集合中,index位置的元素void set(int index, Object o) 将元素o在index位置上替换原有元素boolean remove(int index) 移除index位置上的元素boolean remove(Object o) 移除集合中元素o(如有重复,只移除第1个)当index与o冲突时,优先移除index位置比如 remove(2) 如果有元素2,则优先移除下标2位置boolean contains(Object o) 查找元素o在集合中是否存在boolean isEmpty() 判断集合是否为空 等同于 size() == 0void clear() 清空集合创建new ArrayList(); 在内存中创建了一个长度是10的数组内容接近容量警戒时,数组x2扩容LinkedList实现类 底层实现基于链表拥有ArrayList实现类中上述方法,结果与ArrayList操作基本一致Vector实现类 底层实现基于数组拥有ArrayList实现类中上述方法,结果与ArrayList操作基本一致(重要)数组与链表的区别数组在内存中是连续分配的,其查找元素速度快,插入和删除元素速度慢链表在内存中是分散存储的,其查找元素速度慢,插入和删除元素速度快(重要)ArrayList与LinkedList的区别ArrayList是基于数组实现的,LinkedList是基于链表实现的数组与链表的区别ArrayList与Vector的区别ArrayList是线程不安全的,效率较高。Vector是线程安全的,效率较低-----------------------------------------------------------------------练习:创建Student对象学号 sno姓名 sname生日 birthday控制台上显示***************1-新增学生2-删除学生3-修改学生4-显示所有学生5-退出***************所有产生的学生对象,放入到List的集合中删除和修改 根据学号Set接口:无序(序号)不重复:不能通过下标访问元素,集合中不允许出现重的元素存放顺序:不是由程序开发者决定的,由具体实现类的算法实现的基于Hash表来维护顺序HashSet和LinkedHashSet基于二叉树维护顺序TreeSet迭代器: Iterator 迭代集合中的数据,尤其是用于Set集合和Map集合中不要求顺序的去重复List接口与Set接口的比较List接口:有序(序号)可重复:可以通过下标访问元素,集合中可以出现重复的元素主要实现类:ArrayList,LinkedList,VectorSet接口:无序(序号)不重复:不能通过下标访问元素,集合中不允许出现重的元素主要实现类:HashSet,LinkedHashSet,TreeSet Set集合的访问方式:迭代器键值集合:Map接口(重要)key和value两部分组成map.put(key,value): 向集合中存放一个键值对 如果key已经存在,则覆盖原有数据Object value = map.get(key): 根据key值取得对应的value Object value = map.remove(key): 根据key值移除对应的键值对,并返回它boolean containsKey(Object key) 某个key是否在集合中存在boolean containsValue(Object value) 某个value是否在集合中存在 boolean isEmpty() 是否为空集合int size() 集合的长度 Set keySet() 得到所有key值组成的set集合: 用于遍历map集合

主要实现类

HashMap,Hashtable,TreeMap

HashMap和TreeMap的区别:key值的存放顺序(与Set中的定义是一样)

面试问题:

Map接口与List接口(Collection接口)的区别

List接口:线性结构,一个节点存放一个数据

Map接口:键值对结构,一个节点可以存放key-value两个数据

HashMap与HashTable的区别

HashMap是线程不安全的,效率稍高

HashTable是线程安全的,效率稍低

    泛型

约束集合中的数据类型,保证集合中数据类型是一致

泛型带来的优势:

(1)保证数据类型一致,方便后续程序的处理和逻辑编写

(2)向集合中添加数据时,强力约束数据类型,保证数据准确和安全

(3)遍历或取得数据时,省略Object类型强制转换,提升效率

(4)可以使用for...each句式快速遍历集合

在声明集合时,在类名后的<>中写出泛型

=======================================================================================

周四的练习  改写为使用Map集合实现

key是学号

value是学生对象

要求使用泛型


文件与流

java.io包中提供了关于文件和流的大部分的类

文件类  java.io.File

操作系统中的文件和文件夹(不包括文件中内容)

  文件

主要方法

boolean exist();  测试文件或文件夹是否存在

boolean createNewFile(); 创建新的空文件

boolean delete();  删除文件

String getAbsolutePath();  得到文件的绝对路径

File getAbsoluteFile();  得到文件的绝对路径  使用File对象表示该路径

String getPath();  得到文件的路径(一般都是绝对路径)

String getName();  得到文件名(不包含目录)

String getParent() 得到完整目录(不包括文件名)

File getParentFile() 得到完整目录的File对象(不包括文件名)

long length();    得到文件的大小(单位是Byte字节)

辅助方法

boolean canExecute()  是否为可执行文件

boolean canRead()      文件是否可读

boolean canWrite()    文件是否可写

boolean setWritable(boolean writable)  设置文件是否为可写

练习:

c://1.gif.jpg  编写一个程序,得到该文件的扩展名

  文件夹

f.mkdir();  创建空的文件夹(只能创建最后一级目录,当出现多级目录(父级目录不存在)时,方法无效)

f.mkdirs();  创建空的文件夹,包含多级目录  推荐使用!!

在特定文件夹中创建文件的方法请参照com.demo.les03.Test3类

辅助方法

boolean isDirectory()  文件对象是否是一个文件夹

boolean isFile()    文件对象是否是一个文件

String[] list()    返回文件夹下包含的子文件和子文件夹  返回字符串数组

File[] listFiles()  返回文件夹下包含的子文件和子文件夹  File数组

-----------------------------------------------------------------------------------

在控制台上实现cmd的以下功能

dir  查看子目录和子文件

cd xxx  进入某个子目录

cd..  返回上一级目录

cd\    返回根目录

create xxx.jpg    在当前目录中新建xxx.jpg文件

delete xxx.jpg    在当前目录中删除xxx.jpg文件

流(Stream)类:在两种不同介质之间数据交互的一种形式。有人称之为“管道” 

流向分类:针对的目标是:内存(程序)

输入流

输出流

单位分类:

字节流:最小单位:byte

字符流:最小单位:char(2byte)

功能分类

原始流:基础的功能流

处理流:对原始流进行加强

类名的后缀

    输入流        输出流

字节流    InputStream    OutputStream

字符流    Reader        Writer

字节输入流的父类:InputStream  它的所有的子类命名都是XXXXXInputStream

其余的类似

字符流可以操作纯文本文件 txt

----------------------------------------------------------------

练习:

在C://1.txt文档中有一些英文字母(大小写都有)

找到其中出现次数最多的字母(a,A算一个字母)

asdklfjalLKDSAFJOISDJLjlksdjflkajoiwjlfkALKASDLFJLK

例子:利用程序 操作文件内容

原始流-提供了文件操作的相关方法

FileInputStream

FileOutputStream

FileReader

FileWriter

文件的复制

1.将被复制的文件一次性读取至内存,内存中向外输出。

文件过大,内存可能装不下

2.一边读,一边写(推荐)

保证使用较小内存,就可以复制较大的文件

功能分类

原始流:基础的功能流

处理流:对原始流进行加强

类名的前缀

Buffered    缓冲流  提供了缓冲区能够提升流的读写效率

Data        数据流  提供了从流中提取各种数据类型的方法

Object      序列化  提供了将对象直接序列化的相关方法

处理输出流

需要将内容从缓冲区中刷入实际位置

将之前控制台输入学生信息的练习

将学生信息保存到一个文本文件中  1.txt

1001,张三,1999-9-9

1002,赵四,1997-7-7

序列化与反序列化

将内存中的对象直接传输到其他介质中

ObjectInputStream  将对象从其他介质中读入到内存中  (反序列化)

ObjectOuputStream  将对象从内存传输到其他介质中    (序列化) 

被序列化对象的类必须实现接口java.io.Serializable

系统中常用的类基本都实现了该接口:

String,包装类,Date,集合....

使用了集合装对象,将集合序列化的办法,可以解决存放多个数据的问题

前提:集合中的对象必须实现java.io.Serializable接口

transient关键字,修饰属性

被该关键字修饰的属性,不参与序列化操作

------------------------------------------------------------

练习:昨天练习改写为使用序列化的方式,保存数据

-----------------------------------------------------------

多线程

单核CPU在同一时间只能处理一个进程

CPU的轮转时间片:

时间片:一小段时间

由于轮转的速度非常快,多个程序看起来就是同时运行的

进程:程序在系统中运行时的一个体现

线程:一个进程中“同时”执行的程序分支

Java中如何实现多线程?

两种

1.继承java.lang.Thread类,重写这个类的run方法

2.实现java.lang.Runnable接口, 并实现接口中的run方法

线程的启动方式

直接创建对象调用run方法,这种方式不是多线程的启动方式,与常规的方法调用一致

如果某个类继承了Thread类,通过start方法进行启动

如果某个类实现了Runnable接口,将对象交给一个启动线程Thread对象,启动Thread对象的start

MyThread2 mt2 = new MyThread2();

Thread t = new Thread(mt2);

t.start();

线程安全

当多个线程访问同一个资源时,有可能某个线程执行一半的情况下,让出了CPU的执行权,

下一轮时间片被其他线程抢走,造成了数据的不准确

synchronized:保证线程安全

同步方法  修饰方法,将方法变为同步方法:只能保证类内部资源的安全

同步块    在块中的代码,对于块声明的资源,进行锁定,保证线程安全

面试问题

线程实现的方式

1.继承java.lang.Thread类,重写这个类的run方法

2.实现java.lang.Runnable接口, 并实现接口中的run方法

应该使用哪种方式创建一个线程?

推荐使用第2种方式来创建线程,将继承的父类的位置留出来以防万一。

使用Runnable来创建线程,的启动方式?

MyRunnable m = new MyRunnable();

Thread t = new Thread(m);

t.start();

同步:线程安全,在同步块中的代码必须是一个线程完整执行后,才能继续下一次竞争。

同步:加锁。    理解为:线程锁定了CPU

死锁:多个共享资源A,B

      多个线程T1和T2

T1获得了A资源,请求B资源

T2获得了B资源,请求A资源

--------------------------------------------------------------------------

(选做)模拟三个面包师制作面包,面包的总数要求为30  (售票反过来做)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,602评论 18 399
  • Java 语言支持的类型分为两类:基本类型和引用类型。整型(byte 1, short 2, int 4, lon...
    xiaogmail阅读 1,346评论 0 10
  • 看着内容很简单,写起来却难难难。本来就很慢,现在因为监考又耽误了进度,使得本来就不近的山这下子更远了。 要是有哪吒...
    悠悠99阅读 297评论 0 0
  • 这首歌我听了很多遍,发现如果一个人在我眼里都是好说明这是喜欢,都是差这是陌路人,好坏交割才是爱。 那天朋友给我拉来...
    银色的光芒阅读 104评论 0 0
  • 心里在单独念叨抟扶摇羊角而上者九万里,然后就开始心生向往飘飘然,颇有种“做人也当如此”的感觉,然后,就放飞了字体…...
    抽烟喝酒看书阅读 226评论 0 0