JDK的前世今生:细数 Java5 - 15 的那些经典特性,javaspringboot面试题

5. 泛型实例化类型自动推断,即”<>”

JDK 7 之前:

Map<String, List> map = new HashMap<String, List>();

JDK 7之后:

//不须声明类型,自动根据前面<>推断其类型

Map<String, List> 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 < DURATION_VALUE) {

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值