3. 请列举java ee的主要新特性_Java程序员必备基础:JDK 5-15都有哪些经典新特性...

Java 5 新特性e3fe5471fa72502058dfefde6c7a1f7a.png

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 新特性ccc409d6a10af01e947d386a006bd906.png

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 新特性c24f3f4d0cd204d6b35070a90d3c8099.png

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提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。ba66d8c1472d1341ae2f6eccf930e7f2.png

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 新特性35688f5833debe81ce1c2cb800c64b39.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值