当前位置:   article > 正文

【备战秋招冲击大厂】Java面试题系列—Java基础_error:(32,32) java: -source 1.7 中不支持 lambda 表达式

error:(32,32) java: -source 1.7 中不支持 lambda 表达式

1. Java的安全性

  • 使用引用取代了指针,指针的功能强大,但是也容易造成错误,如数组越界问题。
  • 拥有一套异常处理机制,使用关键字 throw、throws、try、catch、finally
  • 不用程序员显示控制内存释放,JVM 有垃圾回收机制
  • 强制类型转换需要符合一定规则
  • 字节码传输使用了加密机制
  • 运行环境提供保障机制:字节码校验器->类装载器->运行时内存布局->文件访问限制

2. Java三大特性

1、封装

  • 封装指的是属性私有化,根据需要提供setter和getter方法来访问属性。即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问级别。
  • 封装目的:增强安全性和简化编程,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员。

2、继承

  • 继承是指将多个相同的属性和方法提取出来,新建一个父类。Java中一个类只能继承一个父类,且只能继承访问权限非private的属性和方法。 子类可以重写父类中的方法,命名与父类中同名的属性。
  • 继承目的:代码复用。

3、多态

  • 多态可以分为两种:设计时多态和运行时多态。
  • 设计时多态:即重载,是指Java允许方法名相同而参数不同(返回值可以相同也可以不相同)。
  • 运行时多态:即重写,是指Java运行根据调用该方法的类型决定调用哪个方法。要求方法名、参数和返回值必须相同。
  • 多态目的:增加代码的灵活度。

3. 多态程序绑定

  • 定义:绑定指的是一个方法的调用与方法所在的类或对象(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定
  • 静态绑定(前期绑定):在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。在编译阶段,绑定的是类信息,即为定义的类的类型。针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法,只有final,static,private,重载方法(overloaded methods)和构造方法是静态绑定。所有的变量都是静态绑定。
  • 动态绑定(后期绑定):在运行时根据具体对象的类型进行绑定。发生在运行阶段,绑定的是对象信息。重写方法(overridden methods)使用的是动态绑定
  • 动态绑定的过程:
    1)虚拟机提取对象实际类型的方法表;
    2)虚拟机搜索方法签名;
    3)调用方法。

4. Java四种引用类型

  • 强引用:Java中默认声明的就是强引用,只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了
  • 软引用:软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
  • 弱引用:弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。(GC时发生)
  • 虚引用:虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,主要用来跟踪对象被垃圾回收的活动。

5. 不可变对象

  • 不可变对象:对象在创建完成后,不能再改变它的状态。即不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。
  • 不可变对象有什么好处?
    1)不可变对象可以提高String Pool(字符串常量池)的效率和安全性。如果你知道一个对象是不可变动,那么需要拷贝的对象的内容时就不用复制它本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存,效率也很好。二是对于其他引用同一个对象的其他变量也不会造成影响。
    2)不可变对象对于多线程是安全的,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他线程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况出现。

6. String

  • String是否可变?
        Java中String类就是对字符数组的封装。Jdk8中String类有两个成员变量char value[]和int hash,value是private final的,hash被private修饰,也就是说在String类内部,一旦初始化就不能被改变。所以可以认为String对象是不可变的。
  • String为什么要设计为不可变?
    java将String设成不可变最大的原因是效率和安全。
    1)字符串常量池的需要,只有字符串不可变时,字符串常量池才能实现。
    2)多线程安全
    3)字符串不变性保证了hash码的唯一性,因此可以放心的进行缓存,这也是一种性能优化手段,意味着不必每次都重新计算新的哈希码,使得字符串很适合作为 Map的键
    4)类加载器要用到字符串,不可变提供了安全性,以便类被正确地加载。
    5)String被许多的Java类(库)用来当做参数,例如网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。
  • String对象真的不可变吗?
    用反射,可以反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。

7. Java创建对象的4种方式

  • 使用new关键字:new关键字直接在堆内存上创建对象。
  • 反射:使用Class类的newInstance方法可以调用无参的构造器来创建对象,如果是有参构造器,则需要使用Class的forName方法和Constructor来进行对象的创建。
  • 使用Clone方法:调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。
  • 反序列化:一个对象实现了Serializable接口,就可以把对象写入到文件中,并通过读取文件来创建对象。

8. 反射

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。反射机制指的是程序在运行时能够获取自身的信息。在JAVA中,只要给定类的名字,那么就可以通过反射机制来获取类的所有信息。Java 的动态就体现在反射。通过反射我们可以实现动态装配,降低代码的耦合度;动态代理等。反射的过度使用会严重消耗系统资源。
    反射的实现主要借助以下四个类:Class:类的对象,Constructor:类的构造方法,Field:类中的属性对象,Method:类中的方法对象。

  • 反射的作用:
    1)可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型
    2)应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
    3)反射主要应用于类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

9. StringBuffer和StringBuilder

  • 相同点:StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。底层实现上的话,StringBuffer其实就是比StringBuilder多了Synchronized修饰符。
  • 区别:
    1)StringBuilder 的方法不是线程安全的(不能同步访问)
    2)StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
  • 小结:
    1)如果要操作少量的数据用 String;
    2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;
    3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。

10. java.lang.Object的常用方法

  • getClass() 获取类结构信息
  • toString() 把对象转变成字符串
  • hashCode() 获取哈希码<
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/529976
推荐阅读
相关标签
  

闽ICP备14008679号