java
java8 有哪些新特性?
特性:
- lambda 表达式。
- 函数式接口。
- 方法引用与构造器引用。
- Stream API。
- 接口的默认方法与构造方法。
- 新时期日期 API。
- 其他新特性。
优点:
- 速度更快
- 代码更少
- 强大的 Stream API
- 便于并行
- 最大化减少空指针异常(Optional)
深拷贝与浅拷贝?
在 Java 中,除了 基本数据类型之外,还存在 类的实例对象这个引用数据类型,而一般使用 “=”号做赋值操作的时候,对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际还是指向的同一个对象。
而浅拷贝和深拷贝就是在这个基础上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
流式处理,Stream API
1 | List<Integer> evens = new ArrayList<>(); |
1 | List<Integer> evens = nums.stream() |
Stream 操作将集合转换成一个流,filter()执行我们自定义的筛选处理,这里是通过 lambda 表达式筛选出所有偶数,最后我们通过 collect()对结果进行封装处理,并通过 Collectors.toList()指定其封装成为一个 List 集合返回。
java8 的流式处理极大的简化了对集合的操作,实际上不光是集合,包括数组,文件等,只要能够转化为流,我们就可以用流式处理,类似于我们写 sql 语句一样对其操作。java8 通过内部迭代实现对流的处理,一个流式处理可以分为 3 个部分:转换成流,中间操作,终端操作。
使用:
Java8 的 Stream API 使用 - 纪莫 - 博客园
Java8 新特性之三:Stream API - 无恨之都 - 博客园
性能:
- 对于简单操作,比如最简单的遍历,Stream 串行 API 性能明显差于显示迭代,但并行的 Stream API 能够发挥多核特性。
- 对于复杂操作,Stream API 串行的性能可以和手动实现的效果匹敌,在并行操作时,Stream API 性能远超手动实现。
场景:
- 对于简单操作推荐使用外部迭代手动实现。
- 对于复杂操作,推荐使用 Stream API。
- 在多核情况下,推荐使用 Stream API 发挥多核优势。
- 单核情况下不建议使用。
如果出于代码简洁性考虑,使用 Stream API 能够写出更短的代码。即使是从性能方面说,尽可能的使用 Stream API 也另外一个优势,那就是只要 Java Stream 类库做了升级优化,代码不用做任何修改就能享受到升级带来的好处。
向上转型与向下转型
父类引用可以指向子类对象
子类引用可以指向子类对象
父类引用可以指向父类对象
子类引用不可以指向父类对象
向上转型
将子类对象直接赋值给父类引用叫向上转型
向上转型会丢失子类的特性
向下转型
将父类引用指向的子类对象再次赋值给子类引用叫做向下转型
将子类引用指向父类对象时,会在编译期报异常,ClassCastException,类型转换异常