java

java8 有哪些新特性?

特性:

  1. lambda 表达式。
  2. 函数式接口。
  3. 方法引用与构造器引用。
  4. Stream API。
  5. 接口的默认方法与构造方法。
  6. 新时期日期 API。
  7. 其他新特性。

优点:

  1. 速度更快
  2. 代码更少
  3. 强大的 Stream API
  4. 便于并行
  5. 最大化减少空指针异常(Optional)

深拷贝与浅拷贝?

在 Java 中,除了 基本数据类型之外,还存在 类的实例对象这个引用数据类型,而一般使用 “=”号做赋值操作的时候,对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际还是指向的同一个对象。
而浅拷贝和深拷贝就是在这个基础上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。


流式处理,Stream API

1
2
3
4
5
6
List<Integer> evens = new ArrayList<>();
for (final Integer num : nums) {
if (num % 2 == 0) {
evens.add(num);
}
}
1
2
3
List<Integer> evens = nums.stream()
.filter(num -> num % 2 == 0)
.collect(Collectors.toList());

Stream 操作将集合转换成一个流,filter()执行我们自定义的筛选处理,这里是通过 lambda 表达式筛选出所有偶数,最后我们通过 collect()对结果进行封装处理,并通过 Collectors.toList()指定其封装成为一个 List 集合返回。
java8 的流式处理极大的简化了对集合的操作,实际上不光是集合,包括数组,文件等,只要能够转化为流,我们就可以用流式处理,类似于我们写 sql 语句一样对其操作。java8 通过内部迭代实现对流的处理,一个流式处理可以分为 3 个部分:转换成流,中间操作,终端操作。

使用:

Java8 的 Stream API 使用 - 纪莫 - 博客园
Java8 新特性之三:Stream API - 无恨之都 - 博客园

性能:

  1. 对于简单操作,比如最简单的遍历,Stream 串行 API 性能明显差于显示迭代,但并行的 Stream API 能够发挥多核特性。
  2. 对于复杂操作,Stream API 串行的性能可以和手动实现的效果匹敌,在并行操作时,Stream API 性能远超手动实现。

场景:

  1. 对于简单操作推荐使用外部迭代手动实现。
  2. 对于复杂操作,推荐使用 Stream API。
  3. 在多核情况下,推荐使用 Stream API 发挥多核优势。
  4. 单核情况下不建议使用。

如果出于代码简洁性考虑,使用 Stream API 能够写出更短的代码。即使是从性能方面说,尽可能的使用 Stream API 也另外一个优势,那就是只要 Java Stream 类库做了升级优化,代码不用做任何修改就能享受到升级带来的好处。


向上转型与向下转型

父类引用可以指向子类对象
子类引用可以指向子类对象
父类引用可以指向父类对象
子类引用不可以指向父类对象

向上转型

将子类对象直接赋值给父类引用叫向上转型
向上转型会丢失子类的特性

向下转型

将父类引用指向的子类对象再次赋值给子类引用叫做向下转型
将子类引用指向父类对象时,会在编译期报异常,ClassCastException,类型转换异常