理解反射机制要了解静态编译和动态编译,静态编译时在程序运行之前编译时期就以及确定的,动态编译则可以才程序运行期间,使程序自己改变自己的行为模式或逻辑,具有高度的灵活性。典型的编程设计模式动态代理就是在运行时期完成的编译
Java反射机制有什么优缺点?
答:
优点:增强程序灵活性和可拓展性,可帮助程序进行解耦合,提高自身的适应能力
缺点:
1、 性能问题。
Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题。
2、安全限制。
使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射。
3、程序健壮性。
反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异。
什么是宏变量和宏替换?
答:引用用宏变量,系统会自动把宏变量替换成他所指向的地址的值
String nb = "finaltest"; String nb1 = "final"; String nb2 = "test"; final String nb11 = "final"; final String nb22 = "test"; String nb3 = "final" + "test"; String nb4 = nb1 + nb2; String nb5 = nb11 + nb22; System.out.println(nb == nb3); System.out.println(nb == nb4); System.out.println(nb == nb5); true false true nb定义了finaltest,nb3定义了 “final” + “test”,初始编译的时候nb3会确定初始值为finaltest(JVM在编译时会对字面量的字符串进行优化),因此初始值与nb相等,所以会把nb3引用的地址指向nb引用的地址,所以nb与nb3相等。 而nb11,nb22根据上面三条规则得知是宏变量,引用用宏变量,系统会自动把宏变量替换成他所指向的地址的值,所以nb11+nb22就会替换成finaltest,然后与nb3一样,这就是宏替换。
什么是逃逸分析?
答:在编程语言的编译优化原理中,分析指针动态范围的方法称之为逃逸分析。通俗一点讲,当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了逃逸。
而用来分析这种逃逸现象的方法,就称之为逃逸分析。全局变量赋值,方法返回值,实例引用传递。
参考文章https://blog.csdn.net/u014352080/article/details/93165603
什么是伪共享?有什么解决方案?
答:参考文章https://www.cnblogs.com/tong-yuan/p/FalseSharing.html
什么是多线程环境下的伪共享(false sharing)?
伪共享是多线程系统(每个处理器有自己的局部缓存)中一个众所周知的性能问题。伪共享发生在不同处理器上的线程对变量的修改依赖于相同的缓存行,如下图所示:
小知识点:
*1.*共享就是一个内存区域的数据被多个处理器访问,伪共享就是不是真的共享。
这里的共享这个概念是基于逻辑层面的。实际上伪共享与共享在cache line 上实际都是共享的。
*2.*CPU访问的数据都是从cache line 中读取的。如果cpu 在cache 中找不到需要的变量,则称缓存未命中。**
未命中时,需要通过总线从内存中读取进cache 中。每次读取的内存大小就是一个cache line 的大小。
3.****如果多个CPU访问的不同内存变量被装载到了同一个cache line 中,则从程序逻辑层上讲,并没有共享变量,
但实际上在cache line 上他们是共享访问的,这个就是典型的伪共享。
4.****伪共享与共享 在 cache line 的层面上必须都是共享的。多个CPU对共享内存的访问安全通过缓存一致性来保证。
*5*.伪共享问题很难被发现,因为线程可能访问完全不同的全局变量,内存中却碰巧在很相近的位置上。如其他诸多的并发问题,避免伪共享的最基本方式是仔细审查代码,根据缓存行来调整你的数据结构。
Java 8新增了哪些特性?
答:最核心的特性Lambda 表达式和函数式接口以及Stream API
Java 8中的Lambda表达式有什么作用?
答:Lambda 是一个匿名函数,可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递)。可以写出更加简洁、灵活的代码。作为一种更加紧凑的代码风格,使java的语言表达能力得到了提升。
Java 8中的Optional类有什么作用?
答:以解决程序中常见的NullPointerException异常问题
Java 8中的@Repeatable注解有什么作用?
答:@Repeatable可以用来指示某种类型的注解是可以重复添加的
Java 8中的方法引用是指什么?
答:方法引用,如果函数式接口以及有具体实现了可以直接引用该方法。语法为ClassName::MethodName || ObjectName::实例方法名称
Java 8中的Stream有什么作用?
答:提供了对集合计算的支持,集合负责存储而Stream负责计算。它用于操作数据源所产生的序列,例如复杂的查找、过滤映射数据等操作
Java 8中的函数式编程怎么用?
答:函数与其他数据类型一样,可以赋值给其他变量,也可以作为参数,也可以作为返回值。
代码简洁,开发快速
易于理解,降低风险
易于并行
延迟执行
如何获取一个Stream流对象?
答:
数组获取Stream:Arrays.stream(数组对象)
集合获取Stream:集合对象.stream()
值获取Stream:Stream.of(值...)
什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。