Java 5 新特性
1. 泛型
泛型本质是参数化类型,解决不确定具体对象类型的问题。
List strList=new ArrayList();
2. 增强循环(for-each)
for-each循环简化了集合的遍历。
String [] str = {"关注","公众号","捡田螺的小男孩"};
for (String temp:str) {
System.out.println(temp);
}
3. 自动封箱拆箱自动装箱: 就是将基本数据类型自动转换成对应的包装类。
自动拆箱:就是将包装类自动转换成对应的基本数据类型。
包装类型有:Integer,Double,Float,Long,Short,Character和Boolean
Integer i =666; //自动装箱
int a= i; //自动拆箱
4. 枚举
关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这就是枚举类型。
enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
5. 可变参数
我们在定义方法参数的时候不确定定义多少个,就可以定义为「可变参数」,它本质上是一个「数组」。
public static void main(String[] args) throws Exception {
String [] str = {"关注","公众号","捡田螺的小男孩"};
testVarargs(str);
String str1 = "关注公众号,捡田螺的小男孩";
testVarargs(str1);
}
//可变参数String... args
private static void testVarargs(String... args) {
for (String arg : args) {
System.out.println(arg);
}
}
6. 注解
可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
7.静态导入
通过import static类,就可以使用类里的静态变量或方法。看一下例子哈~
import static java.lang.System.out; //静态导入System类的静态变量out
public class Test {
public static void main(String[] args) throws Exception {
String str1 = "关注公众号,捡田螺的小男孩";
System.out.println(str1); //常规写法
out.println(str1); //静态导入,可以直接使用out输出
}
}
8. 线程并发库(JUC)
JDK5 丰富了线程处理功能,java.util.concurrent包提供了以下的类、接口:❝线程池:ExecutorService接口
线程护斥:Lock 类
线程通信:Condition接口
同步队列:ArrayBlockingQueue类
同步集合:ConcurrentHashMap类❞
Java 6 新特性
1.Desktop类和SystemTray类
JDK 6在java.awt包下,新增了两个类:Desktop类和SystemTray类❝「Desktop类」: 用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端发邮件等
「SystemTray类」:用来在系统托盘区创建一个托盘程序,如果在微软的Windows上,它被称为“任务栏”状态区域。❞
//获取Desktop实例
Desktop desktop = Desktop.getDesktop();
desktop.browse(URI.create("https://www.baidu.com"));
2. 使用JAXB2来实现对象与XML之间的映射
JAXB,即Java Architecture for XML Binding,可以实现对象与XML之间的映射,常用注解如下:❝@XmlRootElement:注解在类上面,对应xml的跟元素,使用name属性定义根节点的名称。
@XmlElement:指定一个字段或get/set方法映射到xml的节点,使用name属性定义这个根节点的名称。
@XmlAttribute:将JavaBean对象的属性映射为xml的属性,使用name属性为生成的xml属性指定别名。
@XmlAccessorType:定义映射这个类中的何种类型都需要映射到xml。
@XmlSchema: 将包映射到XML名称空间❞
「看个例子吧~」
public class JAXB2XmlTest{
public static void main(String[] args) throws JAXBException, IOException{
List list = new ArrayList<>();
list.add(new Singer("jay", 8));
list.add(new Singer("eason", 10));
SingerList singerList = new SingerList();
singerList.setSingers(list);
String str = JAXB2XmlTest.beanToXml(singerList, SingerList.class);
String path = "C:\\jay.txt";
BufferedWriter bfw = new BufferedWriter(new FileWriter(new File(path)));
bfw.write(str);
bfw.close();
}
private static String beanToXml(Object obj, Class> load) throws JAXBException{
JAXBContext context = JAXBContext.newInstance(load);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
StringWriter writer = new StringWriter();
marshaller.marshal(obj,writer);
return writer.toString();
}
}
public class Singer{
private String name;
private int age;
public Singer(String name, int age){
this.name = name;
this.age = age;
}
@XmlAttribute(name="name")
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
@XmlAttribute(name="age")
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
@XmlRootElement(name="list")
public class SingerList{
private List singers;
@XmlElement(name="singer")
public List getSingers(){
return singers;
}
public void setSingers(List singers){
this.singers = singers;
}
}
「运行效果:」
3.轻量级 Http Server API
JDK 6中提供了简单的Http Server API,可以构建嵌入式Http服务器,同时支持Http和Https协议。HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,这里用户只需实现HttpHandler接口就可以了。
/**
* 根据Java提供的API实现Http服务器
*/
public class MyHttpServer{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException{
//创建HttpServer服务器
HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 10);
//将 /jay请求交给MyHandler处理器处理
httpServer.createContext("/", new MyHandler());
httpServer.start();
}
}
public class MyHandler implements HttpHandler {
public void handle(HttpExchange httpExchange) throws IOException {
//请求头
Headers headers = httpExchange.getRequestHeaders();
Set>> entries = headers.entrySet();
StringBuffer response = new StringBuffer();
for (Map.Entry> entry : entries){
response.append(entry.toString() + "\n");
}
//设置响应头属性及响应信息的长度
httpExchange.sendResponseHeaders(200, response.length());
//获得输出流
OutputStream os = httpExchange.getResponseBody();
os.write(response.toString().getBytes());
os.close();
}
}
4. 插入式注解处理API❝
JDK 6提供了插入式注解处理API,可以让我们定义的注解在编译期而不是运行期生效,从而可以在编译期修改字节码。lombok框架就是使用该特性来实现的,Lombok通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString等方法,大大简化了代码的开发。❞
5. STAX
STAX,是JDK6中一种处理XML文档的API。
public class STAXTest {
public static void main(String[] args) throws Exception{
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream("C:\\jay.xml"));
XMLEvent event = null;
StringBuffer stringBuffer = new StringBuffer();
while (xmlEventReader.hasNext()) {
event = xmlEventReader.nextEvent();
stringBuffer.append(event.toString());
}
System.out.println("xml文档解析结果:");
System.out.println(stringBuffer);
}
}
「运行结果:」
xml文档解析结果:
ENDDOCUMENT
6. Common Annotations❝
Common annotations原本是Java EE 5.0(JSR 244)规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中。随着Annotation元数据功能加入到Java SE 5.0里面,很多Java 技术都会用Annotation部分代替XML文件来配置运行参数。❞
以下列举Common Annotations 1.0里面的几个Annotations:@Generated:用于标注生成的源代码
@Resource: 用于标注所依赖的资源,容器据此注入外部资源依赖,有基于字段的注入和基于setter方法的注入两种方式 。
@Resources:同时标注多个外部依赖,容器会把所有这些外部依赖注入
@PostConstruct:标注当容器注入所有依赖之后运行的方法,用来进行依赖注入后的初始化工作,只有一个方法可以标注为PostConstruct 。
@PreDestroy:当对象实例将要被从容器当中删掉之前,要执行的回调方法要标注为PreDestroy
7. Compiler API
javac编译器可以把.java的源文件编译为.class文件,JDK 6的新特性Compiler API(JSR 199)也可以动态编译Java源文件。
public class CompilerApiTest{
public static void main(String[] args) throws Exception{
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager standardJavaFileManager = javaCompiler.getStandardFileManager(null,null,null);
Iterable extends JavaFileObject> javaFileObjects = standardJavaFileManager.getJavaFileObjects("C:\\Singer.java");
javaCompiler.getTask(null, standardJavaFileManager, null, null, null, javaFileObjects).call();
standardJavaFileManager.close();
}
}
运行结果:会在C目录生成Singer.class文件
8. 对脚本语言的支持(如: ruby, groovy, javascript)
JDK6增加了对脚本语言的支持(JSR 223),原理是将脚本语言编译成字节码,这样脚本语言也能享用Java平台的诸多优势,包括可移植性,安全等。JDK6实现包含了一个基于Mozilla Rhino的 脚本语言引擎,因此可以支持javascript,当然JDK也支持ruby等其他语言
public class JavaScriptTest{
public static void main(String[] args) throws Exception{
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
String script;
try {
script = "print('Hello')";
engine.eval(script);// 执行脚本
}catch (Exception e) {
e.printStackTrace();
}
}
}
//output
Hello
Java 7 新特性
1.switch 支持String字符串类型。
String singer = "jay";
switch (singer) {
case "jay" :
System.out.println("周杰伦");
break;
case "eason" :
System.out.println("陈奕迅");
break ;
default :
System.out.println("其他");
break ;
}
2.try-with-resources,资源自动关闭
JDK 7 之前:
BufferedReader br = new BufferedReader(new FileReader("d:七里香.txt"));
try {
return br.readLine();
} finally {
br.close();
}
JDK 7 之后:
/*
* 声明在try括号中的对象称为资源,在方法执行完毕后会被自动关闭
*/
try (BufferedReader br = new BufferedReader(new FileReader("d:七里香.txt")) {
return br.readLine();
}
3. 整数类型如(byte,short,int,long)能够用二进制来表示
//0b或者0B表示二进制
int a = 0b010;
int b = 0B010;
4. 数字常量支持下划线
int a = 11_11;//a的值为1111,下划线不影响实际值,提升可读性
5. 泛型实例化类型自动推断,即”<>”
JDK 7 之前:
Map> map = new HashMap>();
JDK 7之后:
//不须声明类型,自动根据前面<>推断其类型
Map> map = new HashMap<>();
6.一个catch中捕获多个异常类型,用(|)分隔开
JDK 7之前
try{
//do something
} catch (FirstException e) {
logger.error(e);
} catch (SecondException e) {
logger.error(ex);
}
JDk 7之后
try{
//do something
} catch (FirstException | SecondException e) {
logger.error(e);
}
7. 增强的文件系统
Java7 提供了全新的NIO2.0 API,方便文件管理的编码。如,可以在java.nio.file包下使用Path、Paths、Files、WatchService等常用类型。
Path path = Paths.get("C:\\jay\\七里香.txt"); //创建Path对象
byte[] bytes= Files.readAllBytes(path); //读取文件
System.out.println(path.getFileName()); //获取当前文件名称
System.out.println(path.toAbsolutePath()); // 获取文件绝对路径
System.out.println(new String(bytes, "utf-8"));
8. Fork/join 框架
Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
Fork/join计算1-1000累加值:
public class ForkJoinPoolTest {
private static final Integer DURATION_VALUE = 100;
static class ForkJoinSubTask extends RecursiveTask{
// 子任务开始计算的值
private Integer startValue;
// 子任务结束计算的值
private Integer endValue;
private ForkJoinSubTask(Integer startValue , Integer endValue) {
this.startValue = startValue;
this.endValue = endValue;
}
@Override
protected Integer compute() {
//小于一定值DURATION,才开始计算
if(endValue - startValue
System.out.println("执行子任务计算:开始值 = " + startValue + ";结束值 = " + endValue);
Integer totalValue = 0;
for (int index = this.startValue; index <= this.endValue; index++) {
totalValue += index;
}
return totalValue;
} else {
// 将任务拆分,拆分成两个任务
ForkJoinSubTask subTask1 = new ForkJoinSubTask(startValue, (startValue + endValue) / 2);
subTask1.fork();
ForkJoinSubTask subTask2 = new ForkJoinSubTask((startValue + endValue) / 2 + 1 , endValue);
subTask2.fork();
return subTask1.join() + subTask2.join();
}
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
// Fork/Join框架的线程池
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask taskFuture = pool.submit(new ForkJoinSubTask(1,1000));
Integer result = taskFuture.get();
System.out.println("累加结果是:" + result);
}
}
运行结果:
...
执行子任务计算:开始值 = 189;结束值 = 250
执行子任务计算:开始值 = 251;结束值 = 313
执行子任务计算:开始值 = 314;结束值 = 375
执行子任务计算:开始值 = 376;结束值 = 438
执行子任务计算:开始值 = 439;结束值 = 500
执行子任务计算:开始值 = 501;结束值 = 563
执行子任务计算:开始值 = 564;结束值 = 625
执行子任务计算:开始值 = 626;结束值 = 688
执行子任务计算:开始值 = 689;结束值 = 750
执行子任务计算:开始值 = 751;结束值 = 813
执行子任务计算:开始值 = 814;结束值 = 875
执行子任务计算:开始值 = 876;结束值 = 938
执行子任务计算:开始值 = 939;结束值 = 1000
累加结果是:500500
Java 8 新特性
1.lambada表达式
Lambda 允许把函数作为一个方法的参数,传递到方法中
语法格式:
(parameters) -> expression 或 (parameters) ->{ statements; }
代码示例:
Arrays.asList("jay", "Eason", "SHE").forEach(
( String singer ) -> System.out.print( singer + ",") );
2. 函数式接口
Lambda的设计者为了让现有的功能与Lambda表达式很好兼容,设计出函数式接口。函数式接口是指只有一个函数的接口,可以隐式转换为lambada表达式。
Java 8 提供了注解@FunctionalInterface,显示声明一个函数式接口。
java.lang.Runnable和java.util.concurrent.Callable是函数式接口的例子~
@FunctionalInterface
public interface Runnable{
public abstract void run();
}
3. 方法引用
方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。它与Lambda表达式配合使用,可以减少冗余代码,使代码更加简洁。
//利用函数式接口Consumer的accept方法实现打印,Lambda表达式如下
Consumer consumer = x -> System.out.println(x);
consumer.accept("jay");
//引用PrintStream类(也就是System.out的类型)的println方法,这就是方法引用
consumer = System.out::println;
consumer.accept("关注公众号捡田螺的小男孩");
4. 默认方法
默认方法就是一个在接口里面有了一个实现的方法。它允许将新方法添加到接口,但不强制实现了该接口的类必须实现新的方法。
public interface ISingerService {
// 默认方法
default void sing(){
System.out.println("唱歌");
}
void writeSong();
}
//JaySingerServiceImpl 不用强制实现ISingerService的默认sing()方法
public class JaySingerServiceImpl implements ISingerService {
@Override
public void writeSong() {
System.out.println("写了一首七里香");
}
}
5.Stream API
Stream API,支持对元素流进行函数式操作,它集成在Collections API 中,可以对集合进行批量操作。常用API:filter 筛选
map流映射
reduce 将流中的元素组合起来
collect 返回集合
sorted 排序
flatMap 流转换
limit返回指定流个数
distinct去除重复元素
public class Singer {
private String name;
private Integer songNum;
private Integer age;
...
}
List singerList = new ArrayList();
singerList.add(new Singer("jay", 11, 36));
singerList.add(new Singer("eason", 8, 31));
singerList.add(new Singer("JJ", 6, 29));
List singerNameList = singerList.stream()
.filter(singer -> singer.getAge() > 30) //筛选年龄大于30
.sorted(Comparator.comparing(Singer::getSongNum)) //根据歌曲数量排序
.map(Singer::getName) //提取歌手名字
.collect(Collectors.toList()); //转换为List
6. Optional
Java 8引入Optional类,用来解决NullPointerException。Optional代替if...else解决空指针问题,使代码更加简洁。
if...else 判空
Singer singer = getSingerById("666");
if (singer != null) {
String name = singer.getName();
System.out.println(name);
}
Optional的判空
Optional singer = Optional.ofNullable(getSingerById("666"));
singer.ifPresent(s -> System.out.println(s.getName()));
7. Date Time API
JDK 8之前的日期API处理存在非线程安全、时区处理麻烦等问题。Java 8 在 java.time包下提供了新的日期API,简化了日期的处理~
https://www.jianshu.com/c/4b55746a620d
https://www.jianshu.com/c/9f7e8aa0c70b
https://www.jianshu.com/c/f768a44f8056
https://www.jianshu.com/c/f1b0388322bf
https://www.jianshu.com/c/e4fb71e78e63
https://www.jianshu.com/c/411e6920ca9d
https://www.jianshu.com/c/ddb54eb56177
https://www.jianshu.com/c/992b8effa4cc
https://www.jianshu.com/c/e326b5e9a42d
https://www.jianshu.com/c/c1e31dc43f66
https://www.jianshu.com/c/456a77b4259e
https://www.jianshu.com/c/3fc2ffd5d2e9
https://www.jianshu.com/c/6d9c9db0f80f
https://www.jianshu.com/c/a1ff8ef3f23c
https://www.jianshu.com/c/f04f3d075de4
https://www.jianshu.com/c/a4a48c160129
https://www.jianshu.com/c/11feb44d2887
https://www.jianshu.com/c/f022683c3b6e
https://www.jianshu.com/c/19d2b6a26039
https://www.jianshu.com/c/2bd0382dace0
https://www.jianshu.com/c/861ca4486203
https://www.jianshu.com/c/14138baaa5ba
https://www.jianshu.com/c/d7976c9784da
https://www.jianshu.com/c/efd25b655fb6
https://www.jianshu.com/c/7dd50bde5f5b
https://www.jianshu.com/c/f96fdb1c565a
https://www.jianshu.com/c/a483510a2969
https://www.jianshu.com/c/08ce43a7d7e1
https://www.jianshu.com/c/bbae2d3eef64
https://www.jianshu.com/c/5a5b8168a77f
https://www.jianshu.com/c/b555aeedd8cc
https://www.jianshu.com/c/9a0f4f52b301
https://www.jianshu.com/c/f1f174de522e
https://www.jianshu.com/c/e3dace9dbfd6
https://www.jianshu.com/c/1d5c96575b0e
https://www.jianshu.com/c/bb32194260ae
https://www.jianshu.com/c/687b4feadcac
https://www.jianshu.com/c/84ea0c6d33ab
https://www.jianshu.com/c/35750f30a774
https://www.jianshu.com/c/5776dc3415a7
https://www.jianshu.com/c/0cb9fa5d47f0
https://www.jianshu.com/c/0c2615fb9d67
https://www.jianshu.com/c/44b1c3622029
https://www.jianshu.com/c/7ca14b323102
https://www.jianshu.com/c/45048d731052
https://www.jianshu.com/c/b1f62eda41a3
https://www.jianshu.com/c/1cc459b6fd9d
https://www.jianshu.com/c/57105a368cea
https://www.jianshu.com/c/371e09a8272f
https://www.jianshu.com/c/2b6e332837f1
https://www.jianshu.com/c/db06b5b81b07
https://www.jianshu.com/c/4137d0913fb3
https://www.jianshu.com/c/b903dc0eb4f3
https://www.jianshu.com/c/5ebcf0f18df1
https://www.jianshu.com/c/97f59813e81e
https://www.jianshu.com/c/b674e68dbec2
https://www.jianshu.com/c/e46a5c431ed5
https://www.jianshu.com/c/d14b222c17f2
https://www.jianshu.com/c/aa4d3dee9657
https://www.jianshu.com/c/9b86abae207a
https://www.jianshu.com/c/e669fefd4688
https://www.jianshu.com/c/ee6de19b4955
https://www.jianshu.com/c/13c33b674c22
https://www.jianshu.com/c/cc4da3d9da6a
https://www.jianshu.com/c/2f4473837e0e
https://www.jianshu.com/c/67e256888230
https://www.jianshu.com/c/adb53c7e95ab
https://www.jianshu.com/c/0e50a58299a0
https://www.jianshu.com/c/85fb1f579697
https://www.jianshu.com/c/d9c8f1e8fe72
https://www.jianshu.com/c/1a84ba1c856d
https://www.jianshu.com/c/3655ed211baf
https://www.jianshu.com/c/17c4639fd817
https://www.jianshu.com/c/b53076ed755c
https://www.jianshu.com/c/50275a568546
https://www.jianshu.com/c/b65b192eb3bc
https://www.jianshu.com/c/a2ba2dc8e24d
https://www.jianshu.com/c/e744626a7f78
https://www.jianshu.com/c/b36eaefc77f6
https://www.jianshu.com/c/9a6bc625280c
https://www.jianshu.com/c/a5028cbb0080
https://www.jianshu.com/c/0b8f08d1e9bc
https://www.jianshu.com/c/726f2b75af4c
https://www.jianshu.com/c/168782535136
https://www.jianshu.com/c/287305b143bb
https://www.jianshu.com/c/064852a29e7c
https://www.jianshu.com/c/753d3307ab88
https://www.jianshu.com/c/1ea438ccef8c
https://www.jianshu.com/c/572705034d28
https://www.jianshu.com/c/1498eb87fb6e
https://www.jianshu.com/c/cfa992afa3eb
https://www.jianshu.com/c/51e6d0b0b0c6
https://www.jianshu.com/c/9af9a406addf
https://www.jianshu.com/c/3b8b29d193c4
https://www.jianshu.com/c/ddb33836b155
https://www.jianshu.com/c/048681fd5a65
https://www.jianshu.com/c/732d1b15bb65
https://www.jianshu.com/c/6b7132a991a5
https://www.jianshu.com/c/8fb03bc9ac8b
https://www.jianshu.com/c/6dc0d1a8592c
https://www.jianshu.com/c/c6f816135d4f
https://www.jianshu.com/c/3caf4ebab5ea
https://www.jianshu.com/c/64b4e9316370
https://www.jianshu.com/c/fc049c344f3f
https://www.jianshu.com/c/7ff06adafc0b
https://www.jianshu.com/c/c6c3b3593624
https://www.jianshu.com/c/613e5d77d303
https://www.jianshu.com/c/47f229993a4a
https://www.jianshu.com/c/c6da4904d73c
https://www.jianshu.com/c/229e4d0882a6
https://www.jianshu.com/c/78581d2c3ac8
https://www.jianshu.com/c/b6a28fd58eca
https://www.jianshu.com/c/22780965d693
https://www.jianshu.com/c/c6665c70e622
https://www.jianshu.com/c/836a37a968f2
https://www.jianshu.com/c/563c09385d56
https://www.jianshu.com/c/1b1c63b2ebcb
https://www.jianshu.com/c/06b49b350058
https://www.jianshu.com/c/5a79708f1fe3
https://www.jianshu.com/c/22df1c697715
https://www.jianshu.com/c/59f2726696e4
https://www.jianshu.com/c/c67b7dcc1e38
https://www.jianshu.com/c/1de55bb32215
https://www.jianshu.com/c/995c536ce961
https://www.jianshu.com/c/e65e237a0226
https://www.jianshu.com/c/a5a7a759f606
https://www.jianshu.com/c/e575db7fdf1c
https://www.jianshu.com/c/847e52e25e77
https://www.jianshu.com/c/40d99778bb16
https://www.jianshu.com/c/8ac5351d126b
https://www.jianshu.com/c/d4bf24b1b986
https://www.jianshu.com/c/3fad296b0374
https://www.jianshu.com/c/9b62dd420587
https://www.jianshu.com/c/a990d9fa1898
https://www.jianshu.com/c/318a37759601
https://www.jianshu.com/c/508ef7046fbb
https://www.jianshu.com/c/9c12a019d7c9
https://www.jianshu.com/c/8379b69a915f
https://www.jianshu.com/c/5354000b5c47
https://www.jianshu.com/c/2c249cfcbceb
https://www.jianshu.com/c/df3efe82fdee
https://www.jianshu.com/c/d743484cff9c
https://www.jianshu.com/c/99e0515cf406
https://www.jianshu.com/c/1cd7952039b3
https://www.jianshu.com/c/0a22ce4f79f0
https://www.jianshu.com/c/9aca9fcfd125
https://www.jianshu.com/c/0b9dba186777
https://www.jianshu.com/c/7462a18d5159
https://www.jianshu.com/c/f652a2ebef5b
https://www.jianshu.com/c/358f3940d831
https://www.jianshu.com/c/19d2be4580b1
https://www.jianshu.com/c/e3814f1b6bd5
https://www.jianshu.com/c/aa5005aa351d
https://www.jianshu.com/c/670f82dcb3eb
https://www.jianshu.com/c/2b7442e9f48f
https://www.jianshu.com/c/681d135933ff
https://www.jianshu.com/c/a1446a3e59e3
https://www.jianshu.com/c/93e19129f216
https://www.jianshu.com/c/cd075a9825bf
https://www.jianshu.com/c/64481a713c9d
https://www.jianshu.com/c/2b8fb339c459
https://www.jianshu.com/c/cea72c5c21a7
https://www.jianshu.com/c/cbb9fdaca014
https://www.jianshu.com/c/f70b14a17e73
https://www.jianshu.com/c/f46f673ff750
https://www.jianshu.com/c/c30869c98c72
https://www.jianshu.com/c/d667fa1d005d
https://www.jianshu.com/c/caf1fa6c18b2
https://www.jianshu.com/c/b35091825010
https://www.jianshu.com/c/2f2f1bf033e2
https://www.jianshu.com/c/bebe74bfe2ec
https://www.jianshu.com/c/4dbb0e06f46d
https://www.jianshu.com/c/091904c9c07a
https://www.jianshu.com/c/15694c052f1f
https://www.jianshu.com/c/eb9379e802ad
https://www.jianshu.com/c/88fd65e59e08
https://www.jianshu.com/c/aa937441fa96
https://www.jianshu.com/c/1926f0ecfb67
https://www.jianshu.com/c/3395d839b6da
https://www.jianshu.com/c/ae6b8474c5dc
https://www.jianshu.com/c/305a11d6c344
https://www.jianshu.com/c/03b298ab2887
https://www.jianshu.com/c/9f9c05d0f217
https://www.jianshu.com/c/624a244f8eaf
https://www.jianshu.com/c/5bb90addf5b2
https://www.jianshu.com/c/9a3fbb4547a4
https://www.jianshu.com/c/335610400979
https://www.jianshu.com/c/0eb3f53d7144
https://www.jianshu.com/c/f46a836a4601
https://www.jianshu.com/c/12ff841ba64f
https://www.jianshu.com/c/4271bb7e6e64
https://www.jianshu.com/c/0b4be1f31237
https://www.jianshu.com/c/798300079f2e
https://www.jianshu.com/c/9a21cdcfd079
https://www.jianshu.com/c/21bc885caefb
https://www.jianshu.com/c/d21377cffbee
https://www.jianshu.com/c/ae6cf1677522
https://www.jianshu.com/c/4175e222dcdd
https://www.jianshu.com/c/45ff0b398838
https://www.jianshu.com/c/828443ca9ade